FPGA通用异步收发器课程设计_第1页
FPGA通用异步收发器课程设计_第2页
FPGA通用异步收发器课程设计_第3页
FPGA通用异步收发器课程设计_第4页
FPGA通用异步收发器课程设计_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

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

文档简介

1、课程设计任务书学生姓名:瞿子敬专业班级:通信1104指导教师:陈适工作单位:信息工程学院题目:FPGA通用异步收发器设计课程设计目的:1 .熟练使用VHDL语言进行电路设计;2 .能够运用相关软件进行模拟分析;3 .掌握基本的文献检索与文献阅读的方法;4 .提高正确的撰写论文的基本能力。课程设计内容与要求1 .内容:FPGA通用异步收发器设计2、要求:使用VHDL语言完成电路设计,并在此基础上进行仿真,得到正确结果初始条件QuartusH仿真平台时间安排1 .方案设计,1天;2 .软件设计,2天;3 .系统调试,1天;4 .答辩,1天。指导教师签名:系主任(或责任教师)签名:目录摘要IAbst

2、ractI1、UART简介1.1、1UART基本特点1.1、2FPGAURAT系统组成1.2、模块设计2.2、1顶层模块2.2、1波特率发牛器3.2、3UART接收器3.2、3、1接收器简介32、3、2UART接收器的接收状态机42、4URAT发送器5.2、4、1发送.器简介5.2、4、2发送状态机5.3、程序设计与仿真7.3、1顶层程序7.3、2波特率发牛器程庠9.3、3UART发送器程序103、4UART接收器程序.134、心得体会155、参考文献16摘要UART(UniversalAsynchronousReceiverTransmitter通用异步收发器)就是一种应用广泛的短距离串行传

3、输接口。常常用于短距离、低速、低成本的通讯中。8250、8251、NS16450等芯片都就是常见的UART器件。基本的UART通信只需要两条信号线(RXD、TXD)就可以完成数据的相互通信,接收与发送就是全双工形式。TXD就是UART发送端,为输出;RXD就是UART接收端,为输入。关键词:UART,FPGA,VHDL,电路通信AbstractUART(UniversalAsynchronousReceiverTransmitter)isakindofwidelyusedshortserialtransmissioninterface、Oftenusedinshortdistance,lows

4、peed,lowcostofcommunications、8250,8251,NS16450,etcarecommonUARTchipdevice、sBasicUARTcommunicationonlyneedtwosignallines(RXD,TXD)cancompletedatacommunication,sendingandreceivingisfullduplexform、TXDisUARTtransmitterforoutput;RXDisUARTreceiverforinput、Keywords:UART,FPGA,VHDL,CircuitCommunication1、UART简

5、介1、1UAR得本特点(1)在信号线上共有两种状态,可分别用逻辑1(高电平)与逻辑0(低电平)来区分。在发送器空闲时,数据线应该保持在逻辑高电平状态。(2)起始位(StartBit):发送器就是通过发送起始位而开始一个字符传送,起始位使数据线处于逻辑0状态,提示接受器数据传输即将开始。(3)数据位(DataBits):起始位之后就就是传送数据位。数据位一般为8位一个字节的数据(也有6位、7位的情况),低位(LSB)在前,高位(MSB)在后。(4)校验位(parityBit):可以认为就是一个特殊的数据位。校验位一般用来判断接收的数据位有无错误,一般就是奇偶校验。在使用中,该位常常取消。(5)停

