FPGA课程设计基于FPGA器件设计与实现UART_第1页
FPGA课程设计基于FPGA器件设计与实现UART_第2页
FPGA课程设计基于FPGA器件设计与实现UART_第3页
FPGA课程设计基于FPGA器件设计与实现UART_第4页
FPGA课程设计基于FPGA器件设计与实现UART_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、目录目录 摘摘 要要 .IIII ABSTRACTABSTRACT .IIIIII 引言引言 .1 1 1 1 项目构成的基本原理项目构成的基本原理.2 2 1.1 、UART 简介 .2 1.2、UART 的基本特点 .2 2 2 项目实现的基本原则项目实现的基本原则.4 4 2.1、FPGA UART 系统组成如图 2 所示: .4 2.2、波特率发生器.4 2.3、UART 接收器 .4 2.4、UART 发送器 .6 2.5 芯片的选择 .7 3 3 程序设计程序设计.8 8 3.1 顶层程序 .8 3.2 UART 发送器程序 .10 3.3 UART 接收器程序 .12 3.4 整

2、体电路图 .14 4 4 仿真仿真.1515 4.1 顶层仿真 .15 4.2 波特率发生器仿真 .15 4.3UART 发送器仿真 .16 4.4 UART 接收器仿真 .16 5 5 总结总结.1717 6 6 参考文献参考文献.1818 摘 要 基于 FPGA 设计和实现 UART,可以用片上很少的逻辑单元实现 UART 的基本功能。 与传统设计相比,能有效减少系统的 PCB 面积,降低系统的功耗,提高设计的稳定性和 可靠性,并可方便地进行系统升级和移植。 采用有限状态机模型形式化描述了 UART 的功能,在此基础上用硬件描述语言 VHDL 编程实现了 UART,并使用 Quartus软

3、件中的嵌入式逻辑分析仪 SignalTap 对数据传输 进行了检测,验证了设计的正确性。 本设计具有较大的灵活性,通过调整波特率发生器的分频参数,就可以使其工作在 不同的频率。采用 16 倍波特率的采样时钟,可以实时有效探测数据的起始位,并可对数 据位进行“对准”中央采样,保证了所采样数据的正确性。该模块可以作为一个完整的 IP 核移植进各种 FPGA 中,在实际应用时可嵌入到其他系统中,很容易实现和远端上位 机的异步通信。 关键字关键字: FPGA;UART;有限状态机;SignalTap Abstract Design and implementation based on FPGA UA

4、RT, can be used on a few logical unit realizes the basic function of UART. Compared with the traditional design, can effectively reduce the PCB area system, reduce the power consumption of the system, and improve the design of the stability and reliability, and easy system upgrades and migration. Th

5、e functions of UART are described formally by using the finite state machinemodel, by the way, UART is realized on the basis of VHDL . Moreover, the data transmission is detected with SignalTap which is an embedded logic analyzer in Quartus. The result proves the validity of the design. This design

6、has great flexibility, by adjusting the frequency division baud rate generator parameters, you can make it work on a different frequency. Using 16 times the baud rate of the sampling clock, can effectively detect real-time data of the start bit, and to on the central sampling of data bits, ensures t

7、he correctness of the sampled data. The module can be used as a complete IP nuclear transplantation into various kinds of FPGA, in the actual application can be embedded into other systems, is easy to implement and the remote PC asynchronous communication. Key word: FPGA;UART;finite state machine;Si

8、gnalTap 引言 随着电子设备功能的不断增强,复杂度也在不断提高,对这些系统的测试要求也越来越 高,因而促进了自动测试系统的发展。而数字 I/O 模块作为自动测试系统重要的测试模块, 它既可以作为信号源激励被测系统,也可以检测被测系统的输出,在很多领域得到了非常广 泛的应用 。 当今社会是数字化的社会,是数字集成电路广泛应用的社会。数字集成电路本身在 不断地进行更新换代。它由早期的电子管、晶体管、小中规模集成电路、发展到超大规 模集成电路(VLSIC几万门以上)以及许多具有特定功能的专用集成电路。但是,随着微 电子技术的发展,设计与制造集成电路的任务已不完全由半导体厂商来独立承担。系统 设

