基于Verilog的UART模块的设计课程设计_第1页
基于Verilog的UART模块的设计课程设计_第2页
基于Verilog的UART模块的设计课程设计_第3页
基于Verilog的UART模块的设计课程设计_第4页
基于Verilog的UART模块的设计课程设计_第5页
已阅读5页,还剩22页未读 继续免费阅读

下载本文档

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

文档简介

1、 电子课程设计实践报告题 目:基于verilog的uart模块的设计 班 级: 信科07-4班 学 号: 08073653 姓 名: 姚万华 指导教师: 孙统风 中国矿业大学计算机学院2010-6-2摘 要uart(即 universal asynchronous receiver transmitter通用异步收发器)是广泛使用的串行数据传输协议。uart允许在串行链路上进行全双工的通信。通过应用 eda技术,基于 cpld/ fpga器件设计与实现 uart的波特率产生器、uart发送器和接收器及其整合电路,目的是熟练运用 verilog hd语言,掌握 cpld芯片的使用。波特率发生器、

2、接收器和发送器是uart的三个核心功能模块,利用verilog hdl语言对这三个功能模块进行描述并加以整合,通过maxplusii10.01仿真,用串口调试助手进行验证,其结果完全符合uart协议的要求和预期的结果。关键词:uart;串行通讯;veriloghdl;cpld;仿真目 录第1章 课题概述31.1 课题背景21.2 课题目的与意义21.3 报告组织结构2第2章 相关理论与技术32.1 uart相关内容简介32.1.1复杂可编程逻辑器件cpld简介32.1.2 rs-232介绍32.1.3 verilog hdl简介62.2 uart协议介绍62.3 硬件结构设计82.4

3、软件设计9第3章 课题详细设计与实现93.1uart的整体设计93.2 波特率发生器113.2.波特率的分频因子的计算113.3 接收模块设计133.3.1接收模块原理133.3.2接收模块的源程序143.4 发送模块设计53.4.1发送模块设计原理53.4.2发送模块源程序63.5功能的测试11结 论11参考文献1212第1章 课题概述1.1 课题背景uart协议是数据通信及控制系统中广泛使用的一种全双工串行数据传输协议,在实际工业生产中有时并不使用uart的全部功能。只需将其核心功能集成即可。波特率发生器、接收器和发送器是uart的三个核心功能模块,利用vefilog-hdl语言对这三个功

4、能模块进行描述并加以整合uart(即universal asynchronousreceiver transmitter 通用异步收发器)是广泛使用的串行数据传输协议。uart允许在串行链路上进行全双工的通信。串行外设用到rs232-c异步串行接口,一般采用专用的集成电路即uart实现。如8250、8251、ns16450等芯片都是常见的uart器件,这类芯片已经相当复杂,有的含有许多辅助的模块(如fifo),有时我们不需要使用完整的uart的功能和这些辅助功能。或者设计上用到了fpga/cpld器件,那么我们就可以将所需要的uart功能集成到fpga内部。使用vhdl或veriolog -h

5、dl将uart的核心功能集成,从而使整个设计更加紧凑、稳定且可靠。本文应用eda技术,基于fpga/cpld器件设计与实现uart。1.2 课题目的与意义实际应用上,有时我们不需要使用完整的uart的功能和这些辅助功能。使用verilog-hdl将所需要的uart的核心功能集成到fpgacpld内部,就可以实现紧凑、稳定且可靠的uart数据传输。这样,既可以满足实际的应用,实现所要求的简单的通信和控制,又能够去除更多不需要的繁杂复杂的功能实现。1.3 报告组织结构第一章介绍课题的背景目的及意义,同时介绍了整个课题报告的组织形式。第二章介绍uart协议和硬件结构;以及rs232的简要介绍。简要介

