FPGA的UART完整编辑设计.doc

上传人:小** 文档编号:3006998 上传时间:2020-06-21 格式:DOC 页数:23 大小:300.43KB
返回 下载 相关 举报
FPGA的UART完整编辑设计.doc_第1页
第1页 / 共23页
FPGA的UART完整编辑设计.doc_第2页
第2页 / 共23页
点击查看更多>>
资源描述

《FPGA的UART完整编辑设计.doc》由会员分享,可在线阅读,更多相关《FPGA的UART完整编辑设计.doc(23页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

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

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

3、ablecounterscountersresetCounters(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 clk,input wire

4、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,send,cs,ks,reset,s

5、tate,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,clear3,send_enable,

6、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 (reset),.clk_enable4

7、(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 (read ), .counters

8、 (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,那么传输的将是110000100。并在数据发送过

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

11、置位,即数据发送完毕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 clear3;reg cs,cs1,cl

12、k_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=8b00011000) /1be

13、gindata_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 (counters=8b0100100

14、0) /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 if (counters=8b0

15、1111000) /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_result = parity_resul

16、t) ? 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;endelse clear1=0;endel

17、se 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,也就是等待起始位的到来 。一旦检测到起始位,就对采样时钟elk一 rev

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

20、检测空闲检测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_enable;output send

21、,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(posedge clk)if(se

22、nd_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(counters=8b0011000

23、0)/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=date_s5;parity_res

24、ult=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(counters=8b1010000

25、0)/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-9当counters未指定时间

26、时功能仿真图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,reset,clear;/state为u

27、art状态输入,/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 re

28、ad)/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;endelsebegincounters=8b00000000;endendmodule3.5.2UART控制器模块程序仿真图图3-10UART控制器模块程序仿真图由图判读有:

29、1. 当计时器为175ns时,!计时器=0,control被赋予1;xx_enable未被赋值2. 当计时器为265ns时,xx_enable未被赋值3. 当计时器为335ns时,xx_enable被赋值4. 当计时器为475ns时,xx_enable被赋值5. 当计时器为630ns时,xx_enable被赋值6. 当计时器为721ns时,xx_enable未被赋值7. 当计时器为850ns时,xx_enable被赋值可判断UART控制器模块程序编译成功3.6UART波特发生器3.6.1UART波特发生器服务为UART控制器提供时钟,本文采用9600波特率发送或接收数据。波特率发生器实际上就是

30、分频器,设计比较简单。3.6.2UART波特发生器模块程序/波特率产生模块module clk_bau(clk,t1,clk_enable);/时钟计数器模块input clk,clk_enable;output t1;/output8:0 counter1;reg t1;reg7:0 counter1;/(48,000,000/9,600)=5,000 为一个数据发送计数,接收为16倍频为5,000/16=312always(posedge clk)if(clk_enable)/当clk_enable有效时,计数器计数beginif(counter1=8b10010111)/当counter等于156时begincounter1=8b00000000;/counter清零t1=t1 + 1;/t1取反endelsebegincounter1=counter1 + 1; t1=t1;endendelsebegincounter1=8b00000000;t1=0;endendmodule3.6.13UART波特发生器程序仿真图如图3-11;图3-11UART波特发生器程序仿真图由图判读:1. 当clk_enable为0时,时钟不计时;2. 当clk_enable为1时,时钟计时-*

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 技术资料 > 其他杂项

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com