FPGA的UART完整设计
关于以FPGA为基础的UART控制器设计方案详解
关于以FPGA为基础的UART控制器设计方案详解通用异步收发器(UART,Universa lA synchronousRece iver Transm itter)是一种应用广泛的短距离串行传输接口,具有传输线少、成本低、可靠性高等优点。
8250、8251等都是常见的UART 接口芯片,但专用芯片一般引脚较多,内含许多辅助模块和一些辅助功能,在实际使用时往往用不到这些功能,基本的UART 通信只需要接收和发送两条信号线,接收与发送是全双工形式,因此若采用UART 专用芯片,将会使电路变得复杂,PCB面积增大,从而导致成本增加,系统的稳定性和可靠性降低。
由于FPGA 的功能日益强大,开发周期短、可重复编程等优点也越来越明显,可以在FPGA 芯片上集成UART 功能模块,从而简化电路,缩小PCB 面积,提高系统可靠性。
此外,基于FPGA 的设计具有很高的灵活性,可以方便地进行升级和移植。
1、UART 控制器的FPGA实现异步收发器的顶层模块由波特率发生器、UART 接收器和UART发送器构成。
UART 发送器的用途是将准备输出的并行数据按照基本UART 帧格式转为TXD 信号串行输出; UART 接收器接收RXD 串行信号,并将其转化为并行数据,但串并转换的时钟同发送器一样处理,收发设备间的时钟是会累计的,会导致接收数据不正确,波特率发生器就是专门产生一个远远高于波特率的本地时钟信号对输入RXD 不断采样,以不断地让接收器与发送器保持同步。
本设计主要分为波特率发生器模块、发送模块和接收模块,采用的芯片为康欣公司的KX _7C5系列芯片,其具体型号为EP2C5T144,具备4608个逻辑宏单元、两个锁相环,约20万门、约12万RAM bi.t 具体实现方法如下:1. 1、波特率控制器波特率控制可有多种方法实现,常用计数器分频,或利用片内锁相环控制,分频较为简单,但对输入频率有要求,分频后的频率必须在该波特率下频率偏差允许范围内,设定较好的输入频率值,可解决此问题,这样可较少消耗片内资源,锁相环技术虽然对输入频率没有过高要求,但定制内部锁相环,必然耗费较多的片内资源,本设计出于对片内资源的考虑,采用了分频方法实现波特率控制器。
FPGA的UART完整设计说明
第三章UART设计3.1 UART的帧格式在UART 中,数据位是以字符为传送单位,数据的前、后要有起始位、停止位,另外可以在停止位的前面加上一个比特(bit)的校验位。
其帧格式如图所示。
数据位起始位D0 D1 D2 D3 ——————D7 校验位停止位以9600波特率接收或发送,每一位时间为1/9600秒,或48MHZ晶振5000次计数图3_1数据帧格式文章通过分析UART的功能,利用有限状态机来描述UART核心控制逻辑的方法,将其核心功能集成,从而使整个设计更加稳定、可靠。
基本的UART 通信只需要两条信号线就可以完成数据的相互通信。
UART的功能模块如图3_2所示。
波特发生器Uart控制器接收模块发送模块对象模块图3_2UART的功能模块图3.2 UART模块在大规模电路的设计中,广泛采用层次化,结构化的设计方法。
它将一个完整的硬件设计任务从系统级开始,划分为若干个可操作的模块,编制出相应的模型并进行仿真验证,最后在系统级上进行组合。
这样在提高设计效率的同时又提高了设计质量,是目前复杂数字系统实现的主要手段,也是本文设计思想的基础。
其系统模块可划分为4个部分,如波特发生器,控制器,接收器,发送器,如图3-3所示:read sendclear_checkread sendClr3 clr4 ks cs Data_in Data_out clearRead_enable send_enablecounters countersreset Counters(control)stateT1 clk_enableClk_clearClk(波特发生器)clk图3-3uart结构图3.2.1主要引脚功能介绍Read:串行输入send:串行输出Data_in:并行输入data_out:并行输出Cs:通知cpu接收数据位ks:通知cpu发送准备位Reset:重启输入state:uart状态输入Clk:48M时钟输入3.2.2UART主体程序`timescale 1ns/1nsmodule gs_opt(input wire read,input wire clk,input wire reset,input wire state,input wire [7:0] dat_in,output wire send,output wire cs,output wire ks,output wire [7:0] dat_out);wire send_enable;wire read_enable;wire clk_enable3;wire clk_enable4;wire clear3 ;wire clear4 ;wire clk_enable;wire [7:0] counters;wire clear ;wire t1;/*read,send,cs,ks,reset,state,clk,dat_in,dat_out);//module uart(read,send,cs,ks,reset,state,clk,dat_in,dat_out); input read,clk,reset,state;//read为串行输入,clk为时钟输入50MHZ,reset为重启键input[7:0] dat_in;//并行数据输入output send,cs,ks;//send为串行输出,cs为通知cpu接收数据位,ks为发送准备位output[7:0] dat_out;//并行数据输出wire clear,clk_enable,read_enable,clear3,send_enable,clear4,t1; wire[7:0] counters,dat_in;*/rxd u1 (.dat_out (dat_out) ,.cs (cs) ,.read (read) ,.reset (reset) ,.clk_enable3 (clk_enable3) ,.clk (clk) ,.read_enable (read_enable) ,.clear3 (clear3) ,.counters (counters)); //接收数据moduletxd u2 (.dat_in (dat_in),.ks (ks),.send (send),.reset (reset),.clk_enable4 (clk_enable4),.clk (clk),.send_enable (send_enable),.clear4 (clear4),.counters( counters));//发送数据moduleclk_bau u3 (.clk(clk) ,.t1 (t1),.clk_enable (clk_enable)); //时钟计数器模块ctrl u4(.read_enable (read_enable) ,.send_enable (send_enable),.clk (clk),.state (state),.t1 (t1),.read (read ),.counters (counters),.reset (reset ),.clear (clear));check_cle u5 (.state (state),.clear3 (clear3),.clear4 (clear4),.clear (clear),.clk_enable3 (clk_enable3),.clk_enable4 (clk_enable4),.clk_enable (clk_enable));endmodule////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////3.3UART发送模块3.3.1UART的数据发送服务发送器实现的功能是将输入的8位并行数据变为串行数据,同时在数据头部加起始位,在数据位尾部加奇偶校验位和停止位。
基于FPGA的UART模块设计
编号基于FPGA的UART模块设计与实现Design and Realization of UART based onFPGA学生姓名周大勇专业控制科学与工程学号S*********指导教师杨晓慧学院电子信息工程学院二〇一三年六月摘要UART因其可靠性高,传输距离远,线路简单,同时UART作为RS232协议的控制接口,从而成为比较广泛的串行数据通信电路,而现在大部分集成电路通信用的UART芯片,存在成本高,电路复杂,移植性较差等缺点,本文提出了一种将UART的功能集成在FPGA芯片中,可使整个系统更为灵活、紧凑,减小整个电路的体积,提高系统的可靠性和稳定性。
本模块功能全部基于verilogHDL硬件描述语言。
关键词:FPGA, UART ,verilogHDL ,RS232ABSTRACTUART, because of its high reliability, long transmission distance and the simple line, moreover mainly used in communication between device with RS232 interface. Thus it is becoming more extensive serial data communication circuit. But now most of the integrated UART chips used in communications, have faults of high cost and poor portability. The circuit of the chip is complex. This paper presents a method that UART function will be integrated in FPGA chip, It can makesystem more compact, flexible, reliable and stable. All functions of module are based on verilogHDL hardware description language.Keywords:FPGA, UART, verilogHDL, RS232目录摘要 (I)ABSTRACT .................................................................................................................................. I I 目录...................................................................................................................................... I II 第一章绪论. (1)第二章UART 简介 (2)第三章UART功能设计 (3)3.1 波特率发生模块 (3)3.2 波特率接收模块 (5)3.3 UART发送模块 (8)第四章顶层电路及实验数据 (11)第五章结论 (12)致谢 (13)参考文献 (14)第一章绪论通用异步收发器(universal asynchronous receiver transmitter, UART)尽管自20世纪70年代就已出现,但因其简单可靠,目前仍是一种使用广泛的串行通信接口。
基于FPGA的UART接口设计
3.UART 实现方案
UART 模 块 的 整 体 结 构 图 如 图 2 所 示 。 可 以 看 出 ,UART 的整体功能是以 UART 内核模块 为 核 心 , 和 其 它 各 种 模 块 进
行连接相互协同工作实现的 , 而 UART 内 核 模 块 是 整 个 设 计 的核心,也是整个设计中最为复杂的模块。
并行接口和串行接口串行通信成本更低适用范围更广更适合接口电路的设串行通信分为两种类型一种叫同步通信另一种叫异步通信采用同步通信时将许多字符组成一个信息组这样字符可以一个接一个地传输但是在每组信息的开始要加上同步字符在没有信息要传输时还要填上空字符因为同步传输不允许有间隙采用异步通信时字符之间的传输间隔是任意的所以每个字符的前后都要用一些位数来作为分隔位2uart通信原理uart不仅辅助处理器与外部设备之间的通信同时uart还是一种串行通信方式数据在传输过程中是通过一位一位进行传输来实现的uart功能包括微处理器接口用于数据传输的缓冲器帧产生奇偶校验并串转换等基本的uart通信只需要两条信号线txdrxd就可以完成数据的相互通信接收和发送是全双工方式txdrxd分别是uart的发送接收端在信号线上共有种状态可分别用逻辑1高电平和逻辑低电平来区分在发送器空闲的时候数据线应保持高电平状态发送器是通过发送起始位开始以停止位结束的方式传送字符字符之间没有固定的时间间隔要求每一个字符的前面都有一位起始位字符本身由位数据位组成然后是一位校验位最后是停止位停止位后面是不定长度的空闲位uart的帧格式如图uart的帧格式3uart实现方案uart模块的整体结构图如图所示可以看出uart的整体功能是以uart内核模块为核心和其它各种模块进行连接相互协同工作实现的uart内核模块是整个设计的核心也是整个设计中最为复杂的模块cpuuart内核模块提供的cpu接口就是uart这些端口可以分为两组
基于FPGA的UART设计与实现
基于FPGA的UART设计与实现0 引言通用异步收发器(Universal Asynchronous Receiver/Transmitter,UART)可以和各种标准串行接口,如RS 232 和RS 485 等进行全双工异步通信,具有传输距离远、成本低、可靠性高等优点。
一般UART 由专用芯片如8250,16450 来实现,但专用芯片引脚都较多,内含许多辅助功能,在实际使用时往往只需要用到UART 的基本功能,使用专用芯片会造成资源浪费和成本提高。
一般而言UART 和外界通信只需要两条信号线RXD 和TXD,其中RXD 是UART 的接收端,TXD 是UART 的发送端,接收与发送是全双工形式。
由于可编程逻辑器件技术的快速发展,FPGA 的功能日益强大,其开发周期短、可重复编程的优点也越来越明显,在FPGA 芯片上集成UART 功能模块并和其他模块组合可以很方便地实现一个能与其他设备进行串行通信的片上系统。
1 UART 功能设计1.1 UART 的工作原理异步通信时,UART 发送/接收数据的传输格式如图1 所示,一个字符单位由开始位、数据位、停止位组成。
异步通信的一帧传输经历以下步骤:(1)无传输。
发送方连续发送信号,处于信息“1”状态。
(2)起始传输。
发送方在任何时刻将传号变成空号,即“1”跳变到“O”,并持续1 位时间表明发送方开始传输数据。
而同时,接收方收到空号后,开始与发送方同步,并期望收到随后的数据。
(3)奇偶传输。
数据传输之后是可供选择的奇偶位发送或接收。
(4)停止传输。
最后是发送或接收的停止位,其状态恒为“1”。
发送或接收一个完整的字节信息,首先是一个作为起始位的逻辑“0”位,接着是8 个数据位,然后是停止位逻辑“1”位,数据线空闲时为高或“1”状态。
起始位和停止位的作用是使接收器能把局部时钟与每个新开始接收的字符再同步。
异步通信没有可参照的时钟信号,发送器可以随时发送。
基于FPGA的UART设计
一、题目基于FPGA的UART设计二、设计要求1)支持数据格式:起始位(1bit)+数据(8bit)+奇偶校验位(1bit)+终止位(1bit)2)奇/偶校验可配置3)可配置支持115200以下的常见波特率4)支持115200以下的波特率自适应,自适应过程如下:a.复位后,UART首先接收输入,不断自动调整波特率,直到以一定波特率正确连续接收到3个bytes的0x55b.接着UART以此波特率连续发送3个bytes 0xaac.之后两端以此波特率进行通信d.波特率自适应只在电路复位后进行一次,如欲再次自适应波特率应对电路再次复位e.波特率自适应过程中不能对UART的波特率作任何设置,自适应完成后可以对波特率作设置5)自动计算校验位用于发送数据;对接收到的校验位和数据进行校验,发现错误应设置错误标志,并丢弃数据6)对接收不正常数据(如无终止位、无校验位、数据位数不正确等)应能自动识别并设置错误标志、丢弃三、UART 的工作原理异步通信时,UART发送/接收数据的传输格式如图1所示,一个字符单位由开始位、数据位、停止位组成。
异步通信的一帧传输经历以下步骤:(1)无传输。
发送方连续发送信号,处于信息“1”状态。
(2)起始传输。
发送方在任何时刻将传号变成空号,即“1”跳变到“0”,并持续1位时间表明发送方开始传输数据。
而同时,接收方收到空号后,开始与发送方同步,并期望收到随后的数据。
(3)奇偶传输。
数据传输之后是可供选择的奇偶位发送或接收。
(4)停止传输。
最后是发送或接收的停止位,其状态恒为“1”。
发送或接收一个完整的字节信息,首先是一个作为起始位的逻辑“0”位,接着是8个数据位,然后是停止位逻辑“1”位,数据线空闲时为高或“1”状态。
起始位和停止位的作用是使接收器能把局部时钟与每个新开始接收的字符再同步。
异步通信没有可参照的时钟信号,发送器可以随时发送数据,任何时刻串行数据到来时,接收器必须准确地发现起始位下降沿的出现时间,从而正确采样数据。
基于FPGA的UART串口接收模块设计
UART串口接收模块设计实验目标:实现FPGA接收其他设备通过UART协议发送过来的数据知识点:1、U RAT通信协议工业环境下数据接收实现。
2、I n system sources and probes editor ISSP)调试工具的使用。
UART发送端发送一个字节数据时序图:采集中间时刻时的数据即可,如下图所示但是在工业应用中,往往有非常强的电磁干扰,只采样一次就作为该数据的电平判定,是不保险的,有可能恰好采集到被干扰的信号而导致结果出错,因此需要使用多次采样求概率的方式进行。
以下为改进型的单bit数据接收方式示意图:BI + 1 - 1丨丨「i |丨11 口「「「i「11 丨im i [1 2 3 4 5 6 7 8 9 10 11 12 1314 1516在这张图中,将每一位数据又平均分成了16小段,对于Bit_x这一位数据,考虑到数据在刚刚发生变化和即将发生变化的这一时期,数据极有可能不稳定的(用红色标出的两段),在这两个时间段采集数据,很有可能得到错误的结果,因此这两段时间的电平无效,采集时直接忽略。
而中间这一时间段(用绿色标出),数据本身是比较稳定的,一般都代表了正确的结果。
但是也不排除该段数据受强 电磁干扰而出现错误的电平脉冲, 因此对这一段电平,进行多次采样,并求高低 电平发生的概率,6次采集结果中,取出现次数多的电平作为采样结果。
例如, 采样6次的结果分别为1/1/1/1/0/1/,贝U 取电平结果为1,若为0/0/1/0/0/0,,贝U 取 电平结果为0,当6次采样结果中1和0各占一半(各3次),则可判断当前通 信线路环境非常恶劣,数据不具有可靠性。
串口发送模块包含两个主要组件:1、 起始位检测进程(低电平,下降沿)2、 波特率产生模块3、 数据接收模块串口接收模块整体结构图:Data_Byte[7:0] Rx_Done=Rst n波特率时钟计算:---------------- ►Baud_Set[2:0] ----- -------- ►ClkModelsim 仿真图:• 在testbench 文件中我们为设计输入了假定的信号, 在仿真图中我们可以看到 data_byte_r 在Rx_done 标志位产生的时候成功的将仿真数据 data_byte_t 接收到其中。
基于FPGA的UART通信模块设计_20111002
一基于FPGA的UART通信模块设计1. UART简介(1)UART(Universal Asynchronous Receiver Transmitter通用异步收发器)是一种应用广泛的短距离串行传输接口。
常常用于短距离、低速、低成本的通讯中。
8250、8251、NS16450等芯片都是常见的UART器件。
(2)基本的UART通信只需要两条信号线(RXD、TXD)就可以完成数据的相互通信,接收与发送是全双工形式。
TXD是UART发送端,为输出;RXD是UART接收端,为输入。
2. UART的基本特点是:(1) 在信号线上共有两种状态,可分别用逻辑1(高电平)和逻辑0(低电平)来区分。
在发送器空闲时,数据线应该保持在逻辑高电平状态。
(2) 起始位(Start Bit):发送器是通过发送起始位而开始一个字符传送,起始位使数据线处于逻辑0状态,提示接受器数据传输即将开始。
(3) 数据位(Data Bits):起始位之后就是传送数据位。
数据位一般为8位一个字节的数据(也有6位、7位的情况),低位(LSB)在前,高位(MSB)在后。
(4) 校验位(parity Bit):可以认为是一个特殊的数据位。
校验位一般用来判断接收的数据位有无错误,一般是奇偶校验。
在使用中,该位常常取消。
(5) 停止位:停止位在最后,用以标志一个字符传送的结束,它对应于逻辑1状态。
(6) 位时间:即每个位的时间宽度。
起始位、数据位、校验位的位宽度是一致的,停止位有0.5位、1位、1.5位格式,一般为1位。
(7) 帧:从起始位开始到停止位结束的时间间隔称之为一帧。
(8) 波特率:UART的传送速率,用于说明数据传送的快慢。
在串行通信中,数据是按位进行传送的,因此传送速率用每秒钟传送数据位的数目来表示,称之为波特率。
如波特率9600=9600bps(位/秒)。
3. FPGA UART系统组成FPGA UART由三个子模块组成:波特率发生器;接收模块;发送模块;包含四个模块:顶层模块,波特率发生器,UART接收器,UART发送器(1)顶层模块(1)异步收发器的顶层模块由波特率发生器、UART接收器和UART发送器构成。
基于FPGA的UART通信接口电路设计
率发 生 器 、IO 接 口 、 A T发 送 子 模 块 、 信 校 验 FF U R 通 模块 , 场试验 表 明 了该 接 口电路 具有 良好 的实用性 现
及可 靠性 。
1 功 能设计
1 1 过 采 样 流 程 .
一
不 够灵 活 , 数据 位数 固定 、 信 的波 特率 一般 限制 在 通 几 个 固定 的数值 , 可扩 展性 较小 。 FG P A是 在传 统 P L、A A G L等 可 编程 器 件 的基 础 上 进一 步发 展 的产 物 , 使 用 非 常 灵 活 , 其 同一 片 F — P G A通 过 不 同 的 编 程 数 据 可 以 产 生 不 同 的 电路 功 能 j 。随着 F G P A技 术 的 突 飞 猛 进 , 在 通 信 系 其
目 , 国的煤矿设备 自动化程度不断提高 , 前 我 井
下作 业对 信号 传 输 的要 求 也 愈 趋 严 格 。本 文 研究 的
通用 串行 收发 器 ( nvra ay crnu eevrad u iesl snho o srci n e
需求 建 立 自己 的 高层 通 信 协 议 。本 文使 用 F G 来 PA 设计 满 足矿 井 通 信 的 R 22接 口电路 。使 用 F G S3 PA
个U R A T一 般 包 括 发 送 器 和 接 收 器 两 部 分 。
UR A T发 送 器 的主要 功能是 读 入并 行 的待 发送 数 据 , 然 后通 过移 位 寄存 器 , 以一 定 的 波特 率 , 数 据 一 位 将 位地 串行移 出 ; 收器的 主要 功能则 是 串行 读人 接 收 接
tnmtrU R ) r s ie, A T 可通 过 串行 线 传输 并 行 数 据 , 本 a t 其 质功 能是 作为控 制 器和 串行设 备 问 的编码转 换装 置 , 在基 于 R 2 2 R 4 5等标 准协 议 的通信 系 统 中广泛 S3 、 S8 应用 ¨ J非常 适 合 矿 井 通 信 系 统 。常 用 的单 片 机 、 , D P控 制器 等一 般都 集成 有专 用 的 U R S A T外 设 , 大 极 地方便 了基于 R 22等 协议 的通 信 系统 设 计 。但 这 S3
FPGA的UART完整设计
FPGA的UART完整设计FPGA(现场可编程门阵列)是一种可编程逻辑设备,可以用于实现各种数字系统。
其中一个常见的应用是实现串行通信接口,如UART(通用异步收发器)。
UART是一种用于串行数据传输的通信协议,常用于连接计算机和外部设备(如传感器、显示器等)。
UART通信有两个关键部分:发送和接收。
在FPGA中,我们可以使用电平转换器、计数器和状态机等模块来设计和实现UART。
首先,我们需要设计发送模块。
发送模块的任务是将数据从FPGA发送到外部设备。
以下是发送模块的设计步骤:1.配置串行通信参数:确定波特率、校验位和停止位等参数。
2.设计数据缓冲区:创建一个FIFO(先进先出)缓冲区,用于存储要发送的数据。
3.生成波特率时钟:使用计数器和时钟分频器来生成适当速率的时钟信号。
4.串行化数据:将数据从缓冲区读取,并将其转换为串行比特流。
5.加入校验位和停止位:根据配置的参数,在数据的末尾添加校验位和停止位。
6.发送数据:将串行的比特流发送到外部设备。
接下来,我们需要设计接收模块。
接收模块的任务是从外部设备接收数据并传输到FPGA。
以下是接收模块的设计步骤:1.配置串行通信参数:确定波特率、校验位和停止位等参数,与发送模块保持一致。
2.生成波特率时钟:使用计数器和时钟分频器来生成适当速率的时钟信号。
3.接收数据:从外部设备接收串行比特流。
4.分析校验位和停止位:验证接收到的数据的校验位和停止位是否正确。
5.并行化数据:将串行比特流转换为并行数据,并存储到接收缓冲区中。
6.处理接收到的数据:根据串行通信协议,处理接收到的数据。
在设计中,需要考虑以下事项:1.时钟同步:确保发送端和接收端使用相同的时钟源,并进行合适的时序调整,以保持数据的稳定性和正确性。
2.缓冲区管理:使用FIFO缓冲区来处理发送和接收的数据,以防止数据丢失和冲突。
3.错误处理:根据串行通信协议,实现适当的错误检测和纠正机制,以确保数据的完整性和正确性。
基于FPGA的UART通信接口电路设计
基于FPGA的UART通信接口电路设计张蕾【摘要】随着煤矿设备自动化程度的不断提高,对信号的传输也提出了越来越高的要求.本文设计了一种基于现场可编程门阵列(field programmable gate array,FPGA)的RS232接口电路.首先,分析了FPGA在设计通用串行收发器(universal asynchronous receiver and transmitter,UART)接口电路中的优势.该接口电路主要分为UART接收子模块、波特率发生器、先进先出(first in first out,FIFO)模块、UART发送子模块、通信校验模块等.然后,基于Xilinx公司的FPGA平台,使用Verilog HDL语言编写并实现了整个系统,给出了完整的电路结构框图及实验结果.实验结果验证了所设计RS232接口电路的有效性.【期刊名称】《山西焦煤科技》【年(卷),期】2011(035)008【总页数】3页(P18-20)【关键词】通用串行收发器(UART);可编程门阵列(FPGA);过采样;先进先出(FIFO)【作者】张蕾【作者单位】山西煤炭进出口集团有限公司,山西太原 030006【正文语种】中文【中图分类】TD65目前,我国的煤矿设备自动化程度不断提高,井下作业对信号传输的要求也愈趋严格。
本文研究的通用串行收发器(universal asynchronous receiver and transmitter,UART)可通过串行线传输并行数据,其本质功能是作为控制器和串行设备间的编码转换装置,在基于RS232、RS485等标准协议的通信系统中广泛应用[1-3],非常适合矿井通信系统。
常用的单片机、DSP控制器等一般都集成有专用的UART外设,极大地方便了基于RS232等协议的通信系统设计。
但这类预先固化好的系统也存在一定的不足,如工作模式不够灵活,数据位数固定、通信的波特率一般限制在几个固定的数值,可扩展性较小。
基于FPGA的UART接口模块设计
基于FPGA的UART接口模块设计UART(UniversalAnynchronousReceiverTransmitter,通用异步接收发送器)是广泛应用的串行数据传输协议之一,其应用范围遍及计算机外设、工控自动化等场合。
虽然USB 传输协议比UART 协议有更高的性能,但电路复杂开发难度大,并且大多数的微处理器只集成了UART,因此UART 仍然是目前数字系统之间进行串行通信的主要协议。
随着FPGA 的广泛应用,经常需要FPGA 与其他数字系统进行串行通信,专用的UART 集成电路如8250,8251 等是比较复杂的,因为专用的UART 集成电路既要考虑异步的收发功能,又要兼容RS232 接口设计,在实际应用中,往往只需要用到UART 的基本功能,使用专用芯片会造成资源浪费和成本提高。
可以将所需要的UART 功能集成到FPGA 内部,实现FPGA 与其他数字系统的直接通信,从而简化了整个系统电路,提高了可靠性、稳定性和灵活性。
1 UART 简介基本的UART 通信只需要两条信号线(RXD,TXD)就可以完成数据的相互通信,接收与发送是全双工形式,其中TXD 是UART 发送端,RXD 是UART 接收端。
UART 基本特点是:在信号线上有两种状态,可分别用逻辑1(高电平)和逻辑0(低电平)来区分。
在发送器空闲时,数据线应保持在逻辑高电平状态。
发送器是通过发送起始比特而开始一个字符传送,起始比特使数据线处于逻辑0 状态,提示接收器数据传输即将开始。
数据位一般为8 位一个字节的数(也有6 位7 位的情况),低位(LSB)在前,高位(MSB)在后。
校验位一般用来判断接收的数据位有无错误,一般是奇偶校验。
停止位在最后,用以标志UART 一个字符传送的结束,它对应于逻辑1 状态,UART 数据帧格式如2 UART 功能实现。
第6章2 FPGA的UART模块的设计
1. UART的数据格式
由于数字图像亚像素在计算机中是用8位二进制表示, 因此UART传输的有效数据位为8位。传输线在空闲时为高 电平,因此有效数据流的开始位设为0。接着传输8位有效 数据位,先从最低位开始传送。奇偶检验位可以设置为奇 检验、偶校验或者不设置校验位,由于本系统使用的传输 速率不高,为了加快开发进程,减少电路面积,因此没有 设计奇偶检验模块,数据流中不设奇偶检验位。最后停止 位为高电平。
(3)信息类型不匹配。不同的外设可能采用不同类型的型号, 有些是模拟信号,有些是数字信号,因此采用的处理方式也不 同。
为了解决外设和计算机之间的信息交换问题,即需要设计一 个信息交换的中间环节——接口。UART控制器是最常用的接口。
通用异步收发器(UART)是辅助计算机与串行设备之间的通信, 作为RS 232通信接口的一个重要的部分,目前大部分的处理器 都集成了UART。
在实际设计中,一般最大选择16倍于波特率的时钟频率。实现波特率时钟的基本思 路就是设计一个计数器,该计数器工作在速度很高的系统时钟下,通过总线写入不同 的数值到波特率发生器保持寄存器中,然后用计数器的方式生成所需要的各种波特率 就能得到所需的波特率时钟。
波特率发生器模块
波特率发生器的功能是产生和RS 232通信所采用的波特率同步的时钟,这样才能 方便地按照RS 232串行通信的时序要求进行数据接收或者发送。比如,波特率为9 600 b/s,即每秒传输9 600 b数据,则同步的波特率时钟频率为9 600 Hz,周期为
1/9 600=O.104 17。设计波特率时钟的基本思路就是设计一个计数器,该 计数器工作在速度很高的系统时钟下,当计数器计数到某数值时将输出置高,再 计数到一定的数值后再将输出置低,如此反复便能够得到所需的波特率时钟。该 系统所用的FPGA系统时钟为50 MHz,RS 232通信的波特率为9 600 b/s,则波特 率时钟的每个周期相当于(50*1000000)/9600=5 208个系统时钟周期。假如要得 到占空比为50%的波特率时钟,只要使得计数器在计数到1 604时将输出置高,之 后在计数到5 208时将输出置低并且重新计数,就能实现和9 600波特率同步的时 钟。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第三章UART设计3、1 UART得帧格式在UART 中,数据位就是以字符为传送单位,数据得前、后要有起始位、停止位,另外可以在停止位得前面加上一个比特(bit)得校验位。
其帧格式如图所示。
文章通过分析UART得功能,利用有限状态机来描述UART核心控制逻辑得方法,将其核心功能集成,从而使整个设计更加稳定、可靠。
基本得UART通信只需要两条信号线就可以完成数据得相互通信。
UART得功能模块如图3_2所示。
3、2 UART模块在大规模电路得设计中,广泛采用层次化,结构化得设计方法。
它将一个完整得硬件设计任务从系统级开始,划分为若干个可操作得模块,编制出相应得模型并进行仿真验证,最后在系统级上进行组合。
这样在提高设计效率得同时又提高了设计质量,就是目前复杂数字系统实现得主要手段,也就是本文设计思想得基础。
其系统模块可划分为4个部分,如波特发生器,控制器,接收器,发送器,如图3-3所示:3Data_in:并行输入data_out:并行输出Cs:通知cpu接收数据位ks:通知cpu发送准备位Reset:重启输入state:uart状态输入Clk:48M时钟输入3、2、2UART主体程序`timescale 1ns/1nsmodule gs_opt(input wire read,input wire clk,input wire reset,input wire state,input wire [7:0] dat_in,output wire send,output wire cs,output wire ks,output wire [7:0] dat_out);wire send_enable;wire read_enable;wire clk_enable3;wire clk_enable4;wire clear3 ;wire clear4 ;wire clk_enable;wire [7:0] counters;wire clear ;wire t1;/*read,send,cs,ks,reset,state,clk,dat_in,dat_out);//module uart(read,send,cs,ks,reset,state,clk,dat_in,dat_out); input read,clk,reset,state;//read为串行输入,clk为时钟输入50MHZ,reset为重启键input[7:0] dat_in;//并行数据输入output send,cs,ks;//send为串行输出,cs为通知cpu接收数据位,ks为发送准备位output[7:0] dat_out;//并行数据输出wire clear,clk_enable,read_enable,clear3,send_enable,clear4,t1; wire[7:0] counters,dat_in;*/rxd u1 (、dat_out (dat_out) ,、cs (cs) ,、read (read) ,、reset (reset) ,、clk_enable3 (clk_enable3) ,、clk (clk) ,、read_enable (read_enable) ,、clear3 (clear3) ,、counters (counters)); //接收数据moduletxd u2 (、dat_in (dat_in),、ks (ks),、send (send),、reset (reset),、clk_enable4 (clk_enable4),、clk (clk),、send_enable (send_enable),、clear4 (clear4),、counters( counters));//发送数据moduleclk_bau u3 (、clk(clk) ,、t1 (t1),、clk_enable (clk_enable)); //时钟计数器模块ctrl u4(、read_enable (read_enable) ,、send_enable (send_enable),、clk (clk),、state (state),、t1 (t1),、read (read ),、counters (counters),、reset (reset ),、clear (clear));check_cle u5 (、state (state),、clear3 (clear3),、clear4 (clear4),、clear (clear),、clk_enable3 (clk_enable3),、clk_enable4 (clk_enable4),、clk_enable (clk_enable));endmodule//////////////////////////////////////////////////////////////////////////////////////////////////////////// ///////////3、3UART发送模块3、3、1UART得数据发送服务发送器实现得功能就是将输入得8位并行数据变为串行数据,同时在数据头部加起始位,在数据位尾部加奇偶校验位与停止位。
数据发送服务如表3、1表3、1数据发送其基本特点就是:①在信号线上共有两种状态,可分别用逻辑1与逻辑。
来区分。
在发送器空闲时,数据线应该保持在逻辑高电平状态。
②发送起始位:该位就是一个逻辑0,总就是加在每一帧得头部,提示接受器数据传输即将开始,在接收数据位过程中又被分离出去,占据一个数据位得时间。
③发送数据位:在起始位之后就就是数据位,一般为8位一个字节得数据,低位在前,高位在后。
如字母C在ASCII表中就是十进制67,二进制01000011,那么传输得将就是110000100。
并在数据发送过程当中,进行数据位奇偶校验。
④发送校验位:该位一般用来判断接收得数据位有无错误,常用得校验方法就是奇偶校验法。
将3过程当中奇偶校验得结果输入到数据线,并占一个数据位时钟。
⑤停止位:停止位总在每一帧得末尾,为逻辑1,用于标志一个字符传送得结束,占据一个数据位得时间。
⑥帧:从起始位到停止位之间得一组数据称为一帧。
3、3、2UART得数据发送操作如图3-4解释:采用9600波特率发送从cpu传入数据:就是指将data_in端口得数据存入寄存器中Cpu发送为检测:就是指将ks寄存器置位,即数据发送完毕3、3、3UART得数据发送模块程序module rxd(dat_out,cs,read,reset,clk_enable3,clk,read_enable,clear3,counters);//接收数据moduleinput read_enable;input read,reset,clk;//read为串行输入,read_control为时钟控制,reset为重启键input[7:0] counters;output cs,clear3,clk_enable3;//cs为通知cpu读取数据位output[7:0] dat_out;//wire clear3;reg cs,cs1,clk_enable3;reg[7:0] data_out;//移位寄存器regparity_check_result,parity_result,clear3,clear1;////////////////////////////////////////////////// ///////////////////////always(posedge clk)beginif(read_enable)//当read_enable为高电平时为发送操作状态beginclk_enable3<=1;clear3<=clear1;endelsebeginclear3<=1;endend//////////////////////////////////////////////////////////////////////////////always(negedge counters[0]) ///接收操作if(read_enable & !reset)beginif (counters==8'b00011000) //1begindata_out[7]<=read;parity_check_result<=parity_check_result + read;endelse if (counters==8'b00101000) //2begindata_out[6]<=read;parity_check_result<=parity_check_result + read;endelse if (counters==8'b00111000) //3begindata_out[5]<=read;parity_check_result<=parity_check_result + read;endelse if (counters==8'b01001000) //4begindata_out[4]<=read;parity_check_result<=parity_check_result + read;endelse if (counters==8'b01011000) //5begindata_out[3]<=read;parity_check_result<=parity_check_result + read;endelse if (counters==8'b01101000) //6begindata_out[2]<=read;parity_check_result<=parity_check_result + read;else if (counters==8'b01111000) //7begindata_out[1]<=read;parity_check_result<=parity_check_result + read;endelse if (counters==8'b10001000) //8begindata_out[0]<=read;parity_check_result<=parity_check_result + read;endelse if (counters==8'b10011000) //9进行奇偶校验检测beginparity_result<=read;parity_result<=#2 (parity_check_result == parity_result) ? 1:0;endelse if (counters==8'b10101000) //0进行帧检测begincs1<=(read) ? 1:0;endelse if (counters==8'b10101010) //01给cpu发送接收信号begincs<=(cs1 && parity_result) ? 1:0;//当奇偶校验结果与帧检测结果都为1时,cs置位clear1<=1;//clk_enable<=0;//clk_enable3<=0;endelse if(counters==8'b00001000)//检测就是否就是毛刺beginclear1<=(!read)?0:1;else clear1<=0;endelse clear1<=1;endmodule3、3、4UART得数据发送模块程序仿真图当reset为零时图3-5reset为零时仿真图如图为UART得数据发送模块得功能仿真图,为方便观察,其中得时钟就是直接给出来得,根据图中得数据判读,其功能为正确,UART得数据发送模块编译成功。