VHDL串口通信.doc_第1页
VHDL串口通信.doc_第2页
VHDL串口通信.doc_第3页
VHDL串口通信.doc_第4页
VHDL串口通信.doc_第5页
免费预览已结束,剩余12页可下载查看

下载本文档

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

文档简介

4 .UART 模块设计UART 异步通信串口协议的VHDL实现包括3个基本模块:时钟分频、接收模块和发送模块,下面逐一介绍其实现方法。4.2.1 时钟分频模块由于UART是异步传输,没有传输同步时钟。为了能保证数据传输的正确性,UART采用16倍数据波特率的时钟进行采样。每个数据有16个时钟采样,取中间的采样值,以保证采样不会滑码或误码。一般UART一帧的数据位数为8,这样即使每个数据有一个时钟的误差,接收端也能正确地采样到数据。这里采用常用的数据波特率为9600bps,则所需时钟的频率为16*9600。系统时钟为50MHz,则分频系数为50000000/(16*9600) =325.52,取整为325。分频器实现相对简单,这里对其设计流程图不做详细介绍。只是将设计过程和结果简述如下:首先用VHDL语言进行设计输入,并生成模块文件如图4.3所示,其中clk为50M系统时钟输入,clkout为325分频后时钟输出。 图4.3 分频模块 然后建立波形文件,对以上模块进行时序仿真,仿真结果如图4.4所示,方正结果说明,分频输出实现了对输入的325分频,分频模块设计正确。 图4.4 分频模块仿真结果4.2.2 UART发送模块 发送过程:空闲状态,线路处于高电平;当受到发送数据指令后,拉低线路一个数据位的时间T,接着数据按地位到高位依次发送,数据发送完毕后,接着发送停止位(停止位为高电平),一帧数据发送结束。(1) 模块流程图 根据以上发送过程,发送模块算法示意图设计如图4.5所示。开始wrsig=1Nidle=0YN发送数据Y停止位N结束Y 图4.5 UART发送数据算法示意图(2)生成模块文件 新建一原理图文件,将VHDL源文件生成对应的模块文件如图4.6所示,其中clk为时钟输入,datain为需要发送的数据输入,wrsig为发送命令输入,idle为忙闲信号输出,tx为串行数据输出端。 图4.6 UART发送模块(3) 波形仿真 要对发送模块进行时序仿真必须设计一测试模块,即在每一个clk来时产生一个八位的数据。测试模块代码如下:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity testuart is port(clk:in std_logic; dataout: out std_logic_vector(7 downto 0); wrsig:out std_logic );end testuart;architecture one of testuart is signal dataoutreg: std_logic_vector(7 downto 0); signal cnt :std_logic_vector(7 downto 0);begin dataout=dataoutreg; process(clk) begin if(clkevent and clk=1) then if(cnt=11111110)then dataoutreg=dataoutreg+00000001; wrsig=1; cnt=00000000; else wrsig=0; cnt=cnt+00000001; end if; end if; end process;end one;保存文件为testuart.hdl,单击Files Create/Update Create Symbol Files for Current File命令,为testuart.hdl生成原理图模块。新建一个原理图文件,各个模块的连接如图4.7所示。在原理图的适当位置放置testuart模块和uarttx模块,并添加输入输出端口。图4.7 UART发送模块仿真原理图 保存原理图为uarttxts.bdf 。编译工程文件,编译无误后新建波形仿真文件,加入输入输出信号,设置系统时钟信号clk的周期为20ns,保存波形文件为uarttxts.vwf,进行UART数据发送的波形仿真,波形仿真报告如图4.8所示 图4.8 UART发送模块仿真结果 对上图分析看出,当发送命令wrsig的上升沿有效时,启动发送数据。串行数据的波形与发送数据dataout相一致,UART的发送模块得到正确验证。4.2.3 UART接收模块 UART接收模块的功能:时时检测线路,当线路产生下降沿时,即认为线路有数据传输,启动接收数据进程进行接收,按从低位到高位接收数据。(1) 模块流程图 根据以上描述的接收模块的功能,可将接收模块算法示意图设计如图4.9所示。开始rx=0Nidle=0YN接收数据Y停止位N结束Y 图4.9 接收模块算法示意图(2) 生成模块文件 新建一原理图文件,将VHDL源文件生成对应的模块文件如图4.10所示,其中clk为时钟输入,rx为需要串行数据输入,dataout为并行输出,rdsig为忙闲信号输出。 图4.10 UART接收模块(3)波形仿真 新建一个原理图文件,加入各功能模块,并添加输入输出端口,各个模块的连接如图4.11所示。图4.11 UART接收模块仿真原理图 保存原理图为uartrxts.bdf。编译工程文件,编译无误后新建波形仿真文件,加入输入输出信号,设置系统时钟clk为50MHz,保存为uartrxts.vwf,进行UART数据接收的波形仿真,波形仿真报告如图4.12所示。 图4.12 UART接收模块仿真结果对上图分析看出,UART接收模块接收到的数据与UART发送模块发送的数据相一至,每接收到一个数据都有一个读取数据指示rdisg,UART接收模块得到正确验证。4.2.3 硬件测试 按照下图连接个模块,在PC机上安装一个串口调试工具,通过串口调试工具向FPGA发送一个数据,看在PC机上能否接受到发送的数据。 测试结果如下附录:程序代码UART 分频模块代码:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity clkdiv is port( clk:in std_logic; clkout: out std_logic );end clkdiv;architecture one of clkdiv is signal cnt:std_logic_vector(15 downto 0);begin process(clk) begin if(clkevent and clk=1)then if(cnt=0000000010100010)then clkout=1; cnt=cnt+0000000000000001; elsif(cnt=0000000101000100)then clkout=0; cnt=0000000000000000; else cnt=cnt+0000000000000001; end if; end if; end process;end one;UART发送模块代码:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity uarttx is port( clk : in std_logic; datain: in std_logic_vector(7 downto 0); wrsig: in std_logic; idle: out std_logic; tx: out std_logic );end uarttx;architecture one of uarttx is signal send:std_logic; signal wrsigbuf:std_logic; signal idlereg:std_logic; signal wrsigrise:std_logic; signal cnt:std_logic_vector(7 downto 0);begin idle=idlereg;- process(clk) begin if(clkevent and clk=1)then wrsigbuf=wrsig; wrsigrise=(not wrsigbuf) and wrsig; end if; end process;- process(clk) begin if(clkevent and clk=1)then if(wrsigrise=1 and (not idlereg=1)then send=1; elsif(cnt=10100000) then send tx=0; idlereg=1; cnt tx=datain(0); idlereg=1; cnt tx=datain(1); idlereg=1; cnt tx=datain(2); idlereg=1; cnt tx=datain(3); idlereg=1; cnt tx=datain(4); idlereg=1; cnt tx=datain(5); idlereg=1; cnt tx=datain(6); idlereg=1; cnt tx=datain(7); idlereg=1; cnt tx=1; idlereg=1; cnt tx=1; idlereg=0; cnt cnt=cnt+00000001; end case; else tx=1; cnt=00000000; idlereg=0; end if; end if; end process;end one;UART 接收模块代码:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity uartrx is port(clk:in std_logic; rx: in std_logic; dataout:out std_logic_vector(7 downto 0); rdsig: out std_logic );end uartrx;architecture one of uartrx is signal dataoutreg:std_logic_vector(7 downto 0); signal rdsigreg: std_logic; signal cnt:std_logic_vector(7 downto 0); signal rxbuf:std_logic; signal rxfall:std_logic; signal receive:std_logic; signal idle:std_logic;begin- process(clk) begin if(clkevent and clk=1)then rxbuf=rx; if (rxbuf=1 and rx=0)then rxfall=1; else rxfall=0; end if; end if; end process;- process(clk) begin if(clkevent and clk=1)then if(rxfall=1 and idle=0 ) then receive=1; elsif (cnt=10011000) then receive idle=1; cnt=cnt+00000001; rdsig idle=1; dataout(0)=rx; cnt=cnt+00000001; rdsig idle=1; dataout(1)=rx; cnt=cnt+00000001; rdsig idle=1; dataout(2)=rx; cnt=cnt+00000001; rdsig idle=1; dataout(3)=rx; cnt=cnt+00000001; rdsig idle=1; dataout(4)=rx; cnt=cnt+00000001; rdsig idle=1; dataout(5)=rx; cnt=cnt+00000001; rdsig idle=1; dataout(6)=rx; cnt=cnt+00000001; rdsig idle=1; dataout(7)=rx; cnt=cnt+00000001; rdsig -idle=1; -cnt=cnt+00000001; -rdsig cnt=cnt+00000001; end case; else cnt=00000000; idle=0; rdsig=0; end if; end if; end process;-end one; UART 测试模

温馨提示

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

评论

0/150

提交评论