通用异步接收发送器 的设计和实现

39
该该该该该该 <<EDA 该该该 VHDL>> 该该该该该该该 一书 该该该该 , 该该该该该该该该该该 该该该该该该该该该 该该该该该该该该该 该该该该该该 该该该该该该 该该 该该 2011.09 2011.09

Upload: thornton-cedric

Post on 01-Jan-2016

165 views

Category:

Documents


1 download

DESCRIPTION

通用异步接收发送器 的设计和实现. 何宾 2011.09. UART 的设计和实现 - 本章概要. 本章给出了 PLD 器件在简单通信系统的应用 -UART 设计。 通用异步接收 / 发送器的设计也是 PLD 在通信系统的经典应 用。该章首先介绍了 UART 设计原理,其中包括 UART 原 理和设计描述、接收模块设计,随后介绍了 UART 的 VHDL 代码描述,最后介绍了 URAT 的软件仿真验证和硬 件验证。. UART 的设计和实现 - 设计原理. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: 通用异步接收发送器       的设计和实现

该电子教案为 <<EDA 原理及 VHDL>> 一书的配套教学资源版权所有 , 不得用于其它商业用途

通用异步接收发送器通用异步接收发送器 的设计和实现 的设计和实现

何宾何宾2011.092011.09

Page 2: 通用异步接收发送器       的设计和实现

UARTUART 的设计和实现的设计和实现 -- 本章概要本章概要

本章给出了本章给出了 PLDPLD 器件在简单通信系统的应用器件在简单通信系统的应用 -UART-UART 设设计。计。

通用异步接收通用异步接收 // 发送器的设计也是发送器的设计也是 PLDPLD 在通信系统的经典在通信系统的经典应应

用。该章首先介绍了用。该章首先介绍了 UARTUART 设计原理,其中包括设计原理,其中包括 UARTUART原原

理和设计描述、接收模块设计,随后介绍了理和设计描述、接收模块设计,随后介绍了 UARTUART 的的VHDLVHDL 代码描述,最后介绍了代码描述,最后介绍了 URATURAT 的软件仿真验证和硬的软件仿真验证和硬件验证。件验证。

Page 3: 通用异步接收发送器       的设计和实现

UARTUART 的设计和实现的设计和实现 -- 设计原理设计原理

基于通用异步接收发送器基于通用异步接收发送器 UARTUART 的的 RS-232RS-232 接口是接口是以前计算机上提供的一个串行数据接口,用来将接收的以前计算机上提供的一个串行数据接口,用来将接收的串行数据转换成并行数据,同时将并行数据转换成串行串行数据转换成并行数据,同时将并行数据转换成串行数据后发送出去。当数据后发送出去。当 PLDPLD 和其它外设通过串口通信时和其它外设通过串口通信时就非常有用。就非常有用。 UARTUART 发送的数据,经过电平转换后,传发送的数据,经过电平转换后,传送到送到 PLDPLD 的外部串行总线接口,然后这些串行数据被的外部串行总线接口,然后这些串行数据被送到送到 PLDPLD 内部进行处理。被处理的数据然后转换为串内部进行处理。被处理的数据然后转换为串行数据经电平转换后传回串口。 行数据经电平转换后传回串口。

Page 4: 通用异步接收发送器       的设计和实现

UARTUART 的设计和实现的设计和实现 -- 设计原理设计原理

该设计包含下面几个方面:该设计包含下面几个方面:并行并行 // 串行和串行串行和串行 // 并行数据转换并行数据转换使用用户定义的奇偶校验位(缺省设置为奇校使用用户定义的奇偶校验位(缺省设置为奇校

验)验)数据波特率可修改(缺省数据波特率可修改(缺省 96009600 ))包含测试代码和测试向量包含测试代码和测试向量

Page 5: 通用异步接收发送器       的设计和实现

UARTUART 的设计和实现的设计和实现 -- 符号描述图符号描述图

UART

RXD TXD DBIN DBOUTRDA RDARD TBEWR PERST E FE

Page 6: 通用异步接收发送器       的设计和实现

UARTUART 的设计和实现的设计和实现 -- 原理和设计描述原理和设计描述

UARTUART 设计主要包括两部分:并行数据转化成串行数设计主要包括两部分:并行数据转化成串行数据,串行数据转换成并行数据。据,串行数据转换成并行数据。 UARTUART 设计的接收端口将接收到的串行数据转换成设计的接收端口将接收到的串行数据转换成并行数据,同时并行数据,同时 UARTUART 的发送端口负责并行数据转换成串的发送端口负责并行数据转换成串行数据。 行数据。 测试代码完成对测试代码完成对 UARTUART 设计的验证,该验证已经在设计的验证,该验证已经在XilinxXilinx 大学计划提供的开发平台进行了验证,该设计也很大学计划提供的开发平台进行了验证,该设计也很容易的移植到其它的容易的移植到其它的 EDAEDA 平台上。平台上。

