通用异步接收发送器的设计和实现_第1页
通用异步接收发送器的设计和实现_第2页
通用异步接收发送器的设计和实现_第3页
通用异步接收发送器的设计和实现_第4页
通用异步接收发送器的设计和实现_第5页
已阅读5页,还剩34页未读 继续免费阅读

下载本文档

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

文档简介

1、EDAEDA原理及应用原理及应用第 12章 本章给出了PLD器件在简单通信系统的应用-UART设计。通用异步接收/发送器的设计也是PLD在通信系统的经典应用。 该章首先介绍了UART设计原理,其中包括UART原理和设计描述、接收模块设计,随后介绍了UART的VHDL代码描述,最后介绍了URAT的软件仿真验证和硬件验证。UART的设计和实现-本章概要 UART的设计和实现l 基于通用异步接收发送器UART的RS-232接口是以前计算机上提供的一个串行数据接口,用来将接收的串行数据转换成并行数据,同时将并行数据转换成串行数据后发送出去。当PLD和其它外设通过串口通信时就非常有用。 UART发送的数

2、据,经过电平转换后,传送到PLD的外部串行总线接口,然后这些串行数据被送到PLD内部进行处理。被处理的数据然后转换为串行数据经电平转换后传回串口。并行/串行和串行/并行数据转换使用用户定义的奇偶校验位(缺省设置为奇校验)数据波特率可修改(缺省9600)包含测试代码和测试向量设计包含以下几个方面 UART的设计和实现 UARTRXD TXD DBIN DBOUTRDA RDARD TBEWR PERST OE FE UART的设计和实现符号描述图符号描述图 UART设计主要包括两部分:并行数据转化成串行数据,串行数据转换成并行数据。UART设计的接收端口将接收到的串行数据转换成并行数据,同时UA

3、RT的发送端口负责并行数据转换成串行数据。测试代码完成对UART设计的验证,该验证已经在Xilinx大学计划提供的开发平台进行了验证,该设计也很容易的移植到其它的EDA平台上。原理的设计和描述原理的设计和描述 接收模块接收模块RXD DBOUT RDA RDARD PECLK OE FE 发送模块发送模块DBIN TXD WR TBE CLK 原理的设计和描述原理的设计和描述 UART设计包含两个主要模块,这两个模块封装在一个UART的设计文件中。这两个模块一个处理接收的串行数据,另一个处理发送的串行数据。接收模块的端口接收一个字节的有效数据,并将其转换成8位的并行数据。转换的并行数据放在DB

4、OUT端口。发送模块将发送的数据送到DBIN端口,并且将其转换成一个字节的串行发送数据,转换完的数据TXD端口上。原理的设计和描述原理的设计和描述 接收模块接收串行数据并将其转换为并行数据。该设计包括下面几个部分:串行数据控制器用于同步的两个计数器移位寄存器,移位寄存器保存来自RXD的数据。错误比特控制器。 来自RXD串口的数据以一定的波特率被接收,所以需要有个控制器同步接收数据的采集相位。串行同步控制器的设计采用了一个状态机和两个同步计数器。在设计中,在每个接收比特数据的中间采集数据。接收模块的设计接收模块的设计Datactr!=”1010”ctr(3)=1 ordatactr!=”1010

5、”RXD=1idledataRst=1ctRst=1EightDelaydataRst=1Waitfor0Waitfor1CheckStopCE=1GetDatadataIncr=1rShift=1RSTRXD=0ctr!=”1000”ctr!=”1000”Ctr(3)=0Ctr(3)=1Ctr(3)=0andDatactr!=”1010”接收模块状态机的状态图接收模块状态机的状态图 当处于idle状态时,串行数据管脚RXD处于高电平状态,在该状态一直等待直到检测到RXD为低电平时,进入到EightDelay状态。 在该状态,主要是进行同步,使得在每个比特位的中间采样数据,计数器ctr比波特率

6、快16倍。在该状态下,ctr计数到8。然后进入到WaitFor0状态,waitfor1状态跟在其后,这两个状态的转移由ctr的最高两位确定。进入到GetData状态时,开始对RXD数据进行移位。 这两个状态保证有足够的延迟保证读取采样数据的正中间。当计数器计数到10(8个数据位、一个奇偶位和一个停止位),然后进入到CheckStop状态。这个状态进行奇偶校验。当该状态结束后,进入到idle状态。接收模块状态机的状态图接收模块状态机的状态图 START D0 D1 D2 D3 D4 D5 D6 D7 PAR STOP对接收数据进行采样的时序的描述对接收数据进行采样的时序的描述 差错控制寄存器分析

