您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 基于cpld的urat的vhdl代码
串行异步通信规定了字符数据的传送格式。每一帧数据由起始位、数据位、奇偶校验位、停止位和线路空闲状态组成,格式如图1所示。一般情况起始位为1位,数据位为5、6、7或8位、奇偶校验位为1位,停止位为1、1.5或2位。其中的起始位和停止位就是用来实现字符的同步。在空闲状态,传送线为逻辑“1”状态。数据的传送总是以一个“起始位”开始的,接着是要传送的若干数据位,低位先行,最后是一个“1”状态的“停止位”;那么,当接收器检测到一个“1”向“0”的跳变时,便视为可能的起始位。起始位被确认后,就知道发送器已开始发送,当接收了已协议好的位数后并接收到字符帧中停止位就是一帧字符数据已发送完毕。这样,接收器就知道发送器何时开始发送数据和何时结束发送数据由于微电子学和计算机科学的迅速发展,给EDA(电子设计自动化)行业带来了巨大的变化。特别是进入20世纪90年代后,电子系统已经从电路板级系统集成发展成为包括ASIC、FPGA/CPLD和嵌入系统的多种模式。可以说EDA产业已经成为电子信息类产品的支柱产业。EDA之所以能蓬勃发展的关键因素之一就是采用了硬件描述语言(HDL)描述电路系统。就FPGA和CPLD开发而言,比较流行的HDL主要有VerilogHDL、VHDL、ABEL-HDL和AHDL等,其中VHDL和VerilogHDL因适合标准化的发展方向而最终成为IEEE标准。下面的设计就是用VHDL来完成实现的。2UART设计实例通常设计数字电路大都采用自顶向下将系统按功能逐层分割的层次化设计方法,这比传统自下向上的EDA设计方法有更明显的优势(当时的主要设计文件是电路图)。因为由自顶向下的设计过程可以看出,从总体行为设计开始到最终逻辑综合,形成网络表为止。每一步都要进行仿真检查,这样有利于尽早发现系统设计中存在的问题,从而可以大大缩短系统硬件的设计周期。下面以UART的设计为例具体说明:(本设计只对本设计的总模块做各种基于MAX+PLUSII环境下的各种分析,对于各分模块只是作些必要的说明。)UART(即UniversalAsynchronousReceiverTransmitter通用异步收发器)是一种应用广泛的短距离串行传输接口。UART允许在串行链路上进行全双工的通信。串行外设用到的RS232-C异步串行接口,一般采用专用的集成电路即UART实现。如8250、8251、NS16450等芯片都是常见的UART器件,这类芯片已经相当复杂,有的含有许多辅助的模块(如FIFO),有时我们不需要使用完整的UART的功能和这些辅助功能。或者设计上用到了FPGA/CPLD器件,那么我们就可以将所需要的UART功能集成到FPGA内部。使用VHDL将UART的核心功能集成,从而使整个设计更加紧凑、稳定且可靠。本文应用EDA技术,基于FPGA/CPLD器件设计与实现UART。2.1UART简介2.1.1UART结构UART主要有由数据总线接口、控制逻辑、波特率发生器、发送部分和接收部分等组成。本设计主要设计UART中最重要的发送部分和接收部分,其他部分设计不在赘述。功能包括发送缓冲器(tbr)、发送移位寄存器(tsr)、帧产生、奇偶校验、并转串、数据接收缓冲器(rbr)、接收移位寄存器(rsr)、帧产生、奇偶校验、串转并。图1是UART的典型应用。图12.1.2UART的帧格式UART的帧格式如图2所示。图2包括线路空闲状态(idle,高电平)、起始位(startbit,低电平)、5~8位数据位(databits)、校验位(paritybit,可选)和停止位(stopbit,位数可为1、1.5、2位)。这种格式是由起始位和停止位来实现字符的同步。UART内部一般有配置寄存器,可以配置数据位数(5~8位)、是否有校验位和校验的类型、停止位的位数(1,1.5,2)等设置。本设计没有奇偶校验位,所设置的奇偶校验只是检验数据中是否有奇数或偶数个1。数据位为8位,停止位为1位。2.2UART的设计与实现2.2.1UART发送器发送器每隔16个CLK16时钟周期输出1位,次序遵循1位起始位、8位数据位、1位停止位。CPU何时可以往发送缓冲器tbr写入数据,也就是说CPU要写数据到tbr时必须判断当前是否可写,如果不判这个条件,发送的数据会出错。本设计由wrn控制。数据的发送是由微处理器控制,微处理器给出wrn信号,发送器根据此信号将并行数据din[7..0]锁存进发送缓冲器tbr[7..0],并通过发送移位寄存器tsr[7..0]发送串行数据至串行数据输出端sdo。在数据发送过程中用输出信号tbre、tsre作为标志信号,当一帧数据由发送缓冲器tbr[7..0]送到发送发送移位寄存器tsr[7..0]时,tbre信号为1,而数据由发送移位寄存器tsr[7..0]串行发送完毕时,tsre信号为1,通知CPU在下个时钟装入新数据。发送器端口信号如图3所示。图3引入发送字符长度和发送次序计数器no_bits_sent,实现设计的源程序如下。libraryieee;useieee.std_logic_1164.all;useieee.std_logic_arith.all;entitytxmitisport(rst,clk16x,wrn:instd_logic;din:instd_logic_vector(7downto0);tbre:outstd_logic;tsre:outstd_logic;sdo:outstd_logic);endtxmit;architecturev1oftxmitissignalclk1x_enable:std_logic;signaltsr:std_logic_vector(7downto0);signaltbr:std_logic_vector(7downto0);signalparity:std_logic;signalclkdiv:unsigned(3downto0);--用来控制数据采样时钟的signalclk1x:std_logic;signalno_bits_sent:unsigned(3downto0);signalwrn1:std_logic;signalwrn2:std_logic;beginprocess(rst,clk16x)--对wrn进行脉宽处理,以防接收数据错误beginifrst='1'thenwrn1='1';wrn2='1';elsifclk16x'eventandclk16x='1'thenwrn2=wrn1;wrn1=wrn;endif;endprocess;process(rst,clk16x)--对clk1x_enable进行控制beginifrst='1'thenclk1x_enable='0';tbre='1';elsifclk16x'eventandclk16x='1'thenifwrn1='0'andwrn2='1'thentbre='0';clk1x_enable='1';elsifstd_logic_vector(no_bits_sent)=0010thentbre='1';elsifstd_logic_vector(no_bits_sent)=1101thenclk1x_enable='0';endif;endif;endprocess;process(rst,wrn)--接收数据至tbrbeginifrst='1'thentbr=(others='0');elsifwrn'eventandwrn='0'thentbr=din;endif;endprocess;process(rst,clk16x,clk1x_enable)beginifrst='1'thenclkdiv=0000;elsifclk16x'eventandclk16x='1'thenifclk1x_enable='1'thenclkdiv=clkdiv+0001;endif;endif;endprocess;clk1x=clkdiv(3);--产生clk1x时钟process(rst,clk1x,no_bits_sent,tbr)beginifrst='1'thensdo='1';tsre='1';tsr=00000000;parity='1';elsifclk1x'eventandclk1x='1'thenifstd_logic_vector(no_bits_sent)=0001thentsr=tbr;--发送缓冲器tbr数据进入发送移位寄存器tsrtsre='0';--发送移位寄存器空标志置“0”elsifstd_logic_vector(no_bits_sent)=0010thensdo='0';--发送起始位信号“0”elsifstd_logic_vector(no_bits_sent)=0011andstd_logic_vector(no_bits_sent)=1010thentsr=tsr(6downto0)&'0';--从低位到高位进行移位输出至串行输出端sdosdo=tsr(7);parity=parityxortsr(7);--数据位中的1校验endif;endif;endprocess;process(rst,clk1x,clk1x_enable)--产生发送字符长度和发送次序计数器beginifrst='1'orclk1x_enable='0'thenno_bits_sent=0000;elsifclk1x'eventandclk1x='1'thenifclk1x_enable='1'thenno_bits_sent=no_bits_sent+0001;endif;endif;endprocess;end;2.2.2UART接收器串行数据帧和接收时钟是异步的,发送来的数据由逻辑1变为逻辑0可以视为一个数据帧的开始。接收器先要捕捉起始位,确定rxd输入由1到0,逻辑0要8个CLK16时钟周期,才是正常的起始位,然后在每隔16个CLK16时钟周期采样接收数据,移位输入接收移位寄存器rsr,最后输出数据dout。还要输出一个数据接收标志信号标志数据接收完。接收器的端口信号如图4所示。图4引入接收字符长度和接收次序计数器no_bits_rcvd,实现设计的源程序如下。由于与发送器的一些说明相似,这里就不再重复。libraryieee;useieee.std_logic_1164.all;useieee.std_logic_arith.all;entityrcvrisport(rst,clk16x,rxd,rdn:instd_logic;dout:outstd_logic_vector(7downto0);data_ready:outstd_logic;framing_error:outstd_logic;parity_error:outstd_logic);endrcvr;architecturev1ofrcvrissignalrxd1:std_logic;signalrxd2:std_logic;signalclk1x_enable:std_logic;signalclkdiv:unsigned(3downto0);signalrsr:unsigned(7downto0);signalrbr:unsigned(7downto0);signalno_bits_rcvd:unsigned(3downto0);signalparity:std_logic;signalclk1x:std_logic;beginprocess(rst,clk16x)beginifrst='1'thenrxd1='1';rxd2='1';elsifclk16x'eventandclk16x='1'thenrxd2=rxd1;rxd1=rxd;endif;endprocess;process(rst,clk16x,rxd1,rxd2,no_bits_rcvd
本文标题:基于cpld的urat的vhdl代码
链接地址:https://www.777doc.com/doc-4443119 .html