Page 7: 通用异步接收发送器       的设计和实现

UARTUART 的设计和实现的设计和实现 -- 原理和设计描述符原理和设计描述符号号

接收模块

RXD DBOUT RDA RDARD PECLK OE FE

发送模块

DBIN TXD WR TBE

CLK

Page 8: 通用异步接收发送器       的设计和实现

UARTUART 的设计和实现的设计和实现 -- 原理和设计描述原理和设计描述

UARTUART 设计包含两个主要模块,这两个模块封装在一设计包含两个主要模块,这两个模块封装在一个个 UARTUART 的设计文件中。的设计文件中。 这两个模块一个处理接收的串行数据,另一个处理发这两个模块一个处理接收的串行数据,另一个处理发送的串行数据。送的串行数据。 接收模块的端口接收一个字节的有效数据,并将其转接收模块的端口接收一个字节的有效数据,并将其转换成换成 88 位的并行数据。转换的并行数据放在位的并行数据。转换的并行数据放在 DBOUTDBOUT 端口。端口。 发送模块将发送的数据送到发送模块将发送的数据送到 DBINDBIN 端口,并且将其转端口,并且将其转

换换成一个字节的串行发送数据,转换完的数据成一个字节的串行发送数据,转换完的数据 TXDTXD 端口上。端口上。

Page 9: 通用异步接收发送器       的设计和实现

UARTUART 的设计和实现的设计和实现 -- 接收模块的设计接收模块的设计

接收模块接收串行数据并将其转换为并行数据。该接收模块接收串行数据并将其转换为并行数据。该设计包括下面几个部分:设计包括下面几个部分:

串行数据控制器串行数据控制器用于同步的两个计数器用于同步的两个计数器移位寄存器移位寄存器 ,, 移位寄存器保存来自移位寄存器保存来自 RXDRXD 的数据。的数据。错误比特控制器。错误比特控制器。

来自来自 RXDRXD 串口的数据以一定的波特率被接收,所以串口的数据以一定的波特率被接收,所以需要有个控制器同步接收数据的采集相位。串行同步控需要有个控制器同步接收数据的采集相位。串行同步控制器的设计采用了一个状态机和两个同步计数器。在设制器的设计采用了一个状态机和两个同步计数器。在设计中,在每个接收比特数据的中间采集数据。计中,在每个接收比特数据的中间采集数据。

Page 10: 通用异步接收发送器       的设计和实现

UARTUART 的设计和实现的设计和实现 - 接收模块状态机

Datactr!=”1010”

ctr(3)=’1’ ordatactr!=”1010”RXD=’1’

idledataRst=’1’ctRst=’1’

EightDelay

dataRst=’1’

Waitfor0

Waitfor1CheckStopCE=’1’

GetData

dataIncr=’1’rShift=’1’

RSTRXD=’0’

ctr!=”1000”

ctr!=”1000”

Ctr(3)=’0’Ctr(3)=’1’

Ctr(3)=’0’andDatactr!=”1010”

Page 11: 通用异步接收发送器       的设计和实现

UARTUART 的设计和实现的设计和实现 - 接收模块状态机原理

当处于当处于 idleidle 状态时,串行数据管脚状态时,串行数据管脚 RXDRXD 处于高电平状处于高电平状态,在该状态一直等待直到检测到态,在该状态一直等待直到检测到 RXDRXD 为低电平时,进入为低电平时,进入到到 EightDelayEightDelay 状态。状态。 在该状态,主要是进行同步,使得在每个比特位的中间在该状态,主要是进行同步,使得在每个比特位的中间采样数据,计数器采样数据,计数器 ctrctr 比波特率快比波特率快 1616 倍。在该状态下,倍。在该状态下, ctrctr

计计数到数到 88 。然后进入到。然后进入到 WaitFor0WaitFor0 状态,状态, waitfor1waitfor1 状态跟在其状态跟在其后,这两个状态的转移由后,这两个状态的转移由 ctrctr 的最高两位确定。进入到的最高两位确定。进入到GetDataGetData 状态时,开始对状态时,开始对 RXDRXD 数据进行移位。数据进行移位。

Page 12: 通用异步接收发送器       的设计和实现

UARTUART 的设计和实现的设计和实现 - 接收模块状态机原理 这两个状态保证有足够的延迟保证读取采样数据的这两个状态保证有足够的延迟保证读取采样数据的正中间。当计数器计数到正中间。当计数器计数到 1010 (( 88 个数据位、一个奇偶个数据位、一个奇偶

位位和一个停止位),然后进入到和一个停止位),然后进入到 CheckStopCheckStop 状态。这个状状态。这个状态进行奇偶校验。当该状态结束后,进入到态进行奇偶校验。当该状态结束后,进入到 idleidle 状态。状态。

START D0 D1 D2 D3 D4 D5 D6 D7 PAR STOP

对接收数据进行采样的时序的描述

