FPGA的UART完整设计[23页]_第1页
FPGA的UART完整设计[23页]_第2页
FPGA的UART完整设计[23页]_第3页
FPGA的UART完整设计[23页]_第4页
FPGA的UART完整设计[23页]_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

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

文档简介

1、电子科技大学成都学院毕业设计论文第三章UART设计3.1 UART的帧格式 在 UART 中,数据位是以字符为传送单位,数据的前、后要有起始位、停止位,另外可以在停止位的前面加上一个比特(bit)的校验位。其帧格式如图所示。数据位 起始位D0 D1 D2 D3 D7 校验位 停止位以9600波特率接收或发送,每一位时间为1/9600秒,或48MHZ晶振5000次计数图3_1数据帧格式 文章 通 过 分析UART的功能,利用有限状态机来描述UART核心控制逻辑的方法,将其核心功能集成,从而使整个设计更加稳定、可靠。基本的UART通信只需要两条信号线就可以完成数据的相互通信。UART的功能模块如图

2、3_2所示。波特发生器Uart控制器接收模块发送模块对象模块图3_2UART的功能模块图173.2 UART模块在大规模电路的设计中,广泛采用层次化,结构化的设计方法。它将一个完整的硬件设计任务从系统级开始,划分为若干个可操作的模块,编制出相应的模型并进行仿真验证,最后在系统级上进行组合。这样在提高设计效率的同时又提高了设计质量,是目前复杂数字系统实现的主要手段,也是本文设计思想的基础。其系统模块可划分为4个部分,如波特发生器,控制器,接收器,发送器,如图3-3所示:readsendclear_checkreadsend Clr3 clr4ks csData_inData_outclearRe