9、计师们更愿意自己设计专用集成电路(ASIC)芯片,而且希望 ASIC 的设计周期尽可能短, 最好是在实验室里就能设计出合适的 ASIC 芯片,并且立即投入实际应用之中,因而出现 了现场可编程逻辑器件(FPLD),其中应用最广泛的当属现场可编程门阵列(FPGA)和复杂 可编程逻辑器件(CPLD)。 1 项目构成的基本原理 1.1 、UART 简介简介 UART(Universal Asynchronous Receiver Transmitter 通用异步收发器)是一种应用广 泛的短距离串行传输接口。常常用于短距离、低速、低成本的通讯中。 8250、8251、NS16450 等芯片都是常见的 U

10、ART 器件。 基本的 UART 通信只需要两条信号线(RXD、TXD)就可以完成数据的相互通信,接收 与发送是全双工形式。TXD 是 UART 发送端,为输出;RXD 是 UART 接收端,为输入。 1.2、UART 的基本特点的基本特点 (1)在信号线上共有两种状态,可分别用逻辑 1(高电平)和逻辑 0(低电平)来 区分。在发送器空闲时,数据线应该保持在逻辑高电平状态。 (2)起始位(Start Bit):发送器是通过发送起始位而开始一个字符传送,起始 位使数据线处于逻辑 0 状态,提示接受器数据传输即将开始。 (3)数据位(Data Bits):起始位之后就是传送数据位。数据位一般为 8

11、 位一个 字节的数据(也有 6 位、7 位的情况) ,低位(LSB)在前,高位(MSB)在后。 (4)校验位(parity Bit):可以认为是一个特殊的数据位。校验位一般用来判断 接收的数据位有无错误,一般是奇偶校验。在使用中,该位常常取消。 (5)停止位:停止位在最后,用以标志一个字符传送的结束,它对应于逻辑 1 状态。 (6)位时间:即每个位的时间宽度。起始位、数据位、校验位的位宽度是一致的, 停止位有 0.5 位、1 位、1.5 位格式,一般为 1 位。 (7)帧:从起始位开始到停止位结束的时间间隔称之为一帧。 8)波特率:UART 的传送速率,用于说明数据传送的快慢。在串行通信中,数

12、据是按 位进行传送的,因此传送速率用每秒钟传送数据位的数目来表示,称之为波特率。如波 特率 9600=9600bps(位/秒) 。UART 的数据帧格式为如图 1 所示 图 1:UART 的数据帧格式 2 项目实现的基本原则 2.1、FPGA UART 系统组成如图系统组成如图 2 所示:所示: 图 2:FPGA UART 系统组成 FPGA UART 由三个子模块组成: (1)波特率发生器; (2)接收模块; (3)发送模块; 2.2、波特率发生器、波特率发生器 波特率发生器实际上就是一个分频器。可以根据给定的系统时钟频率(晶振时钟) 和要求的波特率算出波特率分频因子,算出的波特率分频因子作

13、为分频器的分频数。波 特率分频因子可以根据不同的应用需要更改。 2.3、UART 接收器接收器 由于串行数据帧和接收时钟是异步的,由逻辑 1 转为逻辑 0 可以被视为一个数据帧 的起始位。然而,为了避免毛刺影响,能够得到正确的起始位信号,必须要求接收到的 起始位在波特率时钟采样的过程中至少有一半都是属于逻辑 0 才可认定接收到的是起始 位。由于内部采样时钟 bclk 周期(由波特率发生器产生)是发送或接收波特率时钟频率 的 16 倍,所以起始位需要至少 8 个连续 bclk 周期的逻辑 0 被接收到,才认为起始位接 收到,接着数据位和奇偶校验位将每隔 16 个 bclk 周期被采样一次(即每一

14、个波特率时 钟被采样一次) 。如果起始位的确是 16 个 bclk 周期长,那么接下来的数据将在每个位的 中点处被采样。 图 3:UART 接收器的接收状态机 R_START 状态:当 UART 接收器复位后,接收状态机将处于这一个状态。在此状态, 状态机一直在等待 RXD 的电平跳转,从逻辑 1 变为逻辑 0,即起始位,这意味着新的一帧 UART 数据帧的开始,一旦起始位被确定,状态机将转入 R_CENTER 状态。状态图中的 RXD_SYNC 信号是 RXD 的同步信号,因为在进行逻辑 1 或逻辑 0 判断时,不希望检测的信 号是不稳定的,所以不直接检测 RXD 信号,而是检测经过同步后的