Page 13: 通用异步接收发送器       的设计和实现

UARTUART 的设计和实现的设计和实现 -- 差错控制的实现差错控制的实现 差错控制寄存器分析接收到的数据,并对三种错误进差错控制寄存器分析接收到的数据,并对三种错误进行判断:奇偶错、帧错误和溢出错误。行判断:奇偶错、帧错误和溢出错误。 奇偶错误指接收数据的得到的校验和与接收到的奇偶错误指接收数据的得到的校验和与接收到的 ParPar 不不一样。当进行偶校验的时候,一样。当进行偶校验的时候, D0D0 到到 D7D7 的和应该是偶数,的和应该是偶数,否则是奇校验。该设计中缺省设置为偶校验。当奇偶校验否则是奇校验。该设计中缺省设置为偶校验。当奇偶校验错误时,错误时, PEPE 端口为高。端口为高。 帧错误是指帧错误是指 UARTUART 在给定的时序没有正确的读到数在给定的时序没有正确的读到数据。当停止位不为据。当停止位不为 11 时,表示帧错误,此时时,表示帧错误,此时 FEFE 端口为端口为 11 。 。

溢出错误是指,当前帧接收完,但还没有读时下一帧溢出错误是指,当前帧接收完,但还没有读时下一帧数据就到了的情况。当单字节的串行数据可读时数据就到了的情况。当单字节的串行数据可读时 RDARDA 为为高,移位后的并行数据放在高,移位后的并行数据放在 DBOUTDBOUT 端口。一旦端口。一旦 RDARDA 端口端口为高,且此时数据仍在为高,且此时数据仍在 DBOUTDBOUT 端口时,端口时, OEOE 溢出错误标志溢出错误标志为高。为高。

Page 14: 通用异步接收发送器       的设计和实现

UARTUART 的设计和实现的设计和实现- 接收模块内各个子模块的连接关系

Page 15: 通用异步接收发送器       的设计和实现

UARTUART 的设计和实现的设计和实现 -- 发送模块的设计发送模块的设计

发送模块接收来自发送模块接收来自 DBINDBIN 模块的数据,并以串行数据模块的数据,并以串行数据的发送发送到的发送发送到 TxDTxD 端口上。端口上。 发送端口的波特率和接收数据的波特率一样,接收和发送端口的波特率和接收数据的波特率一样,接收和发送波特率的修改方式一样。发送波特率的修改方式一样。 为了发送存储在为了发送存储在 DBINDBIN 端口的数据,发送模块必须有端口的数据,发送模块必须有一个发送控制器、两个控制数据的波特率的同步计数器和一个发送控制器、两个控制数据的波特率的同步计数器和发送移位寄存器。发送移位寄存器。 两个计数器中的一个计数器用于延迟发送控制器,另两个计数器中的一个计数器用于延迟发送控制器,另一个计数器用来计算发送的串行数据位的个数。一个计数器用来计算发送的串行数据位的个数。 TXDTXD 端口端口和发送移位寄存器的最低位连接。和发送移位寄存器的最低位连接。

Page 16: 通用异步接收发送器       的设计和实现

UARTUART 的设计和实现的设计和实现 -- 发送模块的状态机

tfctr=”1001”

WR=‘0’

idletdelayRst=’1’

TBE=’1’

Transfertdelayrst=’load=’1’

tclkrst=’1’’

Shift

Shift=’1’Tfctr=’1’

DelayCheckStopCE=’1’

RST WR=’1’

Tfctr!=”1001”Tdelayctr=bandrate

Page 17: 通用异步接收发送器       的设计和实现

UARTUART 的设计和实现的设计和实现 - 发送模块的状态机

UARTUART 在在 idelidel 状态,当状态,当 WRWR 为高时状态发生变化。然为高时状态发生变化。然后,发送模块加载后,发送模块加载 DBINDBIN 端口的数据,下一个状态发送数端口的数据,下一个状态发送数据。据。 TransferTransfer 状态准备发送移位寄存器发送数据。设置状态准备发送移位寄存器发送数据。设置load=’1’load=’1’ ,移位寄存器开始加载数据,其顺序是一个起始,移位寄存器开始加载数据,其顺序是一个起始位、一个字节的位、一个字节的 DBINDBIN 数据、一个奇偶校验位和一个停止数据、一个奇偶校验位和一个停止位。下一个状态进入到位。下一个状态进入到 shiftshift 状态。在该状态下,移位信号状态。在该状态下,移位信号置‘置‘ 1’1’ ,表示移位寄存器移,表示移位寄存器移 11 。。 TfincrTfincr 信号也置信号也置 11 表示递增数表示递增数据计数器。如果数据计数器不等于据计数器。如果数据计数器不等于 99 ,表示发送移位寄存,表示发送移位寄存器没有进行移位操作,此时进入器没有进行移位操作,此时进入 delaydelay 状态。如果移位完状态。如果移位完成,此时进入成,此时进入 WaitWriteWaitWrite 状态。状态。

