基于FPGA的UART接口协议设计
一、PC终端概述
PC终端,Personal Computer 智能终端,通俗的讲,就是利用电脑GUI界面控制我们的外部硬件电路。
因此设计到了PC与外部硬件电路的通信接口。对于台式电脑、个人笔记本,最常用的接口就是USB接口、串口、并口、PS2接口、网口。在我们电子设计中的PC终端软件的通信,应用最多的就是串口、其次是USB接口、再就是网口。(对于现在大部分笔记本没有了串口,我们可以用USB专串口线来代替。)这三种接口速度和性质不同,各有千秋:
(1)电子产品中,很多低速的数据采集,一些点阵系统的配置,GPRS模块的调试等,都用串口来实现跟PC的通信。甚至一些单片机(宏晶STC)的配置都用串口实现通信。串口最高可以达到128000bps的速率,在低速场合下,完全能够实现与PC的通信,来满足我们各种要求,来实现对数据的实时处理。
(2)设计到高速的数据传输、视频图像传输等的,一般用USB接口来交换数据。比方说我们的硬盘、U盘、各种硬件下载器(USB BLUSTERO(∩_∩)O哈哈~)、以及实时图像采集、视频采集等,都是用USB接口来实现的。目前USB已经发展到了USB 3.0,但还是以USB 2.0为主,最高能够达到480Mbps(60MB/s)高速,足够的带宽满足我们对高速、海量数据的采集处理。
(3)最后就是网口的通信,一般网口用来上网传输数据,但是也可以用来硬件和PC之间的数据传输。一般网络,千兆的能力,NetFPGA,用FPGA实现的通信协议,早已不是梦想。近年来流行的网络摄像头,就是通过网络来传输(当然也有通过WiFi飞);现在超市、广场的超大真彩点阵是数据传输,由于数据量之大,一般采用网络传输,来达到显示的实时性。
最后,我们的PC终端软件,就是通过C++、MFC、C#等语言编写软件,对这些接口的驱动,来对数据的采集处理,从而达到用户预期的要求。本章中主要讲解FPGA硬件平台的UART、USB通信接口的软硬件设计,并且对Bingo的代码设计稍作分析,希望对你有用。
二、UART通信接口设计
1、UART通信协议
在UART通信协议中很重要的一个定义,就是“波特率”,即传输数据时的速率。波特率一般有以下这些:
对于UART数据传输的协议,如下所示。其中奇偶校验位与停止位不是必须的。而“起始位、资料位、停止位”则是必须的。一般资料位为8 bits。
位 |
定义 |
起始位 |
先发出一个逻辑”0”的信号,表示传输字符的开始。 |
资料位 |
紧接着起始位之后。资料位的个数可以是4、5、6、7、8等,构成一个字符。通常采用ASCII码。从最低位开始传送,靠时钟定位。 |
奇偶校验位 |
资料位加上这一位后,使得“1”的位数应为偶数(偶校验)或奇数(奇校验),以此来校验资料传送的正确性。 |
停止位 |
它是一个字符数据的结束标志。可以是1位、1.5位、2位的高电平。 |
空闲位 |
处于逻辑“1”状态,表示当前线路上没有资料传送。 |
具体的时序图如下所示。A-b为起始位,b-c为资料位,c-d为停止位。
2、UART硬件设计
3、UART Verilog设计
http://www.chinaaet.com/lib/detail.aspx?id=86809
http://www.chinaaet.com/lib/detail.aspx?id=86812
http://www.chinaaet.com/lib/detail.aspx?id=86813
对于基于FPGA的Verilog设计UART通信接口的代码分析,如下所示:
/*************************************************
* Module Name : clk_generator.v
* Tool versions : Quartus II 11.0
**************************************************/
//------------------------------------------
/************clk_smp = 16*clk_bps************
Freq_Word1 <= 32'd25770; Freq_Word1 <= 32'd412317; //300 bps
Freq_Word1 <= 32'd51540; Freq_Word2 <= 32'd824634; //600 bps
Freq_Word1 <= 32'd103079; Freq_Word2 <= 32'd1649267; //1200 bps
Freq_Word1 <= 32'd206158; Freq_Word2 <= 32'd3298535; //2400 bps
Freq_Word1 <= 32'd412317; Freq_Word2 <= 32'd6597070; //4800 bps
Freq_Word1 <= 32'd824634; Freq_Word2 <= 32'd13194140; //9600 bps
Freq_Word1 <= 32'd1649267; Freq_Word2 <= 32'd26388279; //19200 bps
Freq_Word1 <= 32'd3298535; Freq_Word2 <= 32'd52776558; //38400 bps
Freq_Word1 <= 32'd3693672; Freq_Word2 <= 32'd59098750; //43000 bps
Freq_Word1 <= 32'd4810363; Freq_Word2 <= 32'd76965814; //56000 bps
Freq_Word1 <= 32'd4947802; Freq_Word2 <= 32'd79164837; //57600 bps
Freq_Word1 <= 32'd9895605; Freq_Word2 <= 32'd158329674; //115200bps
Freq_Word1 <= 32'd10995116; Freq_Word2 <= 32'd175921860; //128000bps
Freq_Word1 <= 32'd21990233; Freq_Word2 <= 32'd351843721; //256000bps
*****************************************************/
//only want to generate beautiful clk for bsp and sample
always@(posedge clk or negedge rst_n)
bps_cnt1 <= bps_cnt1 + 32'd9895605;
bps_cnt2 <= bps_cnt2 + 32'd158329674;
//------------------------------------------
reg clk_bps_r0,clk_bps_r1,clk_bps_r2;
always@(posedge clk or negedge rst_n)
assign clk_bps = ~clk_bps_r2 & clk_bps_r1;
//------------------------------------------
//clk_smp sync receive bps generator
reg clk_smp_r0,clk_smp_r1,clk_smp_r2;
always@(posedge clk or negedge rst_n)
assign clk_smp = ~clk_smp_r2 & clk_smp_r1;
代码中Bingo设置了多个选项的bps,根据您的需要,可以直接修改代码,来达到自己的要求。本模块的功能主要功能是生成两个时钟:
a) clk_bps : UART TXD信号线数据发送的波特率
b) clk_smp: UART RXD信号线数据接受的采样速率,以对已波特率的16倍速度采样,捕获数据的中点,在数据最稳态读取数据,达到最大限制的稳定。
这部分代码比较简单,因为FPGA是主控,只要根据固定的时序给数据即可。Bingo设计了一个状态机来完成时序,状态机代码如下:
always@(posedge clk or negedge rst_n)
//-------------------------------------
//Capture the falling of data transfer over
always@(posedge clk or negedge rst_n)
assign txd_flag = txd_flag_r1 & ~txd_flag_r0;
always@(posedge clk or negedge rst_n)
if(smp_cnt == 4'd7) //8 clk_smp enable
3'd0: rxd_data[0] <= rxd_sync;
3'd1: rxd_data[1] <= rxd_sync;
3'd2: rxd_data[2] <= rxd_sync;
3'd3: rxd_data[3] <= rxd_sync;
3'd4: rxd_data[4] <= rxd_sync;
3'd5: rxd_data[5] <= rxd_sync;
3'd6: rxd_data[6] <= rxd_sync;
3'd7: rxd_data[7] <= rxd_sync;
4、USB代码测试图:
三、USB通信接口设计
1、USB通信协议
(1)USB1.0:1.5Mbps(192KB/s) 低速(Low-Speed) 500mA……1996年1月
(2)USB1.1:12Mbps(1.5MB/s) 全速(Full-Speed) 500mA……1998年9月
(3)USB2.0:480Mbps(60MB/s) 高速(High-Speed) 500mA……2000年4月
(4)USB3.0:5Gbps(640MB/s) 超速(Super-Speed) 900mA……200年11月
基于FPGA的UART接口协议设计相关推荐
- 基于FPGA的USB接口控制器设计(VHDL)(中)
今天给大侠带来基于 FPGA 的 USB 接口控制器设计(VHDL),由于篇幅较长,分三篇.今天带来第二篇,中篇,USB通信原理.USB 系统开发以及设计实例.话不多说,上货. 之前有关于 Veril ...
- 基于FPGA的USB接口控制器设计(VHDL)(上)
今天给大侠带来基于 FPGA 的 USB 接口控制器设计(VHDL),由于篇幅较长,分三篇.今天带来第一篇,上篇,USB 接口简介 以及 USB 体系结构.话不多说,上货. 之前有关于 Verilio ...
- 基于FPGA的SSI接口协议实现
基于FPGA的SSI接口协议实现 SSI 是一种主机和从机点对点的通信接口,其中从机可以是具有 SSI 协议的各种传感器,例如磁致伸缩位移传感器.编码器等. SSI协议采用主机主动式读取方式,从机根据 ...
- 基于FPGA的UART接口设计
一.顶层设计思路: UART即通用异步收发传输接口(Universal Asynchronous Receiver/Transmitter),简称串口,是一种常用的通信接口,其协议原理就不赘述了,不了 ...
- 基于FPGA实现UART接口设计(异步串行通信)
时间就是金钱,技术就是饭碗,每天学习,每天积累,做好现在,不担心未来,加油! 1 简介 通用异步收发传输器(Universal Asynchronous Receiver/Transmitter),通 ...
- 基于 FPGA 的 UART 控制器设计(VHDL)(下)
今天给大侠带来基于FPGA的 UART 控制器设计(VHDL)(下),由于篇幅较长,分三篇.今天带来第三篇,下篇,使用 FPGA 实现 UART.话不多说,上货. 之前有关于 Veriliog HDL ...
- CPLD/FPGA的UART接口设计之系统时钟(晶振)和波特率关系
UART(UniversalAsynchronous ReceiverTransmitter,通用异步收发器)是一种广泛使用的异步串行数据通信协议.目前大多数MCU.串口通信IC等芯片或模块均支持UA ...
- 基于FPGA的UART异步串行通信发送模块设计与实现
欢迎关注微信公众号"FPGA科技室",更多内容请关注 下一篇文请点击下列链接(接收模块设计) [基于FPGA的UART异步串行通信接收模块设计与实现] 本文发送模块: 在电子系统中 ...
- 基于FPGA的VGA接口设计(三)
关于VGA系列文章的所有链接: 基于FPGA的VGA接口设计(一) 基于FPGA的VGA接口设计(二) 基于FPGA的VGA接口设计(三) 结篇 在之前的文章中介绍了有关VGA的扫描方式.行场同步 ...
最新文章
- windows环境下pip安装python的包时候提示invalid syntax (转载CSDN)
- Metadata GC Threshold导致的full gc分析
- 视频云服务平台架构设计难点与趋势
- (转)java中对集合对象list的几种循环访问总结
- vb 通过php连接mysql数据库连接_vb如何mysql数据库连接
- 计算机网络学习笔记(25. Cookie技术)
- 升级Webwork2.2版本注意点
- 面向对象——类设计(六)——算法类
- arduino 上传项目出错_活动回顾 | 续报率80%的Arduino试听课,确定不来看看吗?
- 设计原则(6):开闭原则
- java如何编写屏幕保护程序_将Java App变为Windows屏幕保护程序
- ArcGIS三维资源收集帖
- Hive 统计连续天数
- 【计算机网络】链路层
- MySQL运行出错:Could not acquire management access for administration
- 浏览器提示的不安全到底是什么?
- 还在为QQ空间的大量广告而苦恼吗? 教你如何彻底的清除QQ空间内广告!!!
- 实例:用C#.NET手把手教你做微信公众号开发(6)--普通消息处理之视频、小视频
- 抖音搜索排名规则分析,抖音SEO矩阵系统开发部署
- 购物狂欢节?购物比惨节?
热门文章
- boost::program_options模块实现一个用户定义的类来解析 特定机制——不是默认使用的 iostream 操作的测试程序
- boost::king_ordering用法的测试程序
- GDCM:SCU功能的测试程序
- Boost:双图bimap的范围标准方式的测试程序
- ITK:使用二进制阈值对图像阈值
- ITK:计算两个索引之间的距离
- OpenCV脸部美化FaceBeautificator的实例(附完整代码)
- C语言quick sort快速排序的算法(附完整源码)
- OpenGL 地形LOD的镶嵌细分的用法
- OpenGL 镜面反射 IBL