ImageVerifierCode 换一换
格式:DOC , 页数:23 ,大小:262.50KB ,
资源ID:3367721      下载积分:10 金币
快捷注册下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

开通VIP
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.zixin.com.cn/docdown/3367721.html】到电脑端继续下载(重复下载【60天内】不扣币)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

开通VIP折扣优惠下载文档

            查看会员权益                  [ 下载后找不到文档?]

填表反馈(24小时):  下载求助     关注领币    退款申请

开具发票请登录PC端进行申请

   平台协调中心        【在线客服】        免费申请共赢上传

权利声明

1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前可先查看【教您几个在下载文档中可以更好的避免被坑】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时联系平台进行协调解决,联系【微信客服】、【QQ客服】,若有其他问题请点击或扫码反馈【服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【版权申诉】”,意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:0574-28810668;投诉电话:18658249818。

注意事项

本文(FPGA的UART完整设计.doc)为本站上传会员【快乐****生活】主动上传,咨信网仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知咨信网(发送邮件至1219186828@qq.com、拔打电话4009-655-100或【 微信客服】、【 QQ客服】),核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载【60天内】不扣币。 服务填表

FPGA的UART完整设计.doc

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

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

3、可划分为4个部分,如波特发生器,控制器,接收器,发送器,如图3-3所示: read send clear_check read send Clr3 clr4 ks cs Data_in Data_out clear Read_enable send_enable counters counters reset Counters(control) state T1 clk_enable Clk_clear Clk(波特发生器)

4、 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/1ns module gs_opt( input wire read, input wire

5、 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

6、enable4; wire clear3 ; wire clear4 ; wire clk_enable; wire [7:0] counters; wire clear ; wire t1; /* read,send,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为时钟输入

7、50MHZ,reset为重启键 input[7:0] dat_in;//并行数据输入 output send,cs,ks; //send为串行输出,cs为通知cpu接收数据位,ks为发送准备位 output[7:0] dat_out;//并行数据输出 wire clear,clk_enable,read_enable,clear3,send_enable,clear4,t1; wire[7:0] counters,dat_in;*/ rxd u1 ( .dat_out (dat_out) , .cs (cs) , .read

8、read) , .reset (reset) , .clk_enable3 (clk_enable3) , .clk (clk) , .read_enable (read_enable) , .clear3 (clear3) , .counters (counters) ); //接收数据module txd u2 ( .dat_in (dat_in), .ks (ks), .send (send), .reset (reset),

9、 .clk_enable4 (clk_enable4), .clk (clk), .send_enable (send_enable), .clear4 (clear4), .counters( counters) );//发送数据module clk_bau u3 ( .clk(clk) , .t1 (t1), .clk_enable (clk_enable) ); //时钟计数器模块 ctrl u4( .

10、read_enable (read_enable) , .send_enable (send_enable), .clk (clk), .state (state), .t1 (t1), .read (read ), .counters (counters), .reset (reset ), .clear (clear) ); check_cle u5

11、 .state (state), .clear3 (clear3), .clear4 (clear4), .clear (clear), .clk_enable3 (clk_enable3), .clk_enable4 (clk_enable4), .clk_enable (clk_enable) ); endmodule//////////////////////////

12、///////////////////////////////////////////////////////////////////////////////////////////// 3.3UART发送模块 3.3.1UART的数据发送服务 发送器实现的功能是将输入的8位并行数据变为串行数据,同时在数据头部加起始位,在数据位尾部加奇偶校验位和停止位。数据发送服务如表3.1 计数器 0 1~~~8 9 10 操作 发送低电平 发送数据和奇偶校验 发送奇偶校验结果 发送高电平 表3.1数据发送 其基 本 特 点是: ① 在

13、 信 号线上共有两种状态,可分别用逻辑1和逻辑。来区分。在发送器空闲时,数据线应该保持在逻辑高电平状态。 ②发送 起 始 位:该位是一个逻辑0,总是加在每一帧的头部,提示接受器数据传输即将开始,在接收数据位过程中又被分离出去,占据一个数据位的时间。 ③发送 数 据 位:在起始位之后就是数据位,一般为8位一个字节的数据,低位在前,高位在后。如字母C在ASCII表中是十进制67,二进制01000011,那么传输的将是110000100。并在数据发送过程当中,进行数据位奇偶校验。 ④ 发送校 验 位:该位一般用来判断接收的数据位有无错误,常用的校验方法是奇偶校验法。将3过程当中奇偶校验的结果输

