设计一个全双工UART电路EDA综合课程设计实验报告_第1页
设计一个全双工UART电路EDA综合课程设计实验报告_第2页
设计一个全双工UART电路EDA综合课程设计实验报告_第3页
设计一个全双工UART电路EDA综合课程设计实验报告_第4页
设计一个全双工UART电路EDA综合课程设计实验报告_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

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

文档简介

1、 eda综合课程设计实验报告题 目:设计一个全双工uart电路 院 系: xxxx学院 学 号: xxxxx 姓 名: 严xx 教 师: 林xx 时 间: 2012.06.02 1 课程设计的摘要原理22 设计一个全双工uart电路,具体要求如下:63 uart设计73.1 uart结构73.2 uart的帧格式84 uart的verilog hdl语言设计94.1 uart分频器94.2uart发送模块104.3 uart的接收模块154.4 uart的硬件测试195 课程设计总结191摘 要uart协议是数据通信及控制系统中广泛使用的一种全双工串行数据传输协议,在实际工业生产中有时并不使用

2、uart的全部功能。只需将其核心功能集成即可。波特率发生器、接收器和发送器是uart的三个核心功能模块,利用vefilog-hdl语言对这三个功能模块进行描述并加以整合uart(即universal asynchronousreceiver transmitter 通用异步收发器)是广泛使用的串行数据传输协议。uart允许在串行链路上进行全双工的通信。串行外设用到rs232-c异步串行接口,一般采用专用的集成电路即uart实现。如8250、8251、ns16450等芯片都是常见的uart器件,这类芯片已经相当复杂,有的含有许多辅助的模块(如fifo),有时我们不需要使用完整的uart的功能和这

3、些辅助功能。或者设计上用到了fpga/cpld器件,那么我们就可以将所需要的uart功能集成到fpga内部。使用vhdl或veriolog -hdl将uart的核心功能集成,从而使整个设计更加紧凑、稳定且可靠。本文应用eda技术,基于fpga/cpld器件设计与实现uart。实际应用上,有时我们不需要使用完整的uart的功能和这些辅助功能。使用verilog-hdl将所需要的uart的核心功能集成到fpgacpld内部,就可以实现紧凑、稳定且可靠的uart数据传输。这样,既可以满足实际的应用,实现所要求的简单的通信和控制,又能够去除更多不需要的繁杂复杂的功能实现。一、uart的原理串行通信是指

4、外部设备和计算机间使用一根数据线(另外需要地线,可能还需要控制线)进行数据传输的方式。数据在一根数据线上一位一位传输,每一位数据都占据一个固定的时间长度。与并行通信方式相比,串行通信方式的传输速度较慢,但这种通信方式使用的数据线少,在远距离通信中可以节约通信成本,因此得到了广泛的应用。基本的uart只需要发送和接收两条数据线就可以完成数据的全双工通信,其基本功能是在发送端将控制器通过总线传过来的并行数据,以设定的格式,设定的频率串行地传输出去,并同时在接收端将串行接收到的数据,转换成相应的并行数据发送出去。uart的基本帧格式如图1所示。其中,起始位总是逻辑o状态,停止位总是逻辑l状态,其持续

5、时间可选为1位、15位或2位,其数据位可为5、6、7、8位,校验位可根据需要选择奇校验位,偶校验位或无校验位。二、urat整体结构的设计2 设计一个全双工uart电路,具体要求如下:1) 支持数据格式:起始位(1bit)数据(8bit)奇偶校验位(1bit)终止位(1bit)2) 奇/偶校验可配置3) 可配置支持115200以下的常见波特率4) 支持115200以下的波特率自适应,自适应过程如下:a. 复位后,uart首先接收输入,不断自动调整波特率,直到以一定波特率正确连续接收到3个bytes的0x55b. 接着uart以此波特率连续发送3个bytes 0xaac. 之后两端以此波特率进行通

6、信d. 波特率自适应只在电路复位后进行一次,如欲再次自适应波特率应对电路再次复位e. 波特率自适应过程中不能对uart的波特率作任何设置,自适应完成后可以对波特率作设置5) 自动计算校验位用于发送数据;对接收到的校验位和数据进行校验,发现错误应设置错误标志,并丢弃数据6) 对接收不正常数据(如无终止位、无校验位、数据位数不正确等)应能自动识别并设置错误标志、丢弃3 uart设计 通常设计数字电路大都采用自顶向下将系统按功能逐层分割的层次化设计方法,这比传统自下向上的eda设计方法有更明显的优势(当时的主要设计文件是电路图)。因为由自顶向下的设计过程可以看出,从总体行为设计开始到最终逻辑综合,形

7、成网络表为止。每一步都要进行仿真检查,这样有利于尽早发现系统设计中存在的问题,从而可以大大缩短系统硬件的设计周期。 uart(即universal asynchronous receiver transmitter 通用异步收发器)是一种应用广泛的短距离串行传输接口。uart允许在串行链路上进行全双工的通信。串行外设用到的rs232-c异步串行接口,一般采用专用的集成电路即uart实现。如8250、8251、ns16450等芯片都是常见的uart器件,这类芯片已经相当复杂,有的含有许多辅助的模块(如fifo),有时我们不需要使用完整的uart的功能和这些辅助功能。或者设计上用到了fpga/cp

