我找的-异步通信资料.doc_第1页
我找的-异步通信资料.doc_第2页
我找的-异步通信资料.doc_第3页
我找的-异步通信资料.doc_第4页
我找的-异步通信资料.doc_第5页
免费预览已结束,剩余1页可下载查看

下载本文档

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

文档简介

module clkdiv(clk, clkout);input clk; /系统时钟output clkout; /采样时钟输出reg clkout;reg 15:0 cnt;always (posedge clk) /分频进程beginif(cnt = 16d12)beginclkout = 1b1;cnt = cnt + 16d1;endelse if(cnt = 16d26)beginclkout = 1b0;cnt = 16d0;endelsebegincnt = cnt + 16d1;endendendmodulemodule uarttx(clk, datain, wrsig, idle, tx);input clk; /UART时钟input 7:0 datain; /需要发送的数据input wrsig; /发送命令,上升沿有效output idle; /线路状态指示,高为线路忙,低为线路空闲output tx; /发送数据信号reg idle, tx;reg send;reg wrsigbuf, wrsigrise;reg presult;reg7:0 cnt; /计数器parameter paritymode = 1b0;/检测发送命令是否有效always (posedge clk)beginwrsigbuf = wrsig;wrsigrise = (wrsigbuf) & wrsig;endalways (posedge clk)beginif (wrsigrise & (idle) /当发送命令有效且线路为空闲时,启动新的数据发送进程beginsend = 1b1;endelse if(cnt = 8d176) /一帧资料发送结束beginsend = 1b0;endendalways (posedge clk)beginif(send = 1b1)begincase(cnt) /产生起始位8d0:begintx = 1b0;idle = 1b1;cnt = cnt + 8d1;end8d16:begintx = datain0; /发送数据0位presult = datain0paritymode;idle = 1b1;cnt = cnt + 8d1;end8d32:begintx = datain1; /发送数据1位presult = datain1presult;idle = 1b1;cnt = cnt + 8d1;end8d48:begintx = datain2; /发送数据2位presult = datain2presult;idle = 1b1;cnt = cnt + 8d1;end8d64:begintx = datain3; /发送数据3位presult = datain3presult;idle = 1b1;cnt = cnt + 8d1;end8d80:begintx = datain4; /发送数据4位presult = datain4presult;idle = 1b1;cnt = cnt + 8d1;end8d96:begintx = datain5; /发送数据5位presult = datain5presult;idle = 1b1;cnt = cnt + 8d1;end8d112:begintx = datain6; /发送数据6位presult = datain6presult;idle = 1b1;cnt = cnt + 8d1;end8d128:begintx = datain7; /发送数据7位presult = datain7presult;idle = 1b1;cnt = cnt + 8d1;end8d144:Beginelse if(cnt = 8d175) /接收数据完成beginreceive = 1b0;endendalways (posedge clk)beginif(receive = 1b1)begincase (cnt)8d0:beginidle = 1b1;cnt = cnt + 8d1;rdsig = 1b0;end8d24: /接收第0位数据beginidle = 1b1;dataout0 = rx;presult = paritymoderx;cnt = cnt + 8d1;rdsig = 1b0;end8d40: /接收第1位数据beginidle = 1b1;dataout1 = rx;presult = presultrx;cnt = cnt + 8d1;rdsig = 1b0;end8d56: /接收第2位数据beginidle = 1b1;dataout2 = rx;presult = presultrx;cnt = cnt + 8d1;rdsig = 1b0;end8d72: /接收第3位数据beginidle = 1b1;dataout3 = rx;presult = presultrx;cnt = cnt + 8d1;rdsig = 1b0;end8d88: /接收第4位数据beginidle = 1b1;dataout4 = rx;presult = presultrx;cnt = cnt + 8d1;rdsig = 1b0;end8d104: /接收第5位数据beginidle = 1b1;dataout5 = rx;presult = presultrx;cnt = cnt + 8d1;rdsig = 1b0;tx = presult; /发送奇偶校验位presult = datain0paritymode;idle = 1b1;cnt = cnt + 8d1;end8d160:begintx = 1b1; /发送停止位idle = 1b1;cnt = cnt + 8d1;end8d176:begintx = 1b1;idle = 1b0; /一帧资料发送结束cnt = cnt + 8d1;enddefault:begincnt = cnt + 8d1;endendcaseendelsebegintx = 1b1;cnt = 8d0;idle = 1b0;endendendmodule保存文件为uarttx.v,module uartrx(clk, rx, dataout, rdsig, dataerror, frameerror);input clk; /采样时钟input rx; /UART数据输入output dataout; /接收数据输出output rdsig;output dataerror; /资料出错指示output frameerror; /帧出错指示reg7:0 dataout;reg rdsig, dataerror;reg frameerror;reg 7:0 cnt;reg rxbuf, rxfall, receive;parameter paritymode = 1b0;reg presult, idle;always (posedge clk) /检测线路的下降沿beginrxbuf = rx;rxfall = rxbuf & (rx);endalways (posedge clk)beginif (rxfall & (idle) /检测到线路的下降沿并且/原先线路为空闲,启动接收数据进程beginreceive = 1b1;endend8d120: /接收第6位数据beginidle = 1b1;dataout6 = rx;presult = presultrx;cnt = cnt + 8d1;rdsig = 1b0;end8d136: /接收第7位数据beginidle = 1b1;dataout7 = rx;presult = presultrx;cnt = cnt + 8d1;rdsig = 1b1;end8d152: /接收奇偶校验位beginidle = 1b1;if(presult = rx)dataerror = 1b0;elsedataerror = 1b1; /如果奇偶校验位不对,表示数据出错cnt = cnt + 8d1;rdsig = 1b1;end8d168:beginidle = 1b1;if(1b1 = rx)frameerror = 1b0;elseframeerror = 1b1; /如果没有接收到停止位,表示帧出错cnt = cnt + 8d1;rdsig = 1b1;enddefault:begincnt = cnt + 8d1;endendcaseendelsebegincnt = 8d0;idle = 1b0;rdsig = 1b0;endendendmodule11.5 UART收发器设计实例 UART(Universal Asynchronous Receiver Transmitter,通用异步收发器)是广泛使用的异步串行数据通信协议。下面首先介绍UART硬件接口及电平转换电路,分析UART的传输时序并利用Verilog HDL语言进行建模与仿真,最后通过开发板与PC相连进行RS-232通信来测试UART收发器的正确性。 11.5.1 UART界面介绍 本节所介绍的UART即美国电子工业协会定义的RS-232C,简称RS-232。RS-232的接口一般有9针的DB9和25针的DB25,这里以9针为例,它的各个引脚的定义如表11-8所示。2 数据接收 RXD 3 资料发送 TXD 由于RS-232的电气特性与FPGA引脚不相同,因此它们之间不能直接相连,对于RS-232的数据线,当为逻辑“1”时,对应电平是-15V-3V;当为逻辑“0”时,对应电平是15V3V。因此,与FPGA相连之前必须进行电平转换,转换原理图如图11-39所示。11.5.2 UART传输时序 UART传输时序如图11-40所示。图11-40 UART传输时序发送数据过程:空闲状态,线路处于高电位;当收到发送数据指令后,拉低线路一个数据位的时间T,接着数据按低位到高位依次发送,数据发送完毕后,接着发送奇偶校验位和停止位(停止位为高电位),一帧资料发送结束。 接收数据过程:空闲状态,线路处于高电位;当检测到线路的下降沿(线路电位由高电位变为低电位)时说明线路有数据传输,按照约定的波特率从低位到高位接收数据,数据接收完毕后,接着接收并比较奇偶校验位是否正确,如果正确则通知后续设备准备接收数据或存入缓存。 由于UART是异步传输,没有传输同步时钟。为了能保证数据传输的正确性,UART采用16倍数据波特率的时钟进行采样。每个数据有16个时钟采样,取中间的采样值,以保证采样不会滑码或误码。一般UART一帧的数据位数为8,这样即使每个数据有一个时钟的误差,接收端也能正确地采样到数据。 UART的接收数据时序为:当检测到数据的下降沿时,表明线路上有数据进行传输,这时计数器CNT开始计数,当计数器为24=16+8时,采样的值为第0位数据;当计数器的值为40时,采样的值为第1位数据,依此类推,进行后面6个数据的采样。如果需要进行奇偶校验,则当计数器的值为152时,采样的值即为奇偶位;当计数器的值为168时,采样的值为“1”表示停止位,一帧数据接收完成。本节章将按上面的算法进行Verilog HDL语言建模与仿真。 11.5.3 UART分频器 假设数据的波特率为p,则所需时钟的频率为16*p。以波特率p为115200为例,系统时钟为50MHz,则分频系数为50000000/(16*115200) = 27.127,取整为27。分频器Verilog HDL语言代码如下:保存文件为clkdiv.v,单击Files Create/Update Create Symbol Files for Current File命令,为clkdiv.v生成原理图模块。新建一个原理图文件,在原理图空白处双击,在弹出的Symbol对话框中选择Project clkidv模块,单击OK按钮退出Symbol对话框。在原理图的适当位置放置clkdiv模块,并添加输入输出模块。保存原理图为uartrxtx.bdf。编译工程文件,编译无误后单击Processing Generate Functional Simulation Netlist,产生功能仿真网表。新建波形仿真文件,加入输入输出信号,设置系统时钟信号clk的周期为20ns,保存波形文件为 uartrxtx.vwf,单击按钮进行分频器的波形仿真,波形仿真报告如图11-41所示。 图波形仿真报告说明: 分频时钟输出实现了所需的27分频,分频模块得到正确验证。 11.5.4 UART发送模块 UART发送模块的功能:接收到发送指令后,把数据按UART协议输出,先输出一个低电平的起始位,然后从低到高输出8个数据位,接着是可选的奇偶校验位,最后是高电平的停止位。Verilog HDL语言代码如下:保存文件为uarttx.v,单击Files Create/Update Create Symbol Files for Current File命令,为uarttx.v生成原理图模块。为了测试UART发送模块的正确性,需要编写一个测试模块来测试UART发送模块,Verilog HDL语言代码如下:保存文件为testuart.v,单击Files Create/Update Create Symbol Files for Current File 命令,为testuart.v 生成原理图模块。新建一个原理图文件,在原理图空白处双击,在弹出的Symbol 对话框中选择Project testuart 模块和uarttx 模块,单击OK 按钮退出Symbol 对话框。在原理图的适当位置放置testuart 模块和uarttx 模块,并添加输入输出模块。为了仿真方便,把原来分频模块的分频系数更改为4,各个模块的连接如图11-42 所示。11.5.5 UART接收模块 UART接收模块的功能:时时检测线路,当线路产生下降沿时,即认为线路有数据传输,启动接收数据进程进行接收,按从低位到高位接收数据。UART接收模块的Verilog HDL语言代码如下:11.5.6 UART 的硬件测试 为了测试UART 与PC 通信的正确性,本例测试方法是,PC 将数据发送到FPGA,FPGA 接收到数据再发送给PC。FPGA 与PC 通信模块连接原理图如图11-46 所示。根据PC 的串口调试工具的设置,决定代码是否需要奇偶校验位,以及分频系数。分配FPGA 引脚,编译工程,连接好开发板及下载线缆,接上电源,下载配置FPGA,打开PC 的串口调试工具,发送数据,观察接收到的数据,如图11-47 所示。百度他娘的UART因为计算机内部采用并行数据,不能直接把数据发到Modem,必须经过UART整理才能进行异步传输,其过程为:CPU先把准备写入串行设备的数据放到UART的寄存器(临时内存块)中,再通过FIFO(First Input First Output,先入先出队列)传送到串行设备,若是没有FIFO,信息将变得杂乱无章,不可能传送到Modem。 它是用于控制计算机与串行设备的芯片。有一点要注意的是,它提供了RS-232C数据终端设备接口,这样计算机就可以和调制解调器或其它使用RS-232C接口的串行设备通信了。作为接口的一部分,UART还提供以下功能:将由计算机内部传送过来的并行数据转换为输出的串行数据流。将计算机外部来的串行数据转换为字节,供计算机内部使用并行数据的器件使用。在输出的串行数据流中加入奇偶校验位,并对从外部接收的数据流进行奇偶校验。在输出数据流中加入启停标记,并从接收数据流中删除启停标记。处理由键盘或鼠标发出的中断信号(键盘和鼠标也是串行设备)。可以处理计算机与外部串行设备的同步管理问题。有一些比较高档的UART还提供输入输出数据的缓冲区,现在比较新的UART是16550,它可以在计算机需要处理数据前在其缓冲区内存储16字节数据,而通常的UART是8250。现在如果您购买一个内置的调制解调器,此调制解调器内部通常就会有16550 UART。什么是 UARTUART是一种通用串行数据总线,用于异步通信。该总线双向通信,可以实现全双工传输和接收。在嵌入式设计中,UART用来与PC进行通信,包括与监控调试器和其它器件,如EEPROM通信。编辑本段UART通信UART首先将接收到的并行数据转换成串行数据来传输。消息帧从一个低位起始位开始,后面是58个数据位,一个可用的奇偶位和一个或几个高位停止位。接收器发现开始位时它就知道数据准备发送,并尝试与发送器时钟频率同步。如果选择了奇偶,UART就在数据位后面加上奇偶位。奇偶位可用来帮助错误校验。 在接收过程中,UART从消息帧中去掉起始位和结束位,对进来的字节进行奇偶校验,并将数据字节从串行转换成并行。UART也产生额外的信号来指示发送和接收的状态。例如,如果产生一个奇偶错误,UART就置位奇偶标志。编辑本段数据方向和通信速度数据传输可以首先从最低有效位(LSB)开始。然而,有些UART允许灵活选择先发送最低有效位或最高有效位(MSB)。 微控制器中的UART传送数据的速度范围为每秒几百位到1.5Mb。例如,嵌入在ElanSC520微控制器中的高速UART通信的速度可以高达1.1152Mbps。UART波特率还受发送和接收线对距离(线长度)的影响。 目前,市场上有只支持异步通信和同时支持异步与同步通信的两种硬件可用于UART。前者就是UART名字本身的含义,在摩托罗拉微控制器中被称为串行通信接口(SCI);Microchip微控制器中的通用同步异步收发器(USART)和在富士通微控制器中的UART是后者的两个典型例子。编辑本段计算机中的UARTUART是计算机中串行通信端口的关键部分。在计算机中,UART相连于产生兼容RS232规范信号的电路。RS232标准定义逻辑“1”信号相对于地为-3到-15伏,而逻辑“0”相对于地为3到15伏。所以,当一个微控制器中的UART相连于PC时,它

温馨提示

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

评论

0/150

提交评论