Page 18: 通用异步接收发送器       的设计和实现

UARTUART 的设计和实现的设计和实现 - 发送模块的状态机

在在 delaydelay 状态下,发送数据按照正确的波特率发送状态下,发送数据按照正确的波特率发送数数

据。当据。当 tdelayctrtdelayctr 与波特率常数一样时,结束该状态。与波特率常数一样时,结束该状态。进进

入到入到 ShiftShift 状态。一旦进入到状态。一旦进入到 waitwritewaitwrite 状态,结束发送状态,结束发送过过程。在这个状态需要确认程。在这个状态需要确认WRWR 信号为高,才能开始发信号为高,才能开始发

送送

过程。过程。

Page 19: 通用异步接收发送器       的设计和实现

UARTUART 的设计和实现的设计和实现- 发送模块的状态机内部结构

Page 20: 通用异步接收发送器       的设计和实现

UARTUART 的设计和实现的设计和实现 -UART-UART 的的 VHDLVHDL 设计设计代码代码

entity UARTcomponent isentity UARTcomponent is Port (Port ( TXD : out TXD : out std_logic:= '1'; std_logic:= '1'; RXD : in std_logic;RXD : in std_logic; CLK : in CLK : in std_logic; std_logic;

DBIN : in DBIN : in std_logic_vector (7 downto 0); std_logic_vector (7 downto 0); DBOUT DBOUT : out : out std_logic_vector (7 downto 0); std_logic_vector (7 downto 0); RDARDA : inout std_logic; : inout std_logic;

TBETBE : out : out std_logic := '1'; std_logic := '1'; RDRD : in : in std_logic; std_logic; WRWR : in : in std_logic; std_logic; PEPE : out : out std_logic; std_logic; FEFE : out : out std_logic; std_logic; OEOE : out : out std_logic; std_logic; RSTRST : in : in std_logic:= '0‘ std_logic:= '0‘

););end UARTcomponent;end UARTcomponent;

Page 21: 通用异步接收发送器       的设计和实现

UARTUART 的设计和实现的设计和实现 -UART-UART 的的 VHDLVHDL 设计设计代码代码

architecture Behavioral of UARTcomponent isarchitecture Behavioral of UARTcomponent is type rstate is(strIdle,strEightDelay,strGetData,strWaitFor0,strWaitFor1,strCheckStotype rstate is(strIdle,strEightDelay,strGetData,strWaitFor0,strWaitFor1,strCheckSto

p);p); type tstate is (sttIdle,sttTransfer,sttShift,sttDelay,sttWaitWrite);type tstate is (sttIdle,sttTransfer,sttShift,sttDelay,sttWaitWrite); constant baudRate :constant baudRate : std_logic_vector(12 downto 0) := "1010001011000"; std_logic_vector(12 downto 0) := "1010001011000"; constant baudDivide : std_logic_vector(8 downto 0) constant baudDivide : std_logic_vector(8 downto 0) := "101000110";:= "101000110"; signal rdRegsignal rdReg : : std_logic_vector(7 downto 0) std_logic_vector(7 downto 0) := "00000000";:= "00000000"; signal rdSReg : std_logic_vector(9 downto 0) signal rdSReg : std_logic_vector(9 downto 0) := "1111111111";:= "1111111111"; signal tfRegsignal tfReg : : std_logic_vector(7 downto 0);std_logic_vector(7 downto 0); signal tfSReg : signal tfSReg : std_logic_vector(10 downto 0) std_logic_vector(10 downto 0) := "11111111111";:= "11111111111"; signal clkDivsignal clkDiv : : std_logic_vector(9 downto 0)std_logic_vector(9 downto 0) := "0000000000";:= "0000000000"; signal ctrsignal ctr : : std_logic_vector(3 downto 0)std_logic_vector(3 downto 0) := "0000";:= "0000"; signal tfCtrsignal tfCtr : : std_logic_vector(3 downto 0)std_logic_vector(3 downto 0) := "0000":= "0000" signal dataCtr : signal dataCtr : std_logic_vector(3 downto 0)std_logic_vector(3 downto 0) := "0000";:= "0000";

Page 22: 通用异步接收发送器       的设计和实现

UARTUART 的设计和实现的设计和实现 -UART-UART 的的 VHDLVHDL 设计设计代码代码

signal parErrorsignal parError : : std_logic;std_logic;signal frameError : signal frameError : std_logic;std_logic;signal CEsignal CE : : std_logic;std_logic;

signal ctRstsignal ctRst : : std_logic std_logic := '0';:= '0';signal loadsignal load : : std_logic std_logic := '0';:= '0';signal shiftsignal shift : : std_logic std_logic := '0';:= '0';signal parsignal par : : std_logic;std_logic;