8、ld器件,那么我们就可以将所需要的uart功能集成到fpga内部。使用vhdl将uart的核心功能集成,从而使整个设计更加紧凑、稳定且可靠。本文应用eda技术,基于fpga/cpld器件设计与实现uart。3.1 uart结构 uart主要有由数据总线接口、控制逻辑、波特率发生器、发送部分和接收部分等组成。本设计主要设计uart中最重要的发送部分和接收部分 ,结构如下图13.2 uart的帧格式uart的帧格式如图2所示。 发送数据过程:空闲状态,线路处于高电位;当收到发送数据指令后,拉低线路一个数据位的时间t,接着数据按低位到高位依次发送,数据发送完毕后,接着发送奇偶校验位和停止位(停止位为

9、高电位),一帧资料发送结束。 接收数据过程:空闲状态,线路处于高电位;当检测到线路的下降沿(线路电位由高电位变为低电位)时说明线路有数据传输,按照约定的波特率从低位到高位接收数据,数据接收完毕后,接着接收并比较奇偶校验位是否正确,如果正确则通知后续设备准备接收数据或存入缓存。 uart是异步传输,没有传输同步时钟。为了能保证数据传输的正确性,uart采用16倍数据波特率的时钟进行采样。每个数据有16个时钟采样,取中间的采样值,以保证采样不会滑码或误码。一般uart一帧的数据位数为8,这样即使每个数据有一个时钟的误差,接收端也能正确地采样到数据。 uart的接收数据时序为:当检测到数据的下降沿时

10、,表明线路上有数据进行传输,这时计数器cnt开始计数,当计数器为24=16+8时,采样的值为第0位数据;当计数器的值为40时,采样的值为第1位数据,依此类推,进行后面6个数据的采样。如果需要进行奇偶校验,则当计数器的值为152时,采样的值即为奇偶位;当计数器的值为168时,采样的值为“1”表示停止位,一帧数据接收完成。4 uart的verilog hdl语言设计4.1 uart分频器假设数据的波特率为p,则所需时钟的频率为16*p。以波特率p为115200为例,系统时钟为50mhz,则分频系数为50000000/(16*115200) = 27.127,取整为27。分频器verilog hdl

11、语言代码如下: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;endendendmodule对此进行仿真,加入输入输出信号,设置系统时钟信号clk

12、的周期为20ns。 仿真波形图如下图3:4.2uart发送模块uart发送模块的功能:接收到发送指令后,把数据按uart协议输出,先输出一个低电平的起始位,然后从低到高输出8个数据位,接着是可选的奇偶校验位,最后是高电平的停止位。verilog hdl语言代码如下:module uarttx(clk, datain, wrsig, idle, tx);input clk; /uart时钟input 7:0 datain; /需要发送的数据input wrsig; /发送命令,上升沿有效output idle; /线路状态指示,高为线路忙,低为线路空闲output tx; /发送数据信号reg

13、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) /一

14、帧资料发送结束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 = c

15、nt + 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

16、位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:begintx = presult; /发送奇偶校验位presult = datain0paritymode;idle = 1b

17、1;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为了测试uart发送模块的正确性,需要编写一个测试模块来测试uart发送模块,verilog hdl语言代码如下:module

18、testuart(clk, dataout, wrsig);input clk;output7:0 dataout;output wrsig;reg 7:0 dataout;reg wrsig;reg 7:0 cnt;always (posedge clk)beginif(cnt = 254)begindataout = dataout + 8d1; /每次数据加“1”wrsig = 1b1; /产生发送命令cnt = 8d0;endelsebeginwrsig = 1b0;cnt = cnt + 8d1;endendendmodule将发送模块和测试模块生成原理图模块和频率长生模块连接成发送

19、模块电路图,如下图4:得到的仿真图如下图5波形仿真报告说明:对图,当发送命令wrsig的上升沿有效时,启动发送数据。串行数据的波形与发送数据dataout相一致,uart的发送模块得到正确验证。4.3 uart的接收模块uart接收模块的功能:时时检测线路,当线路产生下降沿时,即认为线路有数据传输,启动接收数据进程进行接收,按从低位到高位接收数据。uart接收模块的verilog hdl语言代码如下:module uartrx(clk, rx, dataout, rdsig, dataerror, frameerror);input clk; /采样时钟input rx; /uart数据输入o

20、utput 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 (p

21、osedge clk)beginif (rxfall & (idle) /检测到线路的下降沿并且原先线路为空闲,启动接收数据进程beginreceive = 1b1;endelse 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 =

22、 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;c

23、nt = 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;end8d120: /接收第6位数据beginidle = 1b1;dataout6 = rx;presult = presultrx;cnt = cnt + 8d

24、1;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 =

温馨提示

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

评论

0/150

提交评论