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

下载本文档

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

文档简介

通用异步接收发送器 的设计和实现,何宾 2011.09,uart的设计和实现-本章概要,本章给出了pld器件在简单通信系统的应用-uart设计。 通用异步接收/发送器的设计也是pld在通信系统的经典应 用。该章首先介绍了uart设计原理,其中包括uart原 理和设计描述、接收模块设计,随后介绍了uart的 vhdl代码描述,最后介绍了urat的软件仿真验证和硬 件验证。,uart的设计和实现-设计原理,基于通用异步接收发送器uart的rs-232接口是以前计算机上提供的一个串行数据接口,用来将接收的串行数据转换成并行数据,同时将并行数据转换成串行数据后发送出去。当pld和其它外设通过串口通信时就非常有用。uart发送的数据,经过电平转换后,传送到pld的外部串行总线接口,然后这些串行数据被送到pld内部进行处理。被处理的数据然后转换为串行数据经电平转换后传回串口。,uart的设计和实现-设计原理,该设计包含下面几个方面: 并行/串行和串行/并行数据转换 使用用户定义的奇偶校验位(缺省设置为奇校验) 数据波特率可修改(缺省9600) 包含测试代码和测试向量,uart的设计和实现-符号描述图,uart的设计和实现-原理和设计描述,uart设计主要包括两部分:并行数据转化成串行数 据,串行数据转换成并行数据。 uart设计的接收端口将接收到的串行数据转换成 并行数据,同时uart的发送端口负责并行数据转换成串 行数据。 测试代码完成对uart设计的验证,该验证已经在 xilinx大学计划提供的开发平台进行了验证,该设计也很 容易的移植到其它的eda平台上。,uart的设计和实现-原理和设计描述符号,uart的设计和实现-原理和设计描述,uart设计包含两个主要模块,这两个模块封装在一 个uart的设计文件中。 这两个模块一个处理接收的串行数据,另一个处理发 送的串行数据。 接收模块的端口接收一个字节的有效数据,并将其转 换成8位的并行数据。转换的并行数据放在dbout端口。 发送模块将发送的数据送到dbin端口,并且将其转换 成一个字节的串行发送数据,转换完的数据txd端口上。,uart的设计和实现-接收模块的设计,接收模块接收串行数据并将其转换为并行数据。该 设计包括下面几个部分: 串行数据控制器 用于同步的两个计数器 移位寄存器,移位寄存器保存来自rxd的数据。 错误比特控制器。 来自rxd串口的数据以一定的波特率被接收,所以 需要有个控制器同步接收数据的采集相位。串行同步控 制器的设计采用了一个状态机和两个同步计数器。在设 计中,在每个接收比特数据的中间采集数据。,uart的设计和实现-接收模块状态机,uart的设计和实现-接收模块状态机原理,当处于idle状态时,串行数据管脚rxd处于高电平状 态,在该状态一直等待直到检测到rxd为低电平时,进入 到eightdelay状态。 在该状态,主要是进行同步,使得在每个比特位的中间 采样数据,计数器ctr比波特率快16倍。在该状态下,ctr计 数到8。然后进入到waitfor0状态,waitfor1状态跟在其 后,这两个状态的转移由ctr的最高两位确定。进入到 getdata状态时,开始对rxd数据进行移位。,uart的设计和实现-接收模块状态机原理,这两个状态保证有足够的延迟保证读取采样数据的 正中间。当计数器计数到10(8个数据位、一个奇偶位 和一个停止位),然后进入到checkstop状态。这个状 态进行奇偶校验。当该状态结束后,进入到idle状态。,对接收数据进行采样的时序的描述,uart的设计和实现-差错控制的实现,差错控制寄存器分析接收到的数据,并对三种错误进 行判断:奇偶错、帧错误和溢出错误。 奇偶错误指接收数据的得到的校验和与接收到的par不 一样。当进行偶校验的时候,d0到d7的和应该是偶数, 否则是奇校验。该设计中缺省设置为偶校验。当奇偶校验 错误时,pe端口为高。 帧错误是指uart在给定的时序没有正确的读到数 据。当停止位不为1时,表示帧错误,此时fe端口为1。 溢出错误是指,当前帧接收完,但还没有读时下一帧 数据就到了的情况。当单字节的串行数据可读时rda为 高,移位后的并行数据放在dbout端口。一旦rda端口 为高,且此时数据仍在dbout端口时,oe溢出错误标志 为高。,uart的设计和实现 -接收模块内各个子模块的连接关系,uart的设计和实现-发送模块的设计,发送模块接收来自dbin模块的数据,并以串行数据 的发送发送到txd端口上。 发送端口的波特率和接收数据的波特率一样,接收和 发送波特率的修改方式一样。 为了发送存储在dbin端口的数据,发送模块必须有 一个发送控制器、两个控制数据的波特率的同步计数器和 发送移位寄存器。 两个计数器中的一个计数器用于延迟发送控制器,另 一个计数器用来计算发送的串行数据位的个数。txd端口 和发送移位寄存器的最低位连接。,uart的设计和实现-发送模块的状态机,uart的设计和实现-发送模块的状态机,uart在idel状态,当wr为高时状态发生变化。然 后,发送模块加载dbin端口的数据,下一个状态发送数 据。 transfer状态准备发送移位寄存器发送数据。设置 load=1,移位寄存器开始加载数据,其顺序是一个起始 位、一个字节的dbin数据、一个奇偶校验位和一个停止 位。下一个状态进入到shift状态。在该状态下,移位信号 置1,表示移位寄存器移1。tfincr信号也置1表示递增数 据计数器。如果数据计数器不等于9,表示发送移位寄存 器没有进行移位操作,此时进入delay状态。如果移位完 成,此时进入waitwrite状态。,uart的设计和实现-发送模块的状态机,在delay状态下,发送数据按照正确的波特率发送数 据。当tdelayctr与波特率常数一样时,结束该状态。进 入到shift状态。一旦进入到waitwrite状态,结束发送过 程。在这个状态需要确认wr信号为高,才能开始发送 过程。,uart的设计和实现 -发送模块的状态机内部结构,uart的设计和实现-uart的vhdl设计代码,entity uartcomponent is port ( txd : out std_logic:= 1; rxd : in std_logic; clk : in std_logic; 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的设计和实现-uart的vhdl设计代码,architecture behavioral of uartcomponent is type rstate is(stridle,streightdelay,strgetdata,strwaitfor0,strwaitfor1,strcheckstop); type tstate is (sttidle,stttransfer,sttshift,sttdelay,sttwaitwrite); constant baudrate : std_logic_vector(12 downto 0) := “1010001011000“; constant bauddivide : std_logic_vector(8 downto 0) := “101000110“; signal rdreg : std_logic_vector(7 downto 0) := “00000000“; signal rdsreg : std_logic_vector(9 downto 0) := “1111111111“; signal tfreg : std_logic_vector(7 downto 0); signal tfsreg : std_logic_vector(10 downto 0) := “11111111111“; 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_logic_vector(3 downto 0) := “0000“;,uart的设计和实现-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 := 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的设计和实现-uart的vhdl设计代码,begin - -title: 初始信号定义 - 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(1) xor (tfreg(2) xor tfreg(3) xor (tfreg(4) xor tfreg(5) xor (tfreg(6) xor tfreg(7) );,uart的设计和实现-uart的vhdl设计代码,- -title: 时钟分频计数器 - process (clk, clkdiv) begin if (clk = 1 and clkevent) then if (clkdiv = bauddivide or ctrst = 1) then clkdiv = “0000000000“; else clkdiv = clkdiv +1; end if; end if; end process;,- -title: 传输延迟计数器 - process (clk, tdelayctr) begin if (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的设计和实现-uart的vhdl设计代码,- -title: ctr 设置 - process (clk) begin if clk = 1 and clkevent then if ctrst = 1 then ctr = “0000“; elsif clkdiv = bauddivide then ctr = ctr + 1; else ctr = ctr; end if; end if; end process;,uart的设计和实现-uart的vhdl设计代码,- -title: 传输计数器 - process (clk, tclkrst) begin if (clk = 1 and clkevent) then if tclkrst = 1 then tfctr = “0000“; elsif tfincr = 1 then tfctr = tfctr +1; end if; end if; end process;,uart的设计和实现-uart的vhdl设计代码,- -title: 错误和rda标志控制器 - process (clk, rst, rd, ce) begin if rd = 1 or rst = 1 then fe = 0; oe = 0; rda = 0; pe = 0; elsif clk = 1 and clkevent then if ce = 1 then fe = frameerror; pe = parerror; rdreg(7 downto 0) = rdsreg (7 downto 0); if rda = 1 then oe = 1; else oe = 0; rda = 1; end if; end if; end if; end process;,uart的设计和实现-uart的vhdl设计代码,- -title: receiving shift register - process (clk, rshift) begin if clk = 1 and clkevent then if rshift = 1 then rdsreg = (rxd -,uart的设计和实现-uart的vhdl设计代码,- -title: 进入数据计数器 - process (clk, datarst) begin if (clk = 1 and clkevent) then if datarst = 1 then datactr = “0000“; elsif dataincr = 1 then datactr = datactr +1; end if; end if; end process;,uart的设计和实现-uart的vhdl设计代码,- -title: 接收状态控制器 - process (clk, rst) begin if clk = 1 and clkevent then if rst = 1 then strcur = stridle; else strcur = strnext; end if; end if; end process;,uart的设计和实现-uart的vhdl设计代码,- -title: 接收状态机 - process (strcur, ctr, rxd, datactr) begin case strcur is when stridle = dataincr dataincr ce ce ce dataincr = 0;rshift = 0;datarst = 0;ctrst = 0;ce = 1; strnext = stridle; end case; end process;,uart的设计和实现-uart的vhdl设计代码,- -title: 传输移位寄存器控制器 - process (load, shift, clk, tfsreg) begin if clk = 1 and clkevent then if load = 1 then tfsreg (10 downto 0) = (1 -,uart的设计和实现-uart的vhdl设计代码,- -title: transfer state machine controller - process (clk, rst) begin if (clk = 1 and clkevent) then if rst = 1 then sttcur = sttidle; else sttcur = sttnext; end if; end if; end process;,uart的设计和实现-uart的vhdl设计代码,- -title: 发送状态机 - process (sttc

温馨提示

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

评论

0/150

提交评论