signal tClkRSTsignal tClkRST : : std_logic std_logic := '0';:= '0';signal rShiftsignal rShift : : std_logic std_logic := '0';:= '0';signal dataRST signal dataRST : : std_logic std_logic := '0';:= '0';signal dataIncrsignal dataIncr : : std_logic std_logic := '0';:= '0';signal tfIncrsignal tfIncr : : std_logicstd_logic := '0';:= '0';signal tDelayCtr :signal tDelayCtr :std_logic_vector (12 downto 0);std_logic_vector (12 downto 0);signal tDelayRstsignal tDelayRst : : std_logic := '0';std_logic := '0';signal strCursignal strCur : rstate : rstate := strIdle; := strIdle; signal strNextsignal strNext : rstate; : rstate;signal sttCur signal sttCur : tstate:= sttIdle; : tstate:= sttIdle;signal sttNext signal sttNext : tstate; : tstate;

Page 23: 通用异步接收发送器       的设计和实现

UARTUART 的设计和实现的设计和实现 -UART-UART 的的 VHDLVHDL 设计设计代码代码

beginbegin----------------------------------------------------------------------------------------------------------------------------------------------------Title: --Title: 初始信号定义初始信号定义--------------------------------------------------------------------------------------------------------------------------------------------------frameError <= not rdSReg(9);frameError <= not rdSReg(9);parError <= not ( rdSReg(8) xor (((rdSReg(0) xor rdSReg(1)) xor (rdSReg(2) xor rdSRparError <= not ( rdSReg(8) xor (((rdSReg(0) xor rdSReg(1)) xor (rdSReg(2) xor rdSR

eg(3))) xor ((rdSReg(4) xor rdSReg(5)) xor (rdSReg(6) xor rdSReg(7)))) );eg(3))) xor ((rdSReg(4) xor rdSReg(5)) xor (rdSReg(6) xor rdSReg(7)))) );DBOUT <= rdReg;DBOUT <= rdReg;tfReg <= DBIN;tfReg <= DBIN;TXD <= tfsReg(0);TXD <= tfsReg(0);par <= not ( ((tfReg(0) xor tfReg(1)) xor (tfReg(2) xor tfReg(3))) xor ((tfReg(4) xor tfpar <= not ( ((tfReg(0) xor tfReg(1)) xor (tfReg(2) xor tfReg(3))) xor ((tfReg(4) xor tf

Reg(5)) xor (tfReg(6) xor tfReg(7))) );Reg(5)) xor (tfReg(6) xor tfReg(7))) );

Page 24: 通用异步接收发送器       的设计和实现

UARTUART 的设计和实现的设计和实现 -UART-UART 的的 VHDLVHDL 设计设计代码代码

----------------------------------------------------------------------------------------------------------------------------------------------------Title: --Title: 时钟分频计数器 时钟分频计数器 -------------------------------------------------------------------------------------------------------------------------------------------------- process (CLK, clkDiv)process (CLK, clkDiv) beginbegin

if (CLK = '1' and CLK'event) thenif (CLK = '1' and CLK'event) then if (clkDiv = baudDivide or ctRst = '1') thenif (clkDiv = baudDivide or ctRst = '1') then

clkDiv <= "0000000000";clkDiv <= "0000000000"; elseelse

clkDiv <= clkDiv +1;clkDiv <= clkDiv +1; end if;end if;

end if;end if; end process;end process;

Page 25: 通用异步接收发送器       的设计和实现

----------------------------------------------------------------------------------------------------------------------------------------------------Title: --Title: 传输延迟计数器 传输延迟计数器 --------------------------------------------------------------------------------------------------------------------------------------------------process (CLK, tDelayCtr)process (CLK, tDelayCtr)beginbegin

if (CLK = '1' and CLK'event) thenif (CLK = '1' and CLK'event) then if (tDelayCtr = baudRate or tDelayRst = '1') thenif (tDelayCtr = baudRate or tDelayRst = '1') then tDelayCtr <= "0000000000000";tDelayCtr <= "0000000000000"; elseelse tDelayCtr <= tDelayCtr+1;tDelayCtr <= tDelayCtr+1; end if;end if;end if;end if;

end process;end process;--------------------------------------------------------------------------------------------------------------------------------------------------

UARTUART 的设计和实现的设计和实现 -UART-UART 的的 VHDLVHDL 设计设计代码代码

Page 26: 通用异步接收发送器       的设计和实现

----------------------------------------------------------------------------------------------------------------------------------------------------Title: ctr --Title: ctr 设置设置--------------------------------------------------------------------------------------------------------------------------------------------------

process (CLK)process (CLK)beginbegin if CLK = '1' and CLK'Event thenif CLK = '1' and CLK'Event then

if ctRst = '1' thenif ctRst = '1' then ctr <= "0000";ctr <= "0000";

elsif clkDiv = baudDivide then elsif clkDiv = baudDivide then ctr <= ctr + 1;ctr <= ctr + 1;

else else ctr <= ctr;ctr <= ctr; end if;end if;