7、接收到的数据,并对三种错误进行判断:奇偶错、帧错误和溢出错误。 奇偶错误指接收数据的得到的校验和与接收到的Par不一样。当进行偶校验的时候,D0到D7的和应该是偶数,否则是奇校验。该设计中缺省设置为偶校验。当奇偶校验错误时,PE端口为高。 帧错误是指UART在给定的时序没有正确的读到数据。当停止位不为1时,表示帧错误,此时FE端口为1。 溢出错误是指,当前帧接收完,但还没有读时下一帧数据就到了的情况。当单字节的串行数据可读时RDA为高,移位后的并行数据放在DBOUT端口。一旦RDA端口为高,且此时数据仍在DBOUT端口时,OE溢出错误标志为高。 差错控制的实现差错控制的实现 发送模块接收来自D

8、BIN模块的数据,并以串行数据的发送发送到TxD端口上。发送端口的波特率和接收数据的波特率一样,接收和发送波特率的修改方式一样。为了发送存储在DBIN端口的数据,发送模块必须有一个发送控制器、两个控制数据的波特率的同步计数器和发送移位寄存器。两个计数器中的一个计数器用于延迟发送控制器,另一个计数器用来计算发送的串行数据位的个数。TXD端口和发送移位寄存器的最低位连接。 发送模块的状态机的设计发送模块的状态机的设计tfctr=”1001”WR=0idletdelayRst=1TBE=1Transfertdelayrst=load=1tclkrst=1ShiftShift=1Tfctr=1Dela

9、yCheckStopCE=1RSTWR=1Tfctr!=”1001”Tdelayctr=bandrate发送模块的状态机的状态图发送模块的状态机的状态图 UART在idel状态,当WR为高时状态发生变化。然后,发送模块加载DBIN端口的数据,下一个状态发送数据。 Transfer状态准备发送移位寄存器发送数据。设置load=1,移位寄存器开始加载数据,其顺序是一个起始位、一个字节的DBIN数据、一个奇偶校验位和一个停止位。下一个状态进入到shift状态。在该状态下,移位信号置1,表示移位寄存器移1。Tfincr信号也置1表示递增数据计数器。如果数据计数器不等于9,表示发送移位寄存器没有进行移位

10、操作,此时进入delay状态。如果移位完成,此时进入WaitWrite状态。发送模块的状态机发送模块的状态机 在delay状态下,发送数据按照正确的波特率发送数据。当tdelayctr与波特率常数一样时,结束该状态。进入到Shift状态。一旦进入到waitwrite状态,结束发送过程。在这个状态需要确认WR信号为高,才能开始发送过程。 发送模块的状态机发送模块的状态机发送模块的状态机内部结构发送模块的状态机内部结构entity UARTcomponent isPort (TXD : out std_logic:= 1; RXD : in std_logic; CLK : in std_logi

11、c; DBIN : in std_logic_vector (7 downto 0); DBOUT : out std_logic_vector (7 downto 0); RDA: inout std_logic; TBE: out std_logic := 1; RD: in std_logic; WR: in std_logic; PE : out std_logic; FE : out std_logic; OE: out std_logic; RST: in std_logic:= 0);end UARTcomponent;UART的的VHDL设计代码设计代码architecture

12、 Behavioral of UARTcomponent is type rstate is(strIdle,strEightDelay,strGetData,strWaitFor0,strWaitFor1,strCheckStop); type tstate is (sttIdle,sttTransfer,sttShift,sttDelay,sttWaitWrite); constant baudDivide : std_logic_vector(8 downto 0) := 101000110; signal rdReg : std_logic_vector(7 downto 0) :=

13、00000000; signal rdSReg : std_logic_vector(9 downto 0) := 1111111111; signal tfReg : std_logic_vector(7 downto 0); signal clkDiv : std_logic_vector(9 downto 0):= 0000000000; signal ctr : std_logic_vector(3 downto 0):= 0000; signal tfCtr : std_logic_vector(3 downto 0):= 0000 signal dataCtr : std_logi

14、c_vector(3 downto 0):= 0000;UART的的VHDL设计代码设计代码 signal parError : std_logic;signal frameError : std_logic;signal CE :std_logic; signal ctRst : std_logic := 0;signal load : std_logic := 0;signal shift : std_logic := 0;signal par : std_logic; signal tClkRST : std_logic := 0;signal rShift : std_logic :=

15、 0;signal dataRST :std_logic := 0;signal dataIncr : std_logic := 0;signal tfIncr :std_logic := 0;signal tDelayCtr :std_logic_vector (12 downto 0);signal tDelayRst :std_logic := 0;signal strCur : rstate:= strIdle; signal strNext : rstate;signal sttCur : tstate:= sttIdle;signal sttNext : tstate;UART的的