6、绍了课题所用的语言verilog hdl语言。第三章是课题的详细设计,分为波特率分频因子的计算,接收模块和发送模块。每一部分分为设计原理和源程序。最后是结论和参考文献。第2章 相关理论与技术2.1 uart相关内容简介2.1.1复杂可编程逻辑器件cpld简介cpld是 complex pld的简称, 顾名思义, 其是一种较pld为复杂的逻辑元件。cpld是一种整合性较高的逻辑元件。由于具有高整合性的特点, 故其有性能提升, 可靠度增加,pcb面积减少及成本下降等优点。cpld元件,基本上是由许多个逻辑方块(logic blocks) 所组合而成的。而各个逻辑方块均相似于一个简单的pld元件(

7、如 22v10) 。逻辑方块间的相互关系则由可变成的连线架构, 将整个逻辑电路合成而成。常见的cpld元件有 altera 公司的max5000 及max7000 系列。cypress的 max340 及flash370 系列等, 一般来说, cpld元件的逻辑门数约在10007000 门之间。【1】2.1.2 rs-232介绍rs232接口,就是普通电脑后面那个串口.一般为9针的,也有25针的.是1970年由美国电子工业协会(eia)联合贝尔系统、调制解调器厂家及计算机终端生产厂家共同制定的用于串行通讯的标准。它的全名是“数据终端设备(dte)和数据通讯设备(dce)之间串行二进制数据交换接

8、口技术标准”(rs-232c,其中c表示此标准修改了三次).标准中包括了电气和机械方面的规定.该标准规定采用一个25个脚的 db25连接器,对连接器的每个引脚的信号内容加以规定,还对各种信号的电平加以规定.后来随着设备的不断改进,成了目前大家普遍见到的9脚.【2】在不使用传输控制信号的情况下,用3根线就可以传输了,9芯的是2收3发5地,25芯的是2发3收7地。两设备用rs232相连的时候为收发,发收,地地。接口特性: (1)接口的电气特性:在rs-232c中任何一条信号线的电压均为负逻辑关系。即:逻辑“1”,-5 -15v;逻辑“0” +5 +15v 。噪声容限为2v。即要求接收器能识别低至+

9、3v的信号作为逻辑“0”,高到-3v的信号作为逻辑“1” (2) 接口的物理结构: rs-232-c接口连接器一般使用型号为db25的25芯插头座,通常插头在dce端,插座在dte端. 一些设备与pc机连接的rs-232c接口,因为不使用对方的传送控制信号,只需三条接口线,即“发送数据”、“接收数据”和“信号地”。所以采用db-9的9芯插头座,传输线采用屏蔽双绞线。 (3) 传输电缆长度由rs-232c标准规定在码元畸变小于4%的情况下,传输电缆长度应为50英尺.其实在一般应用中,传输距离小于50m,最大传输速率为20kbps.由于rs-232-c接口标准出现较早,难免有不足之处,主要有以下四

10、点: (1)接口的信号电平值较高,易损坏接口电路的芯片,又因为与ttl 电平不兼容故需使用电平转换电路方能与ttl电路连接。 (2)传输速率较低,在异步传输时,波特率为20kbps。 (3)接口使用一根信号线和一根信号返回线而构成共地的传输形式,这种共地传输容易产生共模干扰,所以抗噪声干扰性弱。 (4)传输距离有限,最大传输距离标准值为50英尺,实际上也只能用在50米左右。 rs232的接口芯片 单片机的串口是ttl电平,在实际应用时,需要将ttl电平转换成rs232电平。rs232的接口芯片很多,最著名的当然是maxim公司的max232;跟这个芯片完全兼容的芯片很多,象linear公司的l

11、t1081、lt1181,harris的icl232等,都是十分著名且常用的芯片,linear的串行接口转换芯片在早期的电路设计中经常可以见到,但是近来好像比较少见了。icl232似乎比max232便宜。看max232的原理框图,需要注意到2点:1)需要外接电容0.1u电容,或者1u的胆电解电容或电解电容,有一款232芯片不需要外接电容,但是因为在芯片中做一个达到电容效果的电路是比较难,所以也比较贵;所以一般都选用外接电容的;之所以需要电容,是因为rs232电平是工作在大约9v9v之间,需要电容将5v电压转换成rs232电平所需要的10v和10v;电路上叫电荷泵,很形象;2) rs232的逻辑

12、和ttl是正好相反的。在框图上,输入和输出之间的逻辑是反的;对于ttl电平,当没有232信号发出时,是高电平;对于rs232来说,这时,tx端是-89v电压,相对于0v来说;如果有了信号,那就是从+9v-9v交错变化的一系列信号,使用示波器可以看到信号的变化。利用以上的特点,我们可以测试rs232接口电路的好坏。1)判断芯片是否正常,参见max232的框图,使用万用表测量2和6脚,只要2脚的电压在8v9v之间、6脚在-8v-9v之间,就基本上可以断定这个芯片是好的;2)在rs232没有发信号时,看tx端电压为rs232的高电平,也就是-8v-9v之间,当发信号时,数据在变化,这说明这个rs23