15、 RXD_SYNC 信号。 R_CENTER 状态: 对于异步串行信号,为了使每一次都检测到正确的位信号,而且在 较后的数据位检测时累计误差较小,显然在每位的中点检测是最为理想的。在本状态, 就是由起始位求出每位的中点,通过对 bclk 的个数进行计数(RCNT16) ,但计数值不是 想当然的“1000” ,要考虑经过一个状态,也即经过了一个 bclk 周期,所希望得到的是 在采样时 1/2 位。另外,可能在 R_START 状态检测到的起始位不是真正的起始位,可能 是一个偶然出现的干扰尖脉冲(负脉冲) 。这种干扰脉冲的周期是很短的,所以可以认为 保持逻辑 0 超过 1/4 个位时间的信号一定

16、是起始位。 R_WAIT 状态: 当状态机处于这一状态,等待计满 15 个 bclk,在第 16 个 bclk 是进 入 R_SAMPLE 状态进行数据位的采样检测,同时也判断是否采集的数据位长度已达到数据 帧的长度(FRAMELEN) ,如果到来,就说明停止位来临了。FRAMELEN 在设计时是可更改的 (使用了 Generic) ,在本设计中默认为 8,即对应的 UART 工作在 8 位数据位、无校验位 格式。 R_SAMPLE 状态: 即数据位采样检测,完成后无条件状态机转入 R_WAIT 状态,等待 下次数据位的到来。 R_STOP 状态: 无论停止位是 1 还是 1.5 位,或是 2

17、 位,状态机在 R_STOP 不具体检 测 RXD,只是输出帧接收完毕信号(REC_DONEclk32mhz,resetb=reset,bclk=b); -顶层映射 u2:reciever port map(bclkr=b,resetr=reset,rxdr=rxd,r_ready=rec_ready, rbuf=rec_buf); u3:transfer port map(bclkt=b,resett=reset,xmit_cmd_p=xmit_cmd_p_in, txdbuf=txdbuf_in,txd=txd_out,txd_done=txd_done_out); end Behavio

18、ral; 3.2 波特率发波特率发生生器程序器程序 library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity baud is Port (clk,resetb:in std_logic; bclk:out std_logic); end baud; architecture Behavioral of baud is begin process(clk,resetb) variable cnt:integer; begin if

19、 resetb=1 then cnt:=0; bclk=208 then cnt:=0; bclk=1; -设置分频系数 else cnt:=cnt+1; bclk=0; end if; end if; end process; end Behavioral; 3.2 UART 发送器程序发送器程序 library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity transfer is generic(framlent:integer

20、:=8); Port (bclkt,resett,xmit_cmd_p:in std_logic; -定义输入输出信号 txdbuf:in std_logic_vector(7 downto 0):=; txd:out std_logic; txd_done:out std_logic); end transfer; architecture Behavioral of transfer is type states is (x_idle,x_start,x_wait,x_shift,x_stop); -定义个子状态 signal state:states:=x_idle; signal tc

21、nt:integer:=0; begin process(bclkt,resett,xmit_cmd_p,txdbuf) -主控时序、组合进程 variable xcnt16:std_logic_vector(4 downto 0):=00000; -定义中间变量 variable xbitcnt:integer:=0; variable txds:std_logic; begin if resett=1 then state=x_idle; txd_done -状态 1,等待数据帧发送命 令 if xmit_cmd_p=1 then state=x_start; txd_done=0; el