14、入到数据线,并占一个数据位时钟。 ⑤ 停止位 :停止位总在每一帧的末尾,为逻辑1,用于标志一个字符传送的结束,占据一个数据位的时间。 ⑥ 帧:从起始位到停止位之间的一组数据称为一帧。 3.3.2UART的数据发送操作 如图3-4 拉低电平 空闲检测 Cpu发送位检测 自检测 接cpu传入数据 拉高电平 发送等待 数据发送和奇偶校验 奇偶结果发送 图3-4数据发送操作 解释:采用9600波特率发送 从cpu传入数据:是指将data_in端口的数据存入寄存器中 Cpu发送为检测:是指将ks寄存器置位

15、即数据发送完毕 3.3.3UART的数据发送模块程序 module rxd(dat_out,cs,read,reset, clk_enable3,clk,read_enable,clear3,counters); //接收数据module input read_enable; input read,reset,clk;//read为串行输入,read_control为时钟控制,reset为重启键 input[7:0] counters; output cs,clear3,clk_enable3;//cs为通知cpu读取数据位 output[7:0] d

16、at_out;//wire clear3; reg cs,cs1,clk_enable3; reg[7:0] data_out;//移位寄存器 reg parity_check_result,parity_result,clear3,clear1;///////////////////////////////////////////////////////////////////////// always@(posedge clk) begin if(read_enable)//当read_enable为高电平时为发送操作状态 begin

17、 clk_enable3<=1; clear3<=clear1; end else begin clear3<=1; end end ////////////////////////////////////////////////////////////////////////////// always@(negedge counters[0]) ///接收操作 if(read_enable & !reset) begin if (counters==8'b00011000) //1

18、 begin data_out[7]<=read; parity_check_result<=parity_check_result + read; end else if (counters==8'b00101000) //2 begin data_out[6]<=read; parity_check_result<=parity_check_result + read; end else if (counters==8'b00111000) //3 begin d

19、ata_out[5]<=read; parity_check_result<=parity_check_result + read; end else if (counters==8'b01001000) //4 begin data_out[4]<=read; parity_check_result<=parity_check_result + read; end else if (counters==8'b01011000) //5 begin data_out[3]<=read; par

20、ity_check_result<=parity_check_result + read; end else if (counters==8'b01101000) //6 begin data_out[2]<=read; parity_check_result<=parity_check_result + read; end else if (counters==8'b01111000) //7 begin data_out[1]<=read; parity_check_result<=parity_c

21、heck_result + read; end else if (counters==8'b10001000) //8 begin data_out[0]<=read; parity_check_result<=parity_check_result + read; end else if (counters==8'b10011000) //9进行奇偶校验检测 begin parity_result<=read; parity_result<=#2 (parity_check_

22、result == parity_result) ? 1:0; end else if (counters==8'b10101000) //0进行帧检测 begin cs1<=(read) ? 1:0; end else if (counters==8'b10101010) //01给cpu发送接收信号 begin cs<=(cs1 && parity_result) ? 1:0;//当奇偶校验结果与帧检测结果都为1时,cs置位 clear1<=1; //clk_enable<=0;

23、 //clk_enable3<=0; end else if(counters==8'b00001000)//检测是否是毛刺 begin clear1<=(!read)?0:1; end else clear1<=0; end else clear1<=1; endmodule 3.3.4UART的数据发送模块程序仿真图 当reset为零时 图3-5reset为零时仿真图 如图为UART的数据发送模块的功能仿真图,为方便观察,其中的时钟是直接给出来的,根据图中的数据判读,其功能为

24、正确,UART的数据发送模块编译成功。 1. 当计时器为140ns时,为数据接收 2. 当计时器为357ns时,为数据发送 3. 当计时器为705ns时,为奇偶校验结果发送 4. 当计时器为825ns时,发送高电平 当reset为1时 如图3-6 图3-6reset为1时仿真图 3.4UART接收模块 3.4.1UART数据接收服务 串行 数 据 帧和接收时钟是异步的,由逻辑1跳变为逻辑0可视为一个数据帧的开始,所以接收器首先要判断起始位。如表3.2 计数器 0 1~~~~8 9 10

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

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

27、空闲检测 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);//发送数据module inpu

28、t[7:0] dat_in,counters; input reset,clk,send_enable; output send,clk_enable4,clear4; output ks;//jia wire clear; wire[7:0] dat_s; reg send,parity_result,ks; reg clk_enable,clear1,clear4,clk_enable4; reg[7:0] date_s; ////////////////////////////////////////////////////////////////////////