end if;end if;end process;end process;

UARTUART 的设计和实现的设计和实现 -UART-UART 的的 VHDLVHDL 设计设计代码代码

Page 27: 通用异步接收发送器       的设计和实现

--------------------------------------------------------------------------------------------------------------------------------------------------------Title: --Title: 传输计数器传输计数器--------------------------------------------------------------------------------------------------------------------------------------------------process (CLK, tClkRST)process (CLK, tClkRST) beginbegin

if (CLK = '1' and CLK'event) thenif (CLK = '1' and CLK'event) then if tClkRST = '1' then if tClkRST = '1' then

tfCtr <= "0000";tfCtr <= "0000"; elsif tfIncr = '1' then elsif tfIncr = '1' then

tfCtr <= tfCtr +1; tfCtr <= tfCtr +1; end if;end if;

end if;end if;end process;end process;

UARTUART 的设计和实现的设计和实现 -UART-UART 的的 VHDLVHDL 设计设计代码代码

Page 28: 通用异步接收发送器       的设计和实现

----------------------------------------------------------------------------------------------------------------------------------------------------Title: --Title: 错误和错误和 RDARDA 标志控制器 标志控制器 --------------------------------------------------------------------------------------------------------------------------------------------------process (CLK, RST, RD, CE)process (CLK, RST, RD, CE)

beginbegin if RD = '1' or RST = '1' thenif RD = '1' or RST = '1' then

FE <= '0';FE <= '0';OE <= '0';OE <= '0';RDA <= '0';RDA <= '0';PE <= '0';PE <= '0';

elsif CLK = '1' and CLK'event thenelsif CLK = '1' and CLK'event then if CE = '1' thenif CE = '1' then

FE <= frameError;FE <= frameError;PE <= parError;PE <= parError;rdReg(7 downto 0) <= rdSReg (7 downto 0);rdReg(7 downto 0) <= rdSReg (7 downto 0); if RDA = '1' then OE <= '1';if RDA = '1' then OE <= '1'; else OE <= '0'; RDA <= '1';else OE <= '0'; RDA <= '1';

end if; end if; end if;end if;

end if;end if;end process;end process;

UARTUART 的设计和实现的设计和实现 -UART-UART 的的 VHDLVHDL 设计代设计代码码

Page 29: 通用异步接收发送器       的设计和实现

----------------------------------------------------------------------------------------------------------------------------------------------------Title: Receiving shift register --Title: Receiving shift register -------------------------------------------------------------------------------------------------------------------------------------------------- process (CLK, rShift)process (CLK, rShift)beginbegin

if CLK = '1' and CLK'Event thenif CLK = '1' and CLK'Event then if rShift = '1' thenif rShift = '1' then

rdSReg <= (RXD & rdSReg(9 downto 1));rdSReg <= (RXD & rdSReg(9 downto 1)); end if;end if;end if;end if;

end process;end process;--------------------------------------------------------------------------------------------------------------------------------------------------

UARTUART 的设计和实现的设计和实现 -UART-UART 的的 VHDLVHDL 设计代设计代码码

Page 30: 通用异步接收发送器       的设计和实现

----------------------------------------------------------------------------------------------------------------------------------------------------Title: --Title: 进入数据计数器 进入数据计数器 -------------------------------------------------------------------------------------------------------------------------------------------------- process (CLK, dataRST)process (CLK, dataRST)beginbegin

if (CLK = '1' and CLK'event) thenif (CLK = '1' and CLK'event) thenif dataRST = '1' thenif dataRST = '1' then

dataCtr <= "0000";dataCtr <= "0000"; elsif dataIncr = '1' thenelsif dataIncr = '1' then

dataCtr <= dataCtr +1;dataCtr <= dataCtr +1;end if;end if;

end if;end if;end process;end process;

UARTUART 的设计和实现的设计和实现 -UART-UART 的的 VHDLVHDL 设计代设计代码码

Page 31: 通用异步接收发送器       的设计和实现

----------------------------------------------------------------------------------------------------------------------------------------------------Title: --Title: 接收状态控制器 接收状态控制器 --------------------------------------------------------------------------------------------------------------------------------------------------process (CLK, RST)process (CLK, RST)beginbegin

if CLK = '1' and CLK'Event thenif CLK = '1' and CLK'Event then if RST = '1' then strCur <= strIdle;if RST = '1' then strCur <= strIdle; else strCur <= strNext; else strCur <= strNext;

end if;end if;end if;end if;

end process;end process;

UARTUART 的设计和实现的设计和实现 -UART-UART 的的 VHDLVHDL 设计代设计代码码

Page 32: 通用异步接收发送器       的设计和实现

----------------------------------------------------------------------------------------------------------------------------------------------------Title: --Title: 接收状态机 接收状态机 --------------------------------------------------------------------------------------------------------------------------------------------------process (strCur, ctr, RXD, dataCtr)process (strCur, ctr, RXD, dataCtr)begin begin case strCur iscase strCur is

