基于FPGA的UART设计
- 格式:doc
- 大小:2.49 MB
- 文档页数:13
====Word行业资料分享--可编辑版本--双击可删====
第一章 设计要求
一、设计一个全双工UART电路,具体要求如下:
1)支持数据格式:起始位(1bit)+数据(8bit)+奇偶校验位(1bit)+终止位(1bit)
2)奇/偶校验可配置
3)可配置支持115200以下的常见波特率
4)支持115200以下的波特率自适应,自适应过程如下:
a. 复位后,UART首先接收输入,不断自动调整波特率,直到以一定波特率正确连续接收到3个bytes的0x55
b. 接着UART以此波特率连续发送3个bytes 0xaa
c. 之后两端以此波特率进行通信
d. 波特率自适应只在电路复位后进行一次,如欲再次自适应波特率应对电路再次复位
e. 波特率自适应过程中不能对UART的波特率作任何设置,自适应完成后可以对波特率作设置
5)自动计算校验位用于发送数据;对接收到的校验位和数据进行校验,发现错误应设置错误标志,并丢弃数据
6)对接收不正常数据(如无终止位、无校验位、数据位数不正确等)应能自动识别并设置错误标志、丢弃
二、设计工具:
1)所有电路采用VerilogHDL或原理图方法进行设计
2)在QuartusII下进行设计
3)综合和仿真可以采用其他工具,如综合可以采用Synplify,仿真可以采用ModelSim
4)目标器件采用与实验箱相同的器件
第二章 相关理论与技术
2.1 UART相关内容简介
FPGA(Field-Programmable Gate Array),即现场可编程门阵列,它是在PAL、GAL、CPLD等可编程器件的基础上进一步发展的产物。它是作为专用集成电路(ASIC)领域中的一种半定制电路而出现的,既解决了定制电路的不足,又克服了原有可编程器件门电路数有限的缺点。
FPGA采用了逻辑单元阵列LCA(Logic Cell Array)这样一个概念,内部包括可配置逻辑模块CLB(Configurable Logic Block)、输出输入模块IOB(Input Output Block)和内部连线(Interconnect)三个部分。
2.1.2 RS-232介绍
RS232接口,就是普通电脑后面那个串口。一般为9针的,也有25针的。是1970年由美国电子工业协会(EIA)联合贝尔系统、调制解调器厂家及计算机终端生产厂家共同制定
的用于串行通讯的标准。它的全名是“数据终端设备(DTE)和数据通讯设备(DCE)之间串行二进制数据交换接口技术标准”(RS-232C,其中C表示此标准修改了三次).标准中包括了电气和机械方面的规定.该标准规定采用一个25个脚的 DB25连接器,对连接器的每个引脚的信号内容加以规定,还对各种信号的电平加以规定.后来随着设备的不断改进,成了目前大家普遍见到的9脚。
在不使用传输控制信号的情况下,用3根线就可以传输了,9芯的是2收3发5地,25芯的是2发3收7地。两设备用RS232相连的时候为收——发,发——收,地——地。
硬件结构设计
UART处理的是并行数据转为串行信号和串行数据转为并行,但并不是简单的转换。分析UART的结构,可以看出UART主要由数据总线接口、控制逻辑接口、波特率发生器、发送逻辑====Word行业资料分享--可编辑版本--双击可删====
和结束逻辑等部分组成,各部分间的关系如图1所示。
图1 UART通信接口结构图
软件采用 Altera公司的 MAX+PLUSⅡ设计逻辑结构,设计的内容包括通用 I/O地址译码器、各个寄存器以及 UART核。UART核主要包括 3个部分:波特率发生器、数据发送部分和数据接收部分。 I/O地址译码器和 UART核使用硬件描述语言VHDL来编写实现。
软件采用 Altera公司的 MAX+PLUSⅡ设计逻辑结构,设计的内容包括通用 I/O地址译码器、各个寄存器以及 UART核。UART核主要包括 3个部分:波特率发生器、数据发送部分和数据接收部分。 I/O地址译码器和 UART核使用硬件描述语言VHDL来编写实现。
地。
第三章 课题详细设计与实现
3.1 UART的整体设计
一般UART通信通过两条信号线完成数据的全双工通信任务。其中,TxD是UART发送端,为输出;RxD是UART接收端,为输入。波特率发生器、接收器和发送器是UART的三个核心功能模块。我们所做的设计主要为数据接收模块。如图3所示的即为接收器的硬件连接示意图,数据从计算机的串口TxD端传送给FPGA的RxD端,最后由LED显示出数据。
我们采用状态机的方式来实现串口通讯功能,用一个接收状态寄存器state_rec来表示当前状态。空闲时state_rec=0,此时不断监测接收端口的电平,如果低电平连续保持两个时隙,则转向接受数据状态,state_rec的值从1-8跳转,接受8bit数据。如果低电平没有保持两个时隙,则重新回到空闲状态,state_rec=0。 当八位数据接收完毕,则跳转到停止状态,state_rec=9,此时无论接收端口电平高低,均在下一个状态周期跳转回空闲状态,准备接受====Word行业资料分享--可编辑版本--双击可删====
下一位数据。若在较复杂的环境下通讯,则可以考虑增加一个通讯失败状态,若检测到停止位为低电平,或者校验位不满足要求,则跳转到失败状态。
UART (Universal A synchronous Receiver Transmitter)协议是一种串行数据传输协议。UART允许在串行链路上进行全双工通信,在数据通信及控制系统中得到了广泛的应用。8250、N S16450等芯片都是常见的UART 器件,这类芯片具有多种功能,还有许多辅助模块(FIFO),但在实际应用中有时只需要使用UART的部分功能,因而会造成一定的资源浪费。UART的核心功能集成到FPGA/CPLD内部,就可以实现紧凑、稳定且可靠的UART 数据传输。
基本的UART通信只需要两条信号线( RxD ,TxD)就可以完成数据的全双工通信任务。TxD 是UART发送端,为输出;RxD是UART接收端,为输入。UART的基本特点是:在信号线上共有两种状态,分别用逻辑1 (高电平)和逻辑0(低电平)来区分。例如,在发送器空闲时,数据线保持在逻辑高电平状态,发送器是通过发送起始位来开始一个数据帧的传送,起始位使数据线处于逻辑0状态,提示接收器数据传输即将开始 。接着发送数据位,数据位一般为8位一个字节的数据 (也有5位、6位或7位的情况) ,低位 (LSB ) 在前,高位(MSB)在后。然后发送校验位 ,校验位一般用来判断传输的数据位有无错误 ,一般是奇偶校验。在使用中,该位常取消。停止位在最后 ,用以标识数据传送的结束 ,它对应于逻辑1状态 。
UART的帧格式包括起始位(start bit,低电平、5~8位数据位(data bits)、校验位 ( parity
bit,可选 )和停止位( stopbit,位数可为1、1. 5、2 位 )。这种格式是由起始位和停止位来实现字符的同步,如图1所示。
图 4 UART的帧格式
3.2 UART 的实现
比较复杂的数字电子系统的设计往往采用自顶向下 ( Top -Down)的方法 ,即首先把设计任务划分成几个模块 ,然后分模块进行设计。
本文所介绍的UART串行通讯模块由3个子模块组成:波特率发生器、接收模块和发送模块,如图 2所示。所以对UART 通讯模块的实现就是对组成UART的三个子模块(即:波特率发生器、接收模块及发送模块) 的实现。波特率发生器专门产生一个本地时钟信号来控制 UART的接收与发送;UART接收模块的用途是接收RxD端的串行信号 ,并将其转化为并行数据;UART发送模块的用途是将准备输出的并行数据按照基本UART帧格式转为串行数据从TxD 端串行输出 。
图5 UART的三个子模块
波特率发生器模块的实现
1.波特率发生器模块的实现原理 。 时钟 LE计算机的串口
TxD CLK D11~FPGA
RxD
图3硬件连接示意图 ====Word行业资料分享--可编辑版本--双击可删====
波特率发生器实际上就是分频器,可以根据给定的系统时钟频率 (晶振时钟 ) 和要求的波特率算出波特率分频因子 ,把算出的波特率分频因子作为分频器的分频系数。假设系统的时钟频率为10MHz,而要求的波特率为9600bp s, 因 此要设计分频模块, 把10MHz的时钟脉冲变为9600Hz的时钟脉冲。故设要求的波特率因子为 M ,则1042960010HZMHZM
2.波特率发生器模块实现的流程。
波特率发生器模块实现的流程如图6所示 。
波特率发生器模块实现的源代码 。
Module CNT (CLK,DIV_CLK, reset);
input CLK, reset; //输入信号:时钟信号 CLK与复位信号reset
reg [10: 0 ]H; //计数器 H,用来记录输入时钟信号的跳变数
reg num; //寄存器num ,用来存放将要输出的电平信号
output DIV_CLK; //输出信号
always @ (posedge CLK or posedge reset)
begin
if ( reset) //复位信号到来 ,进行模块初始化
begin
H < = 0;
Num<=0;
End
Else
if (H = = 1041) / /当计数器计数值为1041 时 ,计数器清0,准备进行新一次的计数
H < = 0;
else
begin
if (H < 521) //当计数器的值小于521时 ,输出为低电平
num < = 0;
else //当计数器的值大于521时 ,输出为高电平
num < = 1;
H < = H + 1;
end
end
assign DIV_CLK = num;
endmodule
3.波特率发生器模块实现的仿真结果。
波特率发生器模块实现的仿真结果如图 7所示
图6 波特率发生器模块实现的流程
图7
3.4接收模块的实现
1.接收模块的实现原理