29、///////////////////////////////// always@(posedge clk) begin if(send_enable & !reset)//当send_enable为高电平时为发送操作状态 begin clk_enable4<=1; clear4<=clear1; end else begin clear4<=1; end end ////////////////////////////////////////////////////////////

30、//////////////////////////////////////////////// always@(posedge clk) if(send_enable & !reset) begin if(counters==8'b00000001)//0 begin send<=0; date_s<=dat_in;//? parity_result<=1; end else if(counters==8'b00010000)//1 begin send<=date_s[0]; parity_res

31、ult<=parity_result + date_s[0]; end else if(counters==8'b00100000)//2 begin send<=date_s[1]; parity_result<=parity_result + date_s[0]; end else if(counters==8'b00110000)//3 begin send<=date_s[2]; parity_result<=parity_result + date_s[0]; end else if(c

32、ounters==8'b01000000)//4 begin send<=date_s[3]; parity_result<=parity_result + date_s[0]; end else if(counters==8'b01010000)//5 begin send<=date_s[4]; parity_result<=parity_result + date_s[0]; end else if(counters==8'b01100000)//6 begin send<=dat

33、e_s[5]; parity_result<=parity_result + date_s[0]; end else if(counters==8'b01110000)//7 begin send<=date_s[6]; parity_result<=parity_result + date_s[0]; end else if(counters==8'b10000000)//8 begin send<=date_s[7]; parity_result<=parity_result + date_s[0

34、]; end else if(counters==8'b10010000)//9发送奇偶校验结果 begin send=parity_result; end else if(counters==8'b10100000)//0发送高电平 begin send<=1; end else if(counters==8'b10101111)//0 begin clear1<=1; ks<=(send && parity_result) ? 1:0; end else if(coun

35、ters==8'b00000000) begin send<=1; end else clear1<=0; end else send<=1; endmodule ///////////////////////////////////////////////////////////////// 3.4.4UART的数据接收模块程序功能仿真图 图3-8当counters指定时间时功能仿真 图3-8当counters指定时间时 解释:由图可明显看出data[0]和data[1]变化

36、模块功能仿真通过 图3-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,

37、counters,reset,clear);//程序计数寄存器 input clk,state,t1,read,reset,clear;//state为uart状态输入, //clear为程序计数寄存器清零控制位 output[7:0] counters; output read_enable,send_enable; reg read_enable,send_enable,control;//read_enable为接收控制位?//// //////send_enable为发送控制位,control为程序计数寄存器为零状态寄存位 reg[7:0] counters;//8位

38、程序计数寄存器 always@(posedge clk) //当程序计数寄存器为零时,程序计数寄存器为零状态寄存位置位 begin control<=(!counters)? 1 : 0; end /////////////////////////////////////////////////////////////////////////////////////// always@(negedge read)//uart发送或接收状态判断 if(control) begin if(state) begin if(!read

39、) begin read_enable<=1; send_enable<=0; end else begin send_enable<=0; end end else begin send_enable<=1; read_enable<=0; end end //////////////////////////////////////////////////////////// always@(pos

40、edge t1) if(!reset && !clear)//reset为1时,clear为1时程序计数寄存器清零 begin if(counters>8'b10101111) counters<=8'b00000000; else counters<=counters + 1; end else begin counters<=8'b00000000; end endmodule 3.5.2UART控制器模块程序仿真图 图3-10UART控制器模块程序仿真

41、图 由图判读有: 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控制器

42、提供时钟,本文采用9600波特率发送或接收数据。波特率发生器实际上就是分频器,设计比较简单。 3.6.2UART波特发生器模块程序 ///波特率产生模块 module clk_bau(clk,t1,clk_enable);//时钟计数器模块 input clk,clk_enable; output t1; //output[8:0] counter1; reg t1; reg[7:0] counter1; //(48,000,000/9,600)=5,000 为一个数据发送计数,接收为16倍频为5,000/16=312 always@(posedge clk)

43、if(clk_enable)//当clk_enable有效时,计数器计数 begin if(counter1==8'b10010111)//当counter等于156时 begin counter1<=8'b00000000;//counter清零 t1<=t1 + 1;//t1取反 end else begin counter1<=counter1 + 1; t1<=t1; end end else begin counter1<=8'b00000000; t1<=0; end endmodule 3.6.13UART波特发生器程序仿真图 如图3-11; 图3-11UART波特发生器程序仿真图 由图判读: 1. 当clk_enable为0时,时钟不计时; 2. 当clk_enable为1时,时钟计时 译文 专业文档供参考,如有帮助请下载。

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服