when strIdle => dataIncr <= '0'; rShift <= '0'; dataRst <= '1';CE <= '0'; ctRst <= '1';when strIdle => dataIncr <= '0'; rShift <= '0'; dataRst <= '1';CE <= '0'; ctRst <= '1';if RXD = '0' then strNext <= strEightDelay;if RXD = '0' then strNext <= strEightDelay;else strNext <= strIdle; end if;else strNext <= strIdle; end if;

when strEightDelay => dataIncr <= '0'; rShift <= '0'; dataRst <= '1'; CE <= '0'; ctRst <= '0';when strEightDelay => dataIncr <= '0'; rShift <= '0'; dataRst <= '1'; CE <= '0'; ctRst <= '0';if ctr(3 downto 0) = "1000" then strNext <= strWaitFor0;if ctr(3 downto 0) = "1000" then strNext <= strWaitFor0;else strNext <= strEightDelay; end if;else strNext <= strEightDelay; end if;

when strGetData =>CE <= '0';dataRst <= '0';ctRst <= '0'; dataIncr <= '1';rShift <= '1';when strGetData =>CE <= '0';dataRst <= '0';ctRst <= '0'; dataIncr <= '1';rShift <= '1';strNext <= strWaitFor0;strNext <= strWaitFor0;

when strWaitFor0 =>when strWaitFor0 =>CE <= '0'; dataRst <= '0';ctRst <= '0'; dataIncr <= '0'; rShift <= '0';CE <= '0'; dataRst <= '0';ctRst <= '0'; dataIncr <= '0'; rShift <= '0';if dataCtr = "1010" then strNext <= strCheckStop;if dataCtr = "1010" then strNext <= strCheckStop;elsif ctr(3) = '0' then strNext <= strWaitFor1;elsif ctr(3) = '0' then strNext <= strWaitFor1;else strNext <= strWaitFor0; end if;else strNext <= strWaitFor0; end if;

when strWaitFor1 =>CE <= '0'; dataRst <= '0'; ctRst <= '0';dataIncr <='0'; rShift <= '0';when strWaitFor1 =>CE <= '0'; dataRst <= '0'; ctRst <= '0';dataIncr <='0'; rShift <= '0';if ctr(3) = '0' then strNext <= strWaitFor1;if ctr(3) = '0' then strNext <= strWaitFor1;else strNext <= strGetData; end if;else strNext <= strGetData; end if;

when strCheckStop =>dataIncr <= '0';rShift <= '0';dataRst <= '0';ctRst <= '0';CE <= '1';when strCheckStop =>dataIncr <= '0';rShift <= '0';dataRst <= '0';ctRst <= '0';CE <= '1';strNext <= strIdle;strNext <= strIdle;

end case;end case;end process;end process;

UARTUART 的设计和实现的设计和实现 -UART-UART 的的 VHDLVHDL 设计设计代码代码

Page 33: 通用异步接收发送器       的设计和实现

----------------------------------------------------------------------------------------------------------------------------------------------------Title: --Title: 传输移位寄存器控制器传输移位寄存器控制器--------------------------------------------------------------------------------------------------------------------------------------------------process (load, shift, CLK, tfSReg)process (load, shift, CLK, tfSReg)beginbegin if CLK = '1' and CLK'Event thenif CLK = '1' and CLK'Event then

if load = '1' thenif load = '1' then tfSReg (10 downto 0) <= ('1' & par & tfReg(7 downto 0) &'0');tfSReg (10 downto 0) <= ('1' & par & tfReg(7 downto 0) &'0'); elsif shift = '1' thenelsif shift = '1' then tfSReg (10 downto 0) <= ('1' & tfSReg(10 downto 1));tfSReg (10 downto 0) <= ('1' & tfSReg(10 downto 1)); end if;end if;end if;end if;

end process;end process;--------------------------------------------------------------------------------------------------------------------------------------------------

UARTUART 的设计和实现的设计和实现 -UART-UART 的的 VHDLVHDL 设计代设计代码码

Page 34: 通用异步接收发送器       的设计和实现

----------------------------------------------------------------------------------------------------------------------------------------------------Title: Transfer State Machine controller --Title: Transfer State Machine controller --------------------------------------------------------------------------------------------------------------------------------------------------process (CLK, RST)process (CLK, RST)beginbegin

if (CLK = '1' and CLK'Event) thenif (CLK = '1' and CLK'Event) thenif RST = '1' then sttCur <= sttIdle;if RST = '1' then sttCur <= sttIdle;else sttCur <= sttNext; end if;else sttCur <= sttNext; end if;end if;end if;

end process;end process;

UARTUART 的设计和实现的设计和实现 -UART-UART 的的 VHDLVHDL 设计代设计代码码

Page 35: 通用异步接收发送器       的设计和实现