22、se state -状态 2,发送信号至起始 位 if xcnt16=01111 then state=x_wait; xcnt16:=00000; else xcnt16:=xcnt16+1; txds:=0; state -状态 3,等待状态 if xcnt16=01110 then if xbitcnt=framlent then state=x_stop; xbitcnt:=0; else state=x_shift; end if; xcnt16:=00000; else xcnt16:=xcnt16+1; statetxds:=txdbuf(xbitcnt); xbitcnt:=x

23、bitcnt+1; state -状态 5,停止位发送状态 if xcnt16=01111 then if xmit_cmd_p=0 then state=x_idle; xcnt16:=00000; else xcnt16:=xcnt16; state=x_stop; end if; txd_done=1; else xcnt16:=xcnt16+1; txds:=1; statestate=x_idle; end case; end if; txd=txds; end process; end Behavioral; 3.3 UART 接收器程序接收器程序 library IEEE; us

24、e IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity reciever is generic(framlenr:integer:=8); Port (bclkr,resetr,rxdr:in std_logic; -定义输入输出信号 r_ready:out std_logic; rbuf:out std_logic_vector(7 downto 0); end reciever; architecture Behavioral of reciever i

25、s type states is (r_start,r_center,r_wait,r_sample,r_stop); -定义各子状态 signal state:states:=r_start; signal rxd_sync:std_logic; begin pro1:process(rxdr) begin if rxdr=0 then rxd_sync=0; else rxd_sync=1; end if; end process; pro2:process(bclkr,resetr,rxd_sync) -主控时序、组合进 程 variable count:std_logic_vector

26、(3 downto 0); -定义中间变量 variable rcnt:integer:=0; variable rbufs:std_logic_vector(7 downto 0); begin if resetr=1 then state -状态 1,等待起始 位 if rxd_sync=0 then state=r_center; r_ready=0; rcnt:=0; else state=r_start; r_ready -状态 2,求出每位的中点 if rxd_sync=0 then if count=0100 then state=r_wait; count:=0000; els

27、e count:=count+1; state=r_center; end if; else state -状态 3,等待状态 if count=1110 then if rcnt=framlenr then state=r_stop; else state=r_sample; end if; count:=0000; else count:=count+1; staterbufs(rcnt):=rxd_sync; rcnt:=rcnt+1;stater_ready=1; rbuf=rbufs; statestate=r_start; end case; end if; end process

28、; end Behavioral; 3.4 整体电路图整体电路图 整个系统的:整体电路图如图 5 所示: 图 5:系统的整体电路图 clk resetb bclk bclkr resetr rxdr r_ready rbuf7.0 bclkt resett xmit_cmd_p txdbuf7.0 txd txd_done baud:u1 reciever:u2 transfer:u3 clk32mhz reset xmit_cmd_p_in rec_ready txd_out txd_done_out txdbuf_in7.0 rec_buf7.0 rxd 4 仿真 4.1 顶层仿真顶层仿真

29、 仿真波形图如图 4 所示。 图 6 仿真波形 4.2 波特率发生器仿真波特率发生器仿真 仿真波形如图 7 所示。 图 7 波特率发生器的仿真波形 4.3UART 发送器仿真发送器仿真 仿真波形如图 8 所示 图 8 UART 发送器的仿真波形 4.4 UART 接收器仿真接收器仿真 UART 接收器的仿真波形如图 9 所示。 图 9UART 接收器的仿真波形 5 总结 利用 Verilog 设计的灵活性实现了 UART 通信功能,可以实现对数据的接收和发送, 并可以在接收数据时对其校验位、停止位进行判断,在发送数据时可以形成完整的一帧数 据格式. 其接收和发送数据 的时钟有内部波特率发生器产生,根据预置的分频 计系数,对 外部时钟进行分频,产生需要的接收或发送 时钟. 将该 UART 设计作为一功能块嵌入到一 个 FPGA/CPLD 实现的数据采

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论