3、ad_enablesend_enablecounterscountersresetCounters(control)stateT1clk_enableClk_clearClk(波特发生器)clk图3-3uart结构图3.2.1主要引脚功能介绍 Read:串行输入send:串行输出 Data_in:并行输入data_out:并行输出 Cs:通知cpu接收数据位ks:通知cpu发送准备位 Reset:重启输入state:uart状态输入 Clk:48M时钟输入3.2.2UART主体程序timescale 1ns/1nsmodule gs_opt(input wire read,input wire

4、 clk,input wire reset,input wire state,input wire 7:0 dat_in, output wire send,output wire cs,output wire ks,output wire 7:0 dat_out );wire send_enable; wire read_enable; wire clk_enable3;wire clk_enable4; wire clear3 ; wire clear4 ; wire clk_enable;wire 7:0 counters; wire clear ; wire t1; /*read,se

5、nd,cs,ks,reset,state,clk,dat_in,dat_out); /module uart(read,send,cs,ks,reset,state,clk,dat_in,dat_out);input read,clk,reset,state;/read为串行输入,clk为时钟输入50MHZ,reset为重启键input7:0 dat_in;/并行数据输入output send,cs,ks;/send为串行输出,cs为通知cpu接收数据位,ks为发送准备位output7:0 dat_out;/并行数据输出wire clear,clk_enable,read_enable,cle

6、ar3,send_enable,clear4,t1;wire7:0 counters,dat_in;*/rxd u1 (.dat_out (dat_out) ,.cs (cs) ,.read (read) ,.reset (reset) ,.clk_enable3 (clk_enable3) ,.clk (clk) ,.read_enable (read_enable) ,.clear3 (clear3) ,.counters (counters) ); /接收数据moduletxd u2 (.dat_in (dat_in),.ks (ks),.send (send),.reset (rese

7、t),.clk_enable4 (clk_enable4),.clk (clk),.send_enable (send_enable),.clear4 (clear4),.counters( counters);/发送数据moduleclk_bau u3 ( .clk(clk) , .t1 (t1), .clk_enable (clk_enable) ); /时钟计数器模块ctrl u4( .read_enable (read_enable) , .send_enable (send_enable), .clk (clk), .state (state), .t1 (t1), .read (r

8、ead ), .counters (counters), .reset (reset ), .clear (clear) );check_cle u5 ( .state (state), .clear3 (clear3), .clear4 (clear4), .clear (clear), .clk_enable3 (clk_enable3), .clk_enable4 (clk_enable4), .clk_enable (clk_enable) );endmodule/3.3UART发送模块3.3.1UART的数据发送服务 发送器实现的功能是将输入的8位并行数据变为串行数据,同时在数据头部

9、加起始位,在数据位尾部加奇偶校验位和停止位。数据发送服务如表3.1计数器 0 18 9 10操作发送低电平发送数据和奇偶校验发送奇偶校验结果发送高电平表3.1数据发送其基 本 特 点是: 在 信 号线上共有两种状态,可分别用逻辑1和逻辑。来区分。在发送器空闲时,数据线应该保持在逻辑高电平状态。发送 起 始 位:该位是一个逻辑0,总是加在每一帧的头部,提示接受器数据传输即将开始,在接收数据位过程中又被分离出去,占据一个数据位的时间。发送 数 据 位:在起始位之后就是数据位,一般为8位一个字节的数据,低位在前,高位在后。如字母C在ASCII表中是十进制67,二进制01000011,那么传输的将是1

10、10000100。并在数据发送过程当中,进行数据位奇偶校验。 发送校 验 位:该位一般用来判断接收的数据位有无错误,常用的校验方法是奇偶校验法。将3过程当中奇偶校验的结果输入到数据线,并占一个数据位时钟。 停止位 :停止位总在每一帧的末尾,为逻辑1,用于标志一个字符传送的结束,占据一个数据位的时间。 帧:从起始位到停止位之间的一组数据称为一帧。3.3.2UART的数据发送操作如图3-4拉低电平空闲检测Cpu发送位检测 自检测接cpu传入数据拉高电平发送等待数据发送和奇偶校验奇偶结果发送图3-4数据发送操作解释:采用9600波特率发送从cpu传入数据:是指将data_in端口的数据存入寄存器中C

11、pu发送为检测:是指将ks寄存器置位,即数据发送完毕3.3.3UART的数据发送模块程序module rxd(dat_out,cs,read,reset, clk_enable3,clk,read_enable,clear3,counters);/接收数据moduleinput read_enable;input read,reset,clk;/read为串行输入,read_control为时钟控制,reset为重启键input7:0 counters;output cs,clear3,clk_enable3;/cs为通知cpu读取数据位output7:0 dat_out;/wire clea

12、r3;reg cs,cs1,clk_enable3;reg7:0 data_out;/移位寄存器 reg parity_check_result,parity_result,clear3,clear1;/always(posedge clk)beginif(read_enable)/当read_enable为高电平时为发送操作状态beginclk_enable3=1;clear3=clear1;endelsebeginclear3=1;endend/always(negedge counters0)/接收操作if(read_enable & !reset)begin if (counters=

13、8b00011000) /1begindata_out7=read;parity_check_result=parity_check_result + read;endelse if (counters=8b00101000) /2begindata_out6=read;parity_check_result=parity_check_result + read;endelse if (counters=8b00111000) /3 begindata_out5=read;parity_check_result=parity_check_result + read;endelse if (co

14、unters=8b01001000) /4begindata_out4=read;parity_check_result=parity_check_result + read;endelse if (counters=8b01011000) /5begindata_out3=read;parity_check_result=parity_check_result + read;endelse if (counters=8b01101000) /6begindata_out2=read;parity_check_result=parity_check_result + read;endelse

15、if (counters=8b01111000) /7begindata_out1=read;parity_check_result=parity_check_result + read;endelse if (counters=8b10001000) /8begindata_out0=read;parity_check_result=parity_check_result + read;endelse if (counters=8b10011000) /9进行奇偶校验检测beginparity_result=read; parity_result=#2 (parity_check_resul

16、t = parity_result) ? 1:0;endelse if (counters=8b10101000) /0进行帧检测begincs1=(read) ? 1:0; endelse if (counters=8b10101010) /01给cpu发送接收信号begincs=(cs1 & parity_result) ? 1:0;/当奇偶校验结果与帧检测结果都为1时,cs置位clear1=1;/clk_enable=0;/clk_enable3=0;endelse if(counters=8b00001000)/检测是否是毛刺beginclear1=(!read)?0:1;endels

17、e clear1=0;endelse clear1=1;endmodule3.3.4UART的数据发送模块程序仿真图当reset为零时图3-5reset为零时仿真图 如图为UART的数据发送模块的功能仿真图,为方便观察,其中的时钟是直接给出来的,根据图中的数据判读,其功能为正确,UART的数据发送模块编译成功。1. 当计时器为140ns时,为数据接收2. 当计时器为357ns时,为数据发送3. 当计时器为705ns时,为奇偶校验结果发送4. 当计时器为825ns时,发送高电平当reset为1时如图3-6图3-6reset为1时仿真图3.4UART接收模块3.4.1UART数据接收服务 串行 数

18、 据 帧和接收时钟是异步的,由逻辑1跳变为逻辑0可视为一个数据帧的开始,所以接收器首先要判断起始位。如表3.2计数器 0 18 9 10操作数据起始位检测数据接收和奇偶校验奇偶校验数据判断表3.2uart的数据接收服务 其基 本 特 点是:UART 接收状态 一 共 有 4个:state0(检测起始位),stat e1( 对数据位进行采样,并串/并转换),state2(奇偶校验 分析),state3(接收数据正确与否检测)。 起始位判读:当UART接收器复位以后,接收器将处 于这一状态。在该状态,控制器一直等待read电平的跳 变,即从逻辑1变为逻辑0,也就是等待起始位的到来 。一旦检测到起始