6、止位:停止位在最后,用以标志一个字符传送的结束,它对应于逻辑1状态。(6)位时间:即每个位的时间宽度。起始位、数据位、校验位的位宽度就是一致的停止位有0、5位、1位、1、5位格式,一般为1位。(7)帧:从起始位开始到停止位结束的时间间隔称之为一帧。(8)波特率:UART的传送速率,用于说明数据传送的快慢。在串行通信中,数据就是按位进行传送的,因此传送速率用每秒钟传送数据位的数目来表示,称之为波特率。如波特率9600=9600bps位/秒)。UART的数据帧格式为:STAKTDOD1D2D厂aD5D7PSTOP起船数据位停止位1、2FPGAURAT(统组成FPGAUART由三个子模块组成(1)波

7、特率发生器;(2)接收模块;(3)发送模块;模块分布如图所示图1、1UART模块2.模块设计模块设计分为顶层模块、波特率发生器、UART接收器、UART发送器四部分。2、1顶层模块异步收发器的顶层模块由波特率发生器、UART接收器与UART发送器构成。UART发送器的用途就是将准备输出的并行数据按照基本UART帧格式转为TXD信号用行输出。UART接收器接收RXD申行信号,并将其转化为并行数据。波特率发生器就就是专门产生一个远远高于波特率的本地时钟信号对输入RXD不断采样,使接收器与发送器保持同步。顶层模块电路图baudreciever图2、1顶层模块电路2、1波特率发生器波特率发生器实际上就

8、就是一个分频器。可以根据给定的系统时钟频率(晶振时钟)与要求的波特率算出波特率分频因子,算出的波特率分频因子作为分频器的分频数。波特率分频因子可以根据不同的应用需要更改。2、3UART接收器2、3、1接收器简介由于串行数据帧与接收时钟就是异步的,由逻辑1转为逻辑0可以被视为一个数据帧的起始位。然而,为了避免毛刺影响,能够得到正确的起始位信号,必须要求接收到的起始位在波特率时钟采样的过程中至少有一半都就是属于逻辑0才可认定接收到的就是起始位。由于内部采样时钟bclk周期(由波特率发生器产生)就是发送或接收波特率时钟频率的16倍,所以起始位需要至少8个连续bclk周期的逻辑0被接收到,才认为起始位

9、接收到,接着数据位与奇偶校验位将每隔16个bclk周期被采样一次(即每一个波特率时钟被采样一次)。如果起始位的确就是16个bclk周期长,那么接下来的数据将在每个位的中点处被采样2、3、2UART接收器的接收状态机图2、2接受状态机状态图五个状态分别为R_START(等待起始位),R_CENTER(求中点),R_WAIT(等待采样),R_SAMPLE(采样),R_STOP(停止位接收)。R_START状态:当UART接收器复位后,接收状态机将处于这一个状态。在此状态,状态机一直在等待RXD的电平跳转,从逻辑1变为逻辑0,即起始位,这意味着新的一帧UART数据帧的开始,一旦起始位被确定,状态机将

10、转入R_CENTER状态。状态图中的RXD_SYNC信号就是RXD的同步信号,因为在进行逻辑1或逻辑0判断时,不希望检测的信号就是不稳定的,所以不直接检测RXD信号,而就是检测经过同步后的RXD_SYNC信号。R_CENTE状态:对于异步串行信号,为了使每一次都检测到正确的位信号,而且在较后的数据位检测时累计误差较小,显然在每位的中点检测就是最为理想的。在本状态,就就是由起始位求出每位的中点,通过对bclk的个数进行计数(RCNT16),但计数值不就是想当然的“1000”,要考虑经过一个状态,也即经过了一个bclk周期,所希望得到的就是在采样时1/2位。另外,可能在R_START状态检测到的起

11、始位不就是真正的起始位,可能就是一个偶然出现的干扰尖脉冲(负脉冲)。这种干扰脉冲的周期就是很短的,所以可以认为保持逻辑0超过1/4个位时间的信号一定就是起始位。R_WAIT状态:当状态机处于这一状态,等待计满15个bclk,在第16个bclk就是进入R_SAMPLE状态进行数据位的采样检测,同时也判断就是否采集的数据位长度已达到数据帧的长度(FRAMELEN),如果到来,就说明停止位来临了。FRAMELEN在设计时就是可更改的(使用了Generic),在本设计中默认为8,即对应的UART工作在8位数据位、无校验位格式。R_SAMPLE状态:即数据位采样检测,完成后无条件状态机转入R_WAIT状

12、态,等待下次数据位的到来。R_STOP状态:无论停止位就是1还就是1、5位,或就是2位,状态机在R_STOP不具体检测RXD,只就是输出帧接收完毕信号(REC_DONE<=1),停止位后状态机转回到R_START状态,等待下一个帧的起始位。2、4URA俊送器2、 4、1发送器简介发送器只要每隔16个bclk周期输出1个数据即可,次序遵循第1位就是起始位,第8位就是停止位。在本设计中没有校验位,但只要改变Generic参数FrameLen,也可以加入校验位,停止位就是固定的1位格式。3、 4、2发送状态机五个状态分别为X_IDLE(空闲),X_START(起始位),X_WAIT(移位等待)

13、,X_SHIFT(移位),X_STOP(停止位)。X_IDLE状态:当UART被复位信号复位后,状态机将立刻进入这一状态。在这个状态下,UART的发送器一直在等待一个数据帧发送命令XMIT_CMD。XMIT_CMD_P信号就是对XMIT_CMD的处理,XMIT_CMD_P就是一个短脉冲信号。这时由于XMIT_CMD就是一个外加信号,在FPGA之外,不可能对XMIT_CMD的脉冲宽度进行限制,如果XMIT_CMD有效在UART发完一个数据帧后仍然有效,那么就会错误地被认为,一个新的数据发送命令又到来了,UART发送器就会再次启动UART帧的发送,显然该帧的发送就是错误的。在此对XMIT_CMD进

14、行了脉冲宽度的限定,XMIT_CMD_P就就是一个处理后的信号。当XMIT_CMD_P=1',状态机转入X_START,准备发送起始位。X_START状态:在这个状态下,UART的发送器一个位时间宽度的逻辑0信号至TXD,即起始位。紧接着状态机转入X_WAIT状态。XCNT16就是bclk的计数器X_WAIT状态:同UART接收状态机中的R_WAIT状态类似。X_SHIFT状态:当状态机处于这一状态时,实现待发数据的并用转换。转换完成立即回到X_WAIT状态。X_STOP状态:停止位发送状态,当数据帧发送完毕,状态机转入该状态,并发送16个bclk周期的逻辑1信号,即1位停止位。状态机

15、送完停止位后回到X_IDLE状态,并等待另一个数据帧的发送命令。3.程序设计与仿真3、 1顶层程序- -文件名:top、vhd。- -功能:顶层映射。libraryIEEE;useIEEE、STD_LOGIC_1164、ALL;useIEEE、STD_LOGIC_ARITH、ALL;useIEEE、STD_LOGIC_UNSIGNED、ALL;entitytopisPort(clk32mhz,reset,rxd,xmit_cmd_p_in:instd_logic;- -总的输入输出信号的定义rec_ready,txd_out,txd_done_out:outstd_logic;txdbuf_i

16、n:instd_logic_vector(7downto0);-待发送数据输入rec_buf:outstd_logic_vector(7downto0);-接收数据缓冲endtop;architectureBehavioraloftopiscomponentrecieverPort(bclkr,resetr,rxdr:instd_logic;r_ready:outstd_logic;rbuf:outstd_logic_vector(7downto0);endcomponent;componenttransferPort(bclkt,resett,xmit_cmd_p:instd_logic;t

17、xdbuf:instd_logic_vector(7downto0);txd:outstd_logic;txd_done:outstd_logic);endcomponent;componentbaudPort(clk,resetb:instd_logic;bclk:outstd_logic);endcomponent;signalb:std_logic;beginu1:baudportmap(clk=>clk32mhz,resetb=>reset,bclk=>b);-顶层映射u2:recieverportmap(bclkr=>b,resetr=>reset,rx

18、dr=>rxd,r_ready=>rec_ready,rbuf=>rec_buf);u3:transferportmap(bclkt=>b,resett=>reset,xmit_cmd_p=>xmit_cmd_p_in,txdbuf=>txdbuf_in,txd=>txd_out,txd_done=>txd_done_out);endBehavioral;顶层程序仿真:4、 2波特率发生器程序- -文件名:baud、vhd、- -功能:将外部输入的32MHz的信号分成频率为153600Hz的信号。libraryIEEE;useIEEE、ST

19、D_LOGIC_1164、ALL;useIEEE、STD_LOGIC_ARITH、ALL;useIEEE、STD_LOGIC_UNSIGNED、ALL;entitybaudisPort(clk,resetb:instd_logic;bclk:outstd_logic);endbaud;architectureBehavioralofbaudisbeginprocess(clk,resetb)variablecnt:integer;beginifresetb='1'thencnt:=0;bclk<='0'-复位elsifrising_edge(clk)the

20、nifcnt>=208thencnt:=0;bclk<='1'-设置分频系数elsecnt:=cnt+1;bclk<='0'endif;endif;endprocess;endBehavioral;波特率发生器程序仿真图5、2波特率发生器仿真3、3UART发送器程序- -文件名:transfer、vhd。- -功能:UART发送器。- -说明:系统由五个状态(x_idle,x_start,x_wait,x_shift,x_stop)与一个进程构成。libraryIEEE;useIEEE、STD_LOGIC_1164、ALL;useIEEE、ST

21、D_LOGIC_ARITH、ALL;useIEEE、STD_LOGIC_UNSIGNED、ALL;entitytransferisgeneric(framlent:integer:=8);Port(bclkt,resett,xmit_cmd_p:instd_logic;-定义输入输出信号txdbuf:instd_logic_vector(7downto0):="11001010"txd:outstd_logic;txd_done:outstd_logic);endtransfer;architectureBehavioraloftransferis-定义个子状态-主控时序、

22、组合typestatesis(x_idle,x_start,x_wait,x_shift,x_stop);signalstate:states:=x_idle;signaltcnt:integer:=0;beginprocess(bclkt,resett,xmit_cmd_p,txdbuf)进程variablexcnt16:std_logic_vector(4downto0):="00000"-定义中间变量variablexbitcnt:integer:=0;variabletxds:std_logic;beginifresett='1'thenstate&

23、lt;=x_idle;txd_done<='0'txds:='1'-复位elsifrising_edge(bclkt)thencasestateis-状态1,等待数据帧发送whenxidle=>命令ifxmit_cmd_p='1'thenstate<=x_start;txd_done<='0'elsestate<=x_idle;endif;whenx_start=>-状态2,发送信号至起始位ifxcnt16>="01111"thenstate<=x_wait;xc

24、nt16:="00000"elsexcnt16:=xcnt16+1;txds:='0'state<=x_start;endif;whenx_wait=>-状态3,等待状态ifxcnt16>="01110"thenifxbitcnt=framlentthenstate<=x_stop;xbitcnt:=0;xcnt16:="00000"elsestate<=x_shift;endif;elsexcnt16:=xcnt16+1;state<=x_wait;endif;whenx_shif

25、t=>txds:=txdbuf(xbitcnt);xbitcnt:=xbitcnt+1;state<=x_wait;-状态4,将待发数据进行并用转换whenx_stop=>-状态5,停止位发送状态ifxcnt16>="01111”thenifxmit_cmd_p='0'thenstate<=x_idle;xcnt16:="00000”;elsexcnt16:=xcnt16;state<=x_stop;endif;txd_done<='1'elsexcnt16:=xcnt16+1;txds:='

26、1'state<=x_stop;endif;whenothers=>state<=x_idle;endcase;endif;txd<=txds;endprocess;endBehavioral;UART发送器仿真:3、4UART接收器程序- -文件名:reciever、vhd。- -功能:UART接受器。- -说明:系统由五个状态(r_start,r_center,r_wait,r_sample,r_stop分两个进-程构成libraryIEEE;useIEEE、STD_LOGIC_1164、ALL;useIEEE、STD_LOGIC_ARITH、ALL;use

27、IEEE、STD_LOGIC_UNSIGNED、ALL;entityrecieverisgeneric(framlenr:integer:=8);Port(bclkr,resetr,rxdr:instd_logic;-定义输入输出信号r_ready:outstd_logic;rbuf:outstd_logic_vector(7downto0);endreciever;architectureBehavioralofrecieveristypestatesis(r_start,r_center,r_wait,r_sample,r_stop);-定义各子状态signalstate:states:=

28、r_start;signalrxd_sync:std_logic;beginpro1:process(rxdr)beginifrxdr='0'thenrxd_sync<='0'elserxd_sync<='1'endif;endprocess;-主控时序、 组pro2:process(bclkr,resetr,rxd_sync)合进程variable count:std_logic_vector(3 downto 0);量variable rcnt:integer:=0;variable rbufs:std_logic_vector(

29、7 downto 0);beginif resetr='1' then state<=r_start; count:="0000"elsif rising_edge(bclkr) thencase state iswhen r_start=>始位-定义中间变-复位-状态1,等待起ifrxd_sync='0'thenstate<=r_center;r_ready<='0'rcnt:=0;elsestate<=r_start;r_ready<='0'endif;whenr_cen

30、ter=>-状态2,求出每位的中点ifrxd_sync='0'thenifcount="0100"thenstate<=r_wait;count:="0000"elsecount:=count+1;state<=r_center;endif;elsestate<=r_start;endif;whenr_wait=>-状态3,等待状态ifcount>="1110"thencount:="0000"ifrcnt=framlenrthenstate<=r_stop;elsestat

温馨提示

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

评论

0/150

提交评论