13、2的端口是好的;这个方法也适用于测量本地的串口。早起的rs232接口芯片是mc1488(发送)、mc1489。mc1489因为只有接收,所以是单5v电源工作;mc1488则需要正负12v电源;但是在工控机的板卡中,正负电源不是问题,所以在moxa c168等多串口卡中,仍然使用mc1488、mc1489,价格便宜成本低啊2.1.3 verilog hdl简介verilog hdl是一种硬件描述语言,用于从算法级、门级到开关级的多种抽象设计层次的数字系统建模。被建模的数字系统对象的复杂性可以介于简单的门和完整的电子数字系统之间。数字系统能够按层次描述,并可在相同描述中显式地进行时序建模

14、。verilog hdl 语言具有下述描述能力:设计的行为特性、设计的数据流特性、设计的结构组成以及包含响应监控和设计验证方面的时延和波形产生机制。所有这些都使用同一种建模语言。此外,verilog hdl语言提供了编程语言接口,通过该接口可以在模拟、验证期间从设计外部访问设计,包括模拟的具体控制和运行。verilog hdl语言不仅定义了语法,而且对每个语法结构都定义了清晰的模拟、仿真语义。因此,用这种语言编写的模型能够使用verilog仿真器进行验证。语言从c编程语言中继承了多种操作符和结构。verilog hdl提供了扩展的建模能力,其中许多扩展最初很难理解。但是,verilog hdl

15、语言的核心子集非常易于学习和使用,这对大多数建模应用来说已经足够。当然,完整的硬件描述语言足以对从最复杂的芯片到完整的电子系统进行描述。2.2 uart协议介绍基本的uart通信只需要两条信号线(rxd,txd)就可以完成数据的全双工通信任务。txd是uart发送端,为输出;rxd是uart接收端,为输人【3】。uart的基本特点是:在信号线上共有两种状 态,分别用逻辑1(高电平)和逻辑o(低电平)来区分。例如,在发送器空闲时,数据线保持在逻辑高电平状态,发送器是通过发送起始位来开始一个数据帧的传送,起始位使数据线处于逻辑o状态,提示接收器数据传输即将开始。接着发送数据位,数据位一般为8位一个

16、字节的数据(也有5位、6位或7位的情况),低位(lsb)在前,高位(msb)在后。然后发送校验位,校验位一般用来判断传输的数据位有无错误,一般是奇偶校验。在使用中,该位常取消。停止位在最后,用以标识数据传送的结束,它对应于逻辑1状态。uart的帧格式包括起始位(start bit,低电平)、58位数据位(data bits)、校验位(parity bit,可选)和停止位(stop bit,位数可为1、15、2位)。这种格式是由起始位和停止位来实现字符的同步h1,如图l所示。2.3 硬件结构设计2.4软件设计软件采用 altera公司的 max+plus设计逻辑结构,设计的内容包括通用 i/o地

17、址译码器、各个寄存器以及 uart核。uart核主要包括 3个部分:波特率发生器、数据发送部分和数据接收部分。 i/o地址译码器和 uart核使用硬件描述语言 veriloge-hdl来编写实现。第3章 课题详细设计与实现3.1uart的整体设计3.2 波特率发生器3.2.波特率的分频因子的计算产生波特率的主信号频率是越高越好,这样才可产生较高且精确的波特率。若是以 40mhz主频率要产生 9600 波特率则必须将此clock= 40mhz除以 4166. 66666不是整数,取一个最接近的数是 4166 则波特率为 9601. 53 ,其误差小于 00. 1 %。假如除数为 4160 则波特

18、率为 40 000 000/4160 = 9615.38其误差率为0.16 %。这里取div_clk=4167电路的时序模拟如图 2所示。分频模块的程序流程图3.3 接收模块设计3.3.1接收模块原理接收不是由本机启动,而是由一个外部事件触发的。在空闲状态时,若接收线上出现一个下降沿,即视为一个可能的起始位,应该对其再次采样加以确定。一个真实的起始位,其低电平维持时间为104.3ns。我们在起始位的中间时刻,以波特率的16倍频对接收线采样三次,经多数表决确认其电平状态。状态为高,表明是一个干扰信号,uart仍回到空闲状态。若确认接收线的状态为低,则这个起始位得到确认,uart开始接收后续数据。