16、VHDL设计代码设计代码begin-Title: Initial signal definitions-frameError = not rdSReg(9);parError = not ( rdSReg(8) xor (rdSReg(0) xor rdSReg(1) xor (rdSReg(2) xor rdSReg(3) xor (rdSReg(4) xor rdSReg(5) xor (rdSReg(6) xor rdSReg(7) );DBOUT = rdReg;tfReg = DBIN; TXD = tfsReg(0);par = not ( (tfReg(0) xor tfReg(

17、1) xor (tfReg(2) xor tfReg(3) xor (tfReg(4) xor tfReg(5) xor (tfReg(6) xor tfReg(7) );UART的的VHDL设计代码设计代码-Title: Clock Divide counter - process (CLK, clkDiv) beginif (CLK = 1 and CLKevent) then if (clkDiv = baudDivide or ctRst = 1) thenclkDiv = 0000000000; else clkDiv = clkDiv +1; end if;end if; end

18、process;UART的的VHDL设计代码设计代码-Title: Transfer delay counter -process (CLK, tDelayCtr)beginif (CLK = 1 and CLKevent) then if (tDelayCtr = baudRate or tDelayRst = 1) then tDelayCtr = 0000000000000; else tDelayCtr = tDelayCtr+1; end if;end if;end process;-UART的的VHDL设计代码设计代码-Title: ctr set up -process (CLK

19、)begin if CLK = 1 and CLKEvent thenif ctRst = 1 then ctr = 0000; elsif clkDiv = baudDivide then ctr = ctr + 1;else ctr = ctr; end if; end if;end process;UART的的VHDL设计代码设计代码-Title: transfer counter -process (CLK, tClkRST) beginif (CLK = 1 and CLKevent) then if tClkRST = 1 then tfCtr = 0000; elsif tfIn

20、cr = 1 then tfCtr = tfCtr +1; end if;end if;end process;UART的的VHDL设计代码设计代码-Title: Error and RDA flag controller -process (CLK, RST, RD, CE)begin if RD = 1 or RST = 1 thenFE = 0;OE = 0;RDA = 0;PE = 0; elsif CLK = 1 and CLKevent then if CE = 1 thenFE = frameError;PE = parError;rdReg(7 downto 0) = rdSR

21、eg (7 downto 0); if RDA = 1 then OE = 1; else OE = 0; RDA = 1; end if; end if; end if;end process;UART的的VHDL设计代码设计代码-Title: Receiving shift register - process (CLK, rShift)beginif CLK = 1 and CLKEvent then if rShift = 1 thenrdSReg = (RXD & rdSReg(9 downto 1); end if;end if;end process;-UART的的VHD

22、L设计代码设计代码-Title: Incoming Data counter - process (CLK, dataRST)beginif (CLK = 1 and CLKevent) thenif dataRST = 1 then dataCtr = 0000; elsif dataIncr = 1 then dataCtr = dataCtr +1;end if; end if;end process;UART的的VHDL设计代码设计代码-Title: Receiving State Machine controller -process (CLK, RST)beginif CLK =

23、1 and CLKEvent then if RST = 1 then strCur = strIdle; else strCur dataIncr = 0; rShift = 0; dataRst = 1;CE = 0; ctRst = 1;if RXD = 0 then strNext = strEightDelay;else strNext dataIncr = 0; rShift = 0; dataRst = 1; CE = 0; ctRst = 0;if ctr(3 downto 0) = 1000 then strNext = strWaitFor0;else strNext CE

24、 = 0;dataRst = 0;ctRst = 0; dataIncr = 1;rShift = 1;strNext CE = 0; dataRst = 0;ctRst = 0; dataIncr = 0; rShift = 0;if dataCtr = 1010 then strNext = strCheckStop;elsif ctr(3) = 0 then strNext = strWaitFor1;else strNext CE = 0; dataRst = 0; ctRst = 0;dataIncr =0; rShift = 0;if ctr(3) = 0 then strNext

25、 = strWaitFor1;else strNext dataIncr = 0;rShift = 0;dataRst = 0;ctRst = 0;CE = 1;strNext = strIdle; end case;end process;UART的的VHDL设计代码设计代码-Title: Transfer shift register controller -process (load, shift, CLK, tfSReg)begin if CLK = 1 and CLKEvent then if load = 1 then tfSReg (10 downto 0) = (1 &

26、 par & tfReg(7 downto 0) &0); elsif shift = 1 then tfSReg (10 downto 0) = (1 & tfSReg(10 downto 1); end if;end if;end process;-UART的的VHDL设计代码设计代码-Title: Transfer State Machine controller -process (CLK, RST)beginif (CLK = 1 and CLKEvent) thenif RST = 1 then sttCur = sttIdle;else sttCur TBE = 1;tClkRST = 0; tfIncr = 0; shift = 0; load = 0;tDelayRst = 1; if WR = 0 then

温馨提示

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

评论

0/150

提交评论