----------------------------------------------------------------------------------------------------------------------------------------------------Title: --Title: 发送状态机发送状态机--------------------------------------------------------------------------------------------------------------------------------------------------process (sttCur, tfCtr, WR, tDelayCtr)process (sttCur, tfCtr, WR, tDelayCtr)begin begin case sttCur iscase sttCur is

when sttIdle => TBE <= '1';tClkRST <= '0'; tfIncr <= '0'; shift <= '0';when sttIdle => TBE <= '1';tClkRST <= '0'; tfIncr <= '0'; shift <= '0'; load <= '0';tDelayRst <= '1';load <= '0';tDelayRst <= '1'; if WR = '0' then sttNext <= sttIdle;if WR = '0' then sttNext <= sttIdle; else sttNext <= sttTransfer; end if;else sttNext <= sttTransfer; end if;

when sttTransfer =>TBE <= '0'; shift <= '0';load <= '1'; tClkRST <= '1';when sttTransfer =>TBE <= '0'; shift <= '0';load <= '1'; tClkRST <= '1'; tfIncr <= '0';tDelayRst <= '1';tfIncr <= '0';tDelayRst <= '1'; sttNext <= sttDelay;sttNext <= sttDelay;

when sttShift =>TBE <= '0';shift <= '1';load <= '0';tfIncr <= '1';tClkRST <= when sttShift =>TBE <= '0';shift <= '1';load <= '0';tfIncr <= '1';tClkRST <= '0';tDelayRst <= '0';'0';tDelayRst <= '0';

if tfCtr = "1001" then sttNext <= sttWaitWrite;if tfCtr = "1001" then sttNext <= sttWaitWrite;else sttNext <= sttDelay; end if;else sttNext <= sttDelay; end if;

UARTUART 的设计和实现的设计和实现 -UART-UART 的的 VHDLVHDL 设计代设计代码码

Page 36: 通用异步接收发送器       的设计和实现

when sttDelay =>TBE <= '0'; shift <= '0'; load <= '0'; when sttDelay =>TBE <= '0'; shift <= '0'; load <= '0'; tClkRst <= '0';tfIncr <= '0';tDelayRst <= '0';tClkRst <= '0';tfIncr <= '0';tDelayRst <= '0';

if tDelayCtr = baudRate then sttNext <= sttShift;if tDelayCtr = baudRate then sttNext <= sttShift; else sttNext <= sttDelay; end if;else sttNext <= sttDelay; end if;

when sttWaitWrite =>TBE <= '0';shift <= '0';load <= '0';tClkRst <= '0'; when sttWaitWrite =>TBE <= '0';shift <= '0';load <= '0';tClkRst <= '0'; tfIncr <= '0';tDelayRst <= '0';tfIncr <= '0';tDelayRst <= '0'; if WR = '1' then sttNext <= sttWaitWrite;if WR = '1' then sttNext <= sttWaitWrite;

else sttNext <= sttIdle; end if; else sttNext <= sttIdle; end if; end case;end case;

end process;end process; end Behavioral;end Behavioral;

UARTUART 的设计和实现的设计和实现 -UART-UART 的的 VHDLVHDL 设计代设计代码码

Page 37: 通用异步接收发送器       的设计和实现

UARTUART 的设计和实现的设计和实现 -UART-UART 设计验证设计验证

对对 UARTUART 的验证包括两个部分,串的验证包括两个部分,串 // 并转换和并并转换和并 // 串转串转换。在验证的时候,可以直接在换。在验证的时候,可以直接在 EDAEDA 平台上直接验证。该平台上直接验证。该设计在设计在 Digilent PegasusDigilent Pegasus 板上验证通过。该设计验证的方法板上验证通过。该设计验证的方法是盘扫描码通过是盘扫描码通过 PCPC 机上的超级终端以波特率机上的超级终端以波特率 96009600 发出,发出,通过串行传输后,然后再通过串行传输后,然后再 88 个个 LEDLED 上进行显示。然后这个上进行显示。然后这个键盘扫描码正确的传回来。键盘扫描码正确的传回来。 在不同的平台上进行验证的要求是,首先要完成前面在不同的平台上进行验证的要求是,首先要完成前面的的 VHDLVHDL 设计文件,然后完成用户约束文件,将平台上的设计文件,然后完成用户约束文件,将平台上的串口和串口和 PCPC 正确的连接。下面给出该设计验证的结构图。正确的连接。下面给出该设计验证的结构图。

Page 38: 通用异步接收发送器       的设计和实现

UARTUART 的设计和实现的设计和实现 -UART-UART 设计验证设计验证

Page 39: 通用异步接收发送器       的设计和实现

习题习题

11 、说明基于、说明基于 PLDPLD 的的 UARTUART 的结构及其实现原理。的结构及其实现原理。 22 、在、在 ISEISE 软件和相关的硬件平台上完成本章所介绍软件和相关的硬件平台上完成本章所介绍

的的UARTUART 的设计。的设计。