19、每一位的接收方式与起始位确认方式一样,uart对数据接收的时序图参见图4。接收完毕uart又回到空闲状态。如果最后的停止位出错,则这一帧数据接收失败,放弃接收到的数据。uart的接收状态转换图见图3。 3.3.2接收模块的源程序timescale 1ns/1nsmodule receiver(data_out,data_ready,framing_error,parity_error,serial_in,clock,reset);output data_ready; /数据接收完毕output 7:0data_out;/输出数据总线output framing_error;/帧错误信号1out

20、put parity_error; /验错误信号1input serial_in; /串行数据输入input clock; /输入时钟input reset; /复位信号1有?/input read_strobe; /读锁存信号0有?初始值为1parameter baud_cnt=4;/波特率输入数据,数字代表接收时钟分频40mh,分频系数4166parameter rvbaud_cnt=2;reg serial_in1;reg serial_in2;reg rxclk_enable;reg 2:0 clk_div;reg 1:0 rvclk_div;reg 7:0 rsr;reg 7:0 r

21、br;reg 3:0 control_cnt;reg data_ready;reg parity;reg parity_error;reg framing_error; wire rxclk; /接收时钟1有?wire read_strobe; /读锁存信号0有?初始值为1/输入数据寄存器,用于下降沿检查always (posedge clock)beginserial_in1<=serial_in;serial_in2<=serial_in1;end/接收时钟使能,在时钟使能范?内产生接受时钟并对输入数据采样always (posedge clock or posedge res

22、et)begin if(reset) begin rxclk_enable<=1'b0; / parity<=1'b0; end else if(!serial_in1&&serial_in2) /检查下降沿 rxclk_enable<=1'b1; else if(control_cnt=10) /数据接收完毕 begin rxclk_enable<=1'b0; / parity<=1'b0; endend/控制计数器always (posedge rxclk or posedge reset)begin i

23、f(reset) control_cnt=0; else begin if(!rxclk_enable) control_cnt=0; else control_cnt=control_cnt+1; endend/数据接收完毕,通知微处理器可以产生read_strobe信号来读取并行数据always (posedge clock or posedge reset or negedge read_strobe) begin if(reset) data_ready=1'b0; else if (!read_strobe) data_ready=1'b0; else if (con

24、trol_cnt=10) data_ready=1'b1; end/产生接受时钟always (posedge clock or posedge reset) begin if(reset) clk_div=0; else begin if(rxclk_enable) begin if(clk_div>=(baud_cnt-1) clk_div=0; else clk_div=clk_div+1; end end endassign rxclk=(clk_div>=baud_cnt-1) ? 1:0;always (negedge clock) begin if(rvclk

25、_div>=rvbaud_cnt-1) rvclk_div=0; else rvclk_div=rvclk_div+1;endassign read_strobe=(rvclk_div>=rvbaud_cnt-1) ? 1:0;/*接收数据进程: rsr:接收移位寄存器 rbr:接收缓冲寄存器*/always (posedge rxclk or posedge reset) if(reset) begin rsr<=8'b0; rbr<=8'b0; parity<=1'b1; /偶校验,如果是奇校验,parity=0; framing_er

26、ror=1'b0; parity_error=1'b0; end else begin if(control_cnt>=1&&control_cnt<=8) begin rsr7<=serial_in; rsr6:0<=rsr7:1; /移位 parity<=parityrsr7;/产生校验码 end else if (control_cnt=9) begin rbr<=rsr; /缓冲 end else if(!parity) parity_error=1'b1; /产生校验信息 else if (control_c