19、位,就对采样时钟elk一 rev 上跳沿计 数,当计数为8时,也就是确保在起始位的中间点 ,然后转到state1 状态。 数据接收 :该状态下,每间隔16位倍频采样一位 串行数据,接收8位异步数据并进行串/并转换。即对 clk一 rev 上跳沿计数,当为16时,就对数据采样,这样 保证了数据位是在中点处被采样的,同时串/并转换,当检测到已收到8个数据后以后,便进入了state2状态。 奇偶校验 :该状态实现的功能是奇偶校验。本文采 用的是偶校验。校验结束以后,转到state3状态。 数据帧判读 :该状态是用来帧校验的,即在校验位 以后,检测停止位是否为逻辑高电平3.4.2UART数据接收操作图

20、3-7UART数据接收操作起始位检测空闲检测Cpu接收位检测 检测毛刺检测数据帧检测接收等待数据位读取和奇偶校验奇偶结果比较图3-7UART数据接收操作解释:数据接收速度9600波特率,以16倍频接收cpu接收位检测:当奇偶结果比较和数据帧检测都正确时,cpu检测接收位cs置位3.4.3UART的数据接收模块程序/发送数据模块module txd(dat_in,send,reset,clk_enable4,clk,send_enable,clear4,counters,ks);/发送数据moduleinput7:0 dat_in,counters;input reset,clk,send_en

21、able;output send,clk_enable4,clear4;output ks;/jiawire clear;wire7:0 dat_s;reg send,parity_result,ks;reg clk_enable,clear1,clear4,clk_enable4;reg7:0 date_s;/always(posedge clk)beginif(send_enable & !reset)/当send_enable为高电平时为发送操作状态beginclk_enable4=1;clear4=clear1;endelsebeginclear4=1;endend /always(p

22、osedge clk)if(send_enable & !reset)beginif(counters=8b00000001)/0beginsend=0;date_s=dat_in;/?parity_result=1;endelse if(counters=8b00010000)/1beginsend=date_s0;parity_result=parity_result + date_s0;endelse if(counters=8b00100000)/2beginsend=date_s1;parity_result=parity_result + date_s0;endelse if(co

23、unters=8b00110000)/3beginsend=date_s2;parity_result=parity_result + date_s0;endelse if(counters=8b01000000)/4beginsend=date_s3;parity_result=parity_result + date_s0;endelse if(counters=8b01010000)/5beginsend=date_s4;parity_result=parity_result + date_s0; endelse if(counters=8b01100000)/6beginsend=da

24、te_s5;parity_result=parity_result + date_s0;endelse if(counters=8b01110000)/7beginsend=date_s6;parity_result=parity_result + date_s0;endelse if(counters=8b10000000)/8beginsend=date_s7;parity_result=parity_result + date_s0;endelse if(counters=8b10010000)/9发送奇偶校验结果beginsend=parity_result;endelse if(co

25、unters=8b10100000)/0发送高电平beginsend=1;endelse if(counters=8b10101111)/0beginclear1=1;ks=(send & parity_result) ? 1:0;endelse if(counters=8b00000000)beginsend=1;endelse clear1=0; end else send=1;endmodule/3.4.4UART的数据接收模块程序功能仿真图图3-8当counters指定时间时功能仿真图3-8当counters指定时间时解释:由图可明显看出data0和data1变化,模块功能仿真通过图3

26、-9当counters未指定时间时功能仿真图3-9当counters未指定时间时功能仿真3.5UART控制器3.5.1UART控制器服务 UART控制器实质上是一组计数器,由state决定计数器数据发送对象,在这里指定当state为1时,发送到UART接收模块,反之,发送到UART发送模块。当计数到指定数据时,触发指定模块的制定操作。3.5.2UART控制器模块程序module counters(read_enable,send_enable,clk,state,t1,read,counters,reset,clear);/程序计数寄存器input clk,state,t1,read,rese

27、t,clear;/state为uart状态输入,/clear为程序计数寄存器清零控制位output7:0 counters;output read_enable,send_enable;reg read_enable,send_enable,control;/read_enable为接收控制位?/send_enable为发送控制位,control为程序计数寄存器为零状态寄存位reg7:0 counters;/8位程序计数寄存器always(posedge clk)/当程序计数寄存器为零时,程序计数寄存器为零状态寄存位置位begincontrol=(!counters)? 1 : 0;end/always(negedge read)/uart发送或接收状态判断if(control)beginif(state)beginif(!read)beginread_enable=1;send_enable=0;endelsebeginsend_enable=0;endendelsebeginsend_enable=1;read_enable8b10101111)counters=8b00000000;elsecounters=counters + 1;endelsebegin

温馨提示

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

评论

0/150

提交评论