27、nt=10)&&(serial_in!=1'b1) framing_error=1'b1; /产生侦错误信号 else framing_error=1'b0; endassign data_out=!read_strobe ? rbr : 8'bz; /并行数据输出endmodule3.4 发送模块设计3.4.1发送模块设计原理以波特率频率产生器的txclk将数据data_in以write_strobe控制信号将其送入发送缓冲寄存器 rbr ,并令寄存器内容已载有数据而非空的标志 rsr= 0。当同步波特率信txclk来临时监视是否处于rsr=

28、0(内有数据)以及rsr= 0(内有送入数据) ,但因 rsr以送入传输寄存器 rbr内,为空故rsr = 1 ,此rsr代表缓冲寄存器rbr是否有被送入数据或已转送入传输寄存器,rbr是否为空,可再予以送入新的要发送的数据。假如rsr= 0(内有送入数据)则便要开始进行数据串行传输,传出数据为8位,连同启动信号“0”、校验位、停止信号共需12位的发送计数,以control_cnt作计数。当control_cnt = 0计数器便开始递加计数字节,同时令 start起始信号为 0 ,送入 txd输出端输出。而在计数器为18时都将rbr的最低位rbr(0)输出到 txd端,并令 rbr 作算术右移

29、运算。依次将rbr 的d7d0通过d0移到 txd端输出,直到第 12位是停止移位,并将停止位 txd = 0发送而结束一个8位数据的发送。发送流程图如图5。对应的发送模块的模拟时序则如图6所示。3.4.2发送模块源程序timescale 1ns/1nsmodule transmit(data_in,transmiting,reset,clock,serie_out);output transmiting; /表示正在发送output serie_out; /串行输出数据input 7:0 data_in; /并行输入数据input clock;input reset;parameter ba

30、ud_cnt=4; /代表波特率输入数据,数字代表接收时钟的分频数parameter txbaud_cnt=2;reg transmiting;reg txclk_enable;reg 7:0 tsr; /发送移位寄存器reg 7:0 tbr; /发送缓冲寄存器reg parity;reg 2:0 clk_div;reg 1:0 txclk_div;wire txclk;wire write_strobe; /写锁存信号reg serie_out;reg 3:0 control_cnt;reg write_strobe1;reg write_strobe2;/initial begin txc

31、lk_enable<=1'b0; end/always #10 write_strobe=write_strobe;/写入控制信号寄存器,用于下降沿always (posedge clock) begin write_strobe1<=write_strobe; write_strobe2<=write_strobe1; end/发送时钟使能,在时钟使能和范围内产生发送时钟,发送适中的数据和此时钟同步always (posedge clock or posedge reset) if(reset) begin transmiting<=1'b0; txc

32、lk_enable<=1'b0; end / else if(!txclk_enable) / begin else if(!write_strobe1&&write_strobe2) /检测下降沿 begin txclk_enable<=1'b1; end / end else if(control_cnt=1) begin transmiting<=1; end else if(control_cnt=12) begin txclk_enable<=1'b0; transmiting<=1'b0; / parit

33、y<=1'b0;/检测校验位 end/控制计数器always (posedge txclk or posedge reset ) if(reset) control_cnt=0; else if(!txclk_enable) control_cnt=0; else control_cnt=control_cnt+1;/*在write_strobe的下降沿接收并行数据到发送缓冲器tbr:transmit buffer register*/always (negedge write_strobe or posedge reset)beginif(reset)tbr=8'b0;

34、 elsetbr=data_in;end/产生发送时钟always (posedge clock or posedge reset)begin if(reset) clk_div=0; else begin if(txclk_enable) begin if(clk_div>=(baud_cnt-1) clk_div=0; else clk_div=clk_div+1; end endendassign txclk=(clk_div>=baud_cnt-1)? 1:0; always (negedge clock)begin if(txclk_div>=(txbaud_cnt

35、-1) txclk_div=0; else txclk_div=txclk_div+1;endassign write_strobe=(txclk_div>=txbaud_cnt-1)? 1:0;/*发送数据进程tsr:transmit serial register;tbr:transmit buffer register*/always (negedge txclk or posedge reset) if(reset) begin serie_out<=1'b1; parity<=1'b0; /偶检验,如果是奇校验设parity=1'b1; ts

36、r<=8'b0; end else begin if(control_cnt=1) begin tsr<=tbr; end else if(control_cnt=2) serie_out<=1'b0; /发送起始位 else if(control_cnt>=3)&&(control_cnt<=10) begin tsr6:0<=tsr7:1; tsr7<=1'b0; serie_out<=tsr0;/发送串行数据,lsb parity<=paritytsr0;/计算校验位 end else if(c

37、ontrol_cnt=11) begin serie_out<=parity; /发送校验位 end else if(control_cnt=12) /发送停止位 begin serie_out<=1'b1; parity<=1'b0; end endendmodule3.5功能的测试本课题中设计的所有模块均采用verilog-hdl硬件描述语言进行描述,在altera公司的maxplus ii开发环境下进行程序的编译、逻辑综合和仿真以及管脚分配,在cpldee-4系统上进行验证。cpldee-4型实验开发系统简介 本设计采用中国矿业大学信息与电气工程学院制造的cpldee-4型实验开发系统,其cpld芯片为altera公司的acex ep1k100qc208

温馨提示

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

评论

0/150

提交评论