串口接收模块verilog设计_第1页
串口接收模块verilog设计_第2页
串口接收模块verilog设计_第3页
串口接收模块verilog设计_第4页
串口接收模块verilog设计_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

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

文档简介

1、武汉理工大学能力强化训练课程设计说明书目录串口接收模块的verilog设计11现场可编程门阵列FPGA22 Verilog HDL简介33串行通信系统33.1串行通信概念43.3 RS-232总线53.3.1 RS-232接口特性53.3串行通信接口组成63.4 通信协议73.5系统整体结构84 UART简介94.1 接收模块功能设计描述114.2波特率模块164.3验证175总结体会18参考文献19串口接收模块的verilog设计摘要:UART(即Universal Asynchronous Receiver Transmitter)是数据通信及控制中广泛使用的一种全双工串行数据传输协议。本

2、设计基于 FPGA器件实现对UART的波特率产生器、UART发送器和接收器及其整合电路的模块化设计,采用Verilog HDL语言对三个功能模块进行硬件描述。通过串口调试助手进行验证,其结果完全符合UART协议的要求和预期的结果。关键词:UART FPGA Verilog HDL 验证1现场可编程门阵列FPGA 20世纪80年代中期,FPGA刚出现时,大部分用来实现粘合逻辑、中等复杂度的状态机和相对有限的数据处理任务。在20世纪90年代早期,FPGA的规模和复杂度开始增加,那时它们的主要场所在通信和网络领域。到了20世纪90年代末,FPGA在消费、汽车和工业领域的应用经历了爆炸式增长。21世纪

3、早期,已经可以买到数百万容量的高性能FPGA。今天FPGA几乎可以用来实现任何东西,包括通信设备和软件定义无线电,雷达、影像和其它数字信号处理的应用,直至包含硬件和软件的片上系统。FPGA(field-Programmable Gate Array),即现场可编程门阵列,它是在PAL、GAL、CPLD等可编程器件的基础上进一步发展的产物。它是作为专用集成电路(ASIC)领域中的一种半定制电路出现的,既解决了制定电路的不足,又克服了原有可编程器件门电路数有限的缺点。 目前以硬件描述语言(Verilog 或 VHDL)所完成的电路设计,可以经过简单的综合与布局,快速的烧录至 FPGA 上进行测试,

4、是现代 IC 设计验证的技术主流。这些可编辑元件可以被用来实现一些基本的逻辑门电路(比如AND、OR、XOR、NOT)或者更复杂一些的组合功能比如解码器或数学方程式。在大多数的FPGA里面,这些可编辑的元件里也包含记忆元件例如触发器(Flipflop)或者其他更加完整的记忆块。 系统设计师可以根据需要通过可编辑的连接把FPGA内部的逻辑块连接起来,就好像一个电路试验板被放在了一个芯片里。一个出厂后的成品FPGA的逻辑块和连接可以按照设计者而改变,所以FPGA可以完成所需要的逻辑功能。 FPGA一般来说比ASIC(专用集成芯片)的速度要慢,无法完成复杂的设计,而且消耗更多的电能。但是他们也有很多

5、的优点比如可以快速成品,可以被修改来改正程序中的错误和更便宜的造价。厂商也可能会提供便宜的但是编辑能力差的FPGA。因为这些芯片有比较差的可编辑能力,所以这些设计的开发是在普通的FPGA上完成的,然后将设计转移到一个类似于ASIC的芯片上。 FPGA采用了逻辑单元阵列LCA(Logic Cell Array)这样一个概念,内部包括可配置逻辑模块CLB(Configurable Logic Block)、输出输入模块IOB(Input Output Block)和内部连线(Interconnect)三个部分。FPGA的基本特点主要有: 1、采用FPGA设计ASIC电路,用户不需要投片生产,就能得

6、到合用的芯片。 2、FPGA可做其它全定制或半定制ASIC电路的中试样片。 3、FPGA内部有丰富的触发器和IO引脚。 4、FPGA是ASIC电路中设计周期最短、开发费用最低、风险最小的器件之一。 5、FPGA采用高速CHMOS工艺,功耗低,可以与CMOS、TTL电平兼容可以说,FPGA芯片是小批量系统提高系统集成度、可靠性的最佳选择之一。 FPGA是由存放在片内RAM中的程序来设置其工作状态的,因此,工作时需要对片内的RAM进行编程。用户可以根据不同的配置模式,采用不同的编程方式当加电时,FPGA芯片将EPROM中数据读入片内编程RAM中,配置完成后,FPGA进入工作状态。掉电后,FPGA恢

7、复成白片,内部逻辑关系消失,因此,FPGA能够反复使用。FPGA的编程无须专用的FPGA编程器,只须用通用的EPROM、PROM编程器即可。当需要修改FPGA功能时,只需换一片EPROM即可。这样,同一片FPGA,不同的编程数据,可以产生不同的电路功能。因此,FPGA的使用非常灵活。当然FPGA存在于在某些场合选它而不是单片机的优势: FPGA运行速度快:FPGA内部集成锁项环,可以把外部时钟倍频,核心频率可以到几百M,而单片机运行速度低的多。在高速场合,单片机无法代替FPGA。 FPGA管脚多,容易实现大规模系统:单片机IO口有限,而FPGA动辄有数百个IO口,可以方便连接外设。比如一个系统

8、有多路AD、DA,单片机要进行仔细的资源分配,总线隔离,而FPGA由于丰富的IO资源,可以很容易用不同IO连接各外设。FPGA内部程序并行运行,有处理更复杂功能的能力:单片机程序是串行执行的,执行完一条才能执行下一条,在处理突发事件时只能调用有限的中断资源;而FPGA不同,逻辑可以并行执行,可以同时处理不同任务,这就导致了FPGA工作更有效率。 FPGA有大量软核,可以方便进行二次开发:FPGA甚至包含单片机和DSP软核,并且IO数仅受FPGA自身IO限制,所以FPGA又是单片机和DSP的超集,也就是说,单片机和DSP能实现的功能,FPGA一般都能实现。2 Verilog HDL简介 Veri

9、log HDL是一种硬件描述语言(HDL:Hardware Discription Language),是一种以文本形式来描述数字系统硬件的结构和行为的语言,用它可以表示逻辑电路图、逻辑表达式,还可以表示数字逻辑系统所完成的逻辑功能。 Verilog HDL是目前世界上最流行的两种硬件描述语言之一,是在20世纪80年代中期开发出来的。Verilog HDL这种硬件描述语言被用于从算法级、门级到开关级的多种抽象设计层次的数字系统建模。被建模的数字系统对象的复杂性可以介于简单的门和完整的电子数字系统之间。数字系统能够按层次描述,并可在相同描述中显式地进行时序建模。Verilog HDL 语言具有下

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

11、这对大多数建模应用来说已经足够。当然,完整的硬件描述语言足以对从最复杂的芯片到完整的电子系统进行描述。3串行通信系统在计算机系统和微机网络的快速发展领域里,串行通信在数据通信及控制系统中得到广泛的应用。UART(即Universal Asynchronous Receiver Transmitter 通用异步收发器)协议是数据通信及控制系统中广泛使用的一种全双工串行数据传输协议,在实际工业生产中有时并不使用UART的全部功能。只需将其核心功能集成即可。波特率发生器、接收器和发送器是UART的三个核心功能模块,利用Verilog-HDL语言对这三个功能模块进行描述并加以整合UART是广泛使用的串

12、行数据传输协议。UART允许在串行链路上进行全双工的通信。串行外设用到RS232-C异步串行接口,一般采用专用的集成电路即UART实现。如8250、8251、NS16450等芯片都是常见的UART器件,这类芯片已经相当复杂,有的含有许多辅助的模块(如FIFO),有时我们不需要使用完整的UART的功能和这些辅助功能。或者设计上用到了FPGA/CPLD器件,那么我们就可以将所需要的UART功能集成到FPGA内部。使用VHDL或Veriolog -HDL将UART的核心功能集成,从而使整个设计更加紧凑、稳定且可靠。本文应用EDA技术,基于FPGA/CPLD器件设计与实现UART。3.1串行通信概念计

13、算机与计算机,计算机与外部设备进行数据交换也称为通信,一般有两种方式:并行通信和串行通信。信息的各位数据被同时传送的通信方法是并行通信,并行通信依靠I/O接口来实现。并行通信中,数据有多少位就需要多少条信号传输线,这种通信方式快,但由于传输线较多,所以成本较高,仅适合近距离通信,通常传送距离小于30米,常用的并行通信协议有、ECP等。当距离大于30米时则多采用串行通信方式,串行通信是指外部设备和计算机间使用一根数据线(另外需要地线,可能还需要控制线)进行数据传输的方式。数据在一根数据线上一位一位地进行传输,每一位数据都占据一个固定的时间长度。与并行通信方式相比,有以下优点: (1)传输距离长,

14、可达数千公里。 (2)长距离内串行数据传送速率会比并行数据传送速率快,串行通信的通信时钟频率比并行通信更容易提高。 (3)抗干扰力强,串行通信信号间的相互干扰完全可以忽略。 (4)通信成本低。 (5)传输线既传输数据,又传输联络信息。因此串行通信得到广泛的应用。 在串行通信中,数据通常在发送器和接收器间进行双向传送,而这种传送又根据需要可分为单工通信、半双工通信和全双工通信。 通常情况下,根据信息传送格式,串行通信又分为两类:异步串行通信和同步串行通信。同步串行通信是按软件识别同步字符来实现数据传送的;异步串行通信是一种利用字符再同步技术通信方式。 同步通信是以数据块的方式传送的,数据传输率高

15、,适合高速率、大容量的数据通信。同步通信在数据开始处用一个同步字符来指示。同步通信是指在约定的通信速率下,发送端和接收端的时钟信号频率和相信始终保持一致(同步),这就保证了通信双方在发送和接收数据时具有完全一致的定时关系。在发送时要插入同步字符,接收端在检测到同步字符后,就开始接收任意位的串行数据,同步通信具有较高的传输率,但对硬件要求较高。异步通信是以字符为单位传送数据的,数据传送可靠性高,适合低速通信的场合。异步通信是指通信中两个字符之间的时间间隔是不固定的,而在一个字符内各位的时间间隔是固定的。然而本设计目的是在FPGA的基础上设计串口通信系统,而且本文采用的是RS-232C总线接口标准

16、作为串行通信的交通工具,所以是采用按位传送的异步串行通信协议。3.3 RS-232总线通信,当然就是接收信息/发送信息,在现实生活中人与人对话是通信,而传送他们信息的是空气这个媒介。写信,电话,QQ都是通信工具,然而互相通信之间一定会有一个媒介,只是不同的通信方式,媒介不同而已。计算机与计算机,计算机与外部设备之间的通信,一般有两种方式:并行通信和串行通信。并行通信依靠I/O接口来实现,而串行通信就需要串行通信接口标准:RS-232C、RS-499、RS-422、RS-423、RS-485等总线来实现。当然本设计采用一般的微型计算机、计算机终端和一些外部设备都配有RS-232C串行接口作为本通

17、信接口的标准。 RS232接口,就是普通电脑后面那个串口.一般为9针的,也有25针的.是1970年由美国电子工业协会(EIA)联合贝尔系统、调制解调器厂家及计算机终端生产厂家共同制定的用于串行通讯的标准。它的全名是“数据终端设备(DTE)和数据通讯设备(DCE)之间串行二进制数据交换接口技术标准”(RS-232C,其中C表示此标准修改了三次)。标准中包括了电气和机械方面的规定.该标准规定采用一个25个脚的 DB25连接器,对连接器的每个引脚的信号内容加以规定,还对各种信号的电平加以规定.后来随着设备的不断改进,成了目前大家普遍见到的9脚。在不使用传输控制信号的情况下,用3根线就可以传输了9芯的

18、是2收3发5地25芯的是2发3收7地。两设备用RS232相连的时候为收发,发收,地地。3.3.1 RS-232接口特性(1)接口的电气特性:在RS-232C中任何一条信号线的电压均为负逻辑关系。即:逻辑“1”,-5 -15V;逻辑“0” +5 +15V 。噪声容限为2V。即要求接收器能识别低至+3V的信号作为逻辑“0”,高到-3V的信号作为逻辑“1”。 (2)接口的物理结构: RS-232-C接口连接器一般使用型号为DB25的25芯插头座,通常插头在DCE端,插座在DTE端。一些设备与PC机连接的RS-232C接口,因为不使用对方的传送控制信号,只需三条接口线,即“发送数据”、“接收数据”和“

19、信号地”。所以采用DB-9的9芯插头座,传输线采用屏蔽双绞线。 (3)传输电缆长度由RS-232C标准规定在码元畸变小于4%的情况下,传输电缆长度应.50英尺.其实在一般应用中,传输距离小于50m,最大传输速率为20kbps。由于RS-232-C接口标准出现较早,难免有不足之处,主要有以下四点: (1)接口的信号电平值较高,易损坏接口电路的芯片,又因为与TTL 电平不兼容故需使用电平转换电路方能与TTL电路连接。(2)传输速率较低,在异步传输时,波特率为20Kbps。(3)接口使用一根信号线和一根信号返回线而构成共地的传输形式,这种共地传输容易产生共模干扰,所以抗噪声干扰性弱。 (4)传输距离

20、有限,最大传输距离标准值为50英尺,实际上也只能用在50米左右。 由于RS-232C是用负电压来表示逻辑状态,与TTL以高低电平表示的逻辑状态的规定不同,所以在实际应用时,需要将TTL电平转换成RS-232电平,如图3-1所示。RS232的接口芯片很多,因此使用时须加上适当的电平转换电路,最著名的当然是MAX公司的芯片MAX232。图3-1 MAX232结构图3.3串行通信接口组成 由于CPU与接口之间按并行方式传输,接口与外设之间按串行方式传输,因此串行通信接口的基本功能是:在发送时,把CPU送来的并行数据转换成串行数据,逐位地依次发送出去。在接收时,把外部设备发送过来的串行数据逐位地接收,

21、组装成并行数据,并行地送给CPU去处理。实现这一功能的硬件电路叫做串行通信接口。串行接口的组成图如图3-2所示。图3-2 串口接口的组成在数据输入过程中,数据一位一位地从外部设备进入UART接口的“接收移位寄存器”,当“接受移位寄存器”中已接收完一个UART包的各位后,数据就从“接收移位寄存器”进入“数据输入寄存器”。CPU从“数据输入寄存器”中读取接收到的数据(并行读取,即同时被读至累加器中)。“接收移位寄存器”的移位速度由“接收时钟”确定。 在数据输出过程中,CPU把要输出的数据(并行地)送入“数据输出寄存器”,“数据输出寄存器”的内容被传输到“发送移位寄存器”,然后由“发送移位寄存器”通

22、过移位操作,把数据一位一位地送到外设。“发送移位寄存器”的移位速度有“发送时钟”确定。“控制寄存器”用来保存与此接口有关的控制信息,这些控制信息决定接口的工作方式。CPU可以通过修改“控制寄存器”的内容来控制串行通信接口的工作方式。“状态寄存器”的各位称为“状态位”,每一个状态位都可以用来指示数据传输过程中的状态或某种错误。例如,用状态寄存器D5位为“1”表示“数据输出寄存器空用D0位表示“数据输入寄存器满”,用D2位表示“奇偶检验错”等。3.4 通信协议在异步通信中,是以字符为单位传送数据,是从低位到高位逐位传送,一个字符表示一帧信息。串行异步通信协议中字符代码传输格式如图2.3所示,通常U

23、ART的一帧数据由四部分组成:一个起始位S(一般逻辑为“0”),后面是数据长度可变的数据位D0D7(一般为6位到8位之间可变,数据的低位在前),一个可选的校验位PB(可选奇校验、偶检验或不需要检验),随后是一定长度的停止位P(可选1位、1.5位、或2位),停止位必须为逻辑“1”。在没有数据被传输时,数据线会一直处于逻辑“1”状态。一桢数据的组成图如图3-3所示。图3-3 一桢数据标准格式 a.起始位:它是数据采样的第一个点,当接收模块检测串行输入数据管脚上的电平从“1”到“0”的跳变来确定一个UART包的起始位。起始位检测8个连续脉冲的另一个更重要的原因是,采用16倍频采样的时钟,第8个采样脉

24、冲所对应的数据波形正好是该位数据位波形的正中点(以时钟上升沿采样),在该处读写数据应该是最安全点。b,数据位:这是衡量通信中实际数据位的参数。当计算机发送一个信息包,实际的数据不会是8位的,标准的值是5、7和8位。如何设置取决于你想传送的信息。比如,标准的ASCII码是0127(7位)。扩展的ASCII码是0255(8位)。如果数据使用简单的文本(标准ASCII码),那么每个数据包使用7位数据。每个包是指一个字节,包括开始/停止位,数据位和奇偶校验位。由于实际数据位取决于通信协议的选取,术语“包”指任何通信的情况。c,奇偶校验位:在串口通信中一种简单的检错方式。有四种检错方式:偶、奇、高和低。

25、当然没有校验位也是可以的。对于偶和奇校验的情况,串口会设置校验位(数据位后面的一位),用一个值确保传输的数据有偶数个或者奇数个逻辑高位。例如,如果数据是011,那么对于偶校验,校验位为0,保证逻辑高的位数是偶数个。如果是奇校验,校验位位1,这样就有3个逻辑高位。高位和低位不为真正的检查数据,简单置位逻辑高或者逻辑低校验。这样使得接收设备能够知道一个位的状态,有机会判断是否有噪声干扰了通信或者是否传输和接收数据是否不同步。d,停止位:用于表示单个包的最后一位。典型的值为1,1.5和2位。由于数据是在传输线上定时的,并且每一个设备有其自己的时钟,很可能在通信中两台设备间出现了小小的不同步。因此停止

26、位不仅仅是表示传输的结束,并且提供计算机校正时钟同步的机会。适用于停止位的位数越多,不同时钟同步的容忍程度越大,但是数据传输率同时也越慢。在UART协议中,数据的发送者与接收者不共享时钟信号,也就是说,在一次UART通信过程中,并没有一个时钟信号从发送端传输到接收端,因此,这个协议被称为异步方式。 由于没有共享时钟信号,因此在进行数据传输之前,收发双方必须协商好一个数据传输的波特率,也就是说,UART接收端应该知道发送端发送数据的波特率(相应的发送端也需要知道接收端的波特率)。在大多数情况下,发送数据和接受数据的波特率是相同的。UART发送端按照低位在前,高位在后的顺序移位输出数据。一旦在初始

27、化过程中,双方协商好了通信的波特率,收发双方的内部时钟都设定在同一波特率(但时钟的相位不同)。在一个UART包传输开始,接收端将它的内部时钟调整到与发送端同步。这样接收端就可以在每一位的中心位置对数据位进行采样,保证数据传输的正确性。3.5系统整体结构 本设计以FPGA为基础来实现异步通信,而UART模块就为本设计关键所在,如图3-4所示,该模块主要有串行发送器、接收器以及波特率发生器三个模块组成。 波特率发生器模块:在异步通信中,发送方和接受方必须保持相同的波特率才能实现正确的数据传送。在本设计中,由于RS-232C传输必定是工作在某种波特率下,为了便于和RS-232C总线进行同步,需要产生

28、符合RS-232C传输波特率的时钟。图3-4 系统整体结构图串口通讯系统的完整的工作流程可以简单的分为数据接收和发送两个部分。接收过程:当UART模块检测到有新数据(RS-232C总线传输线的起始位)就会触发接收流程。首先UART模块内部会重置波特率发生器和移位寄存器,控制逻辑使移位寄存器的工作模式为波特率模式,以准备数据接收,其次移位寄存器在波特率时钟的驱动下工作,不断的读取RS-232C串行总线上的输入数据,一位一位的接收,并且将数据保存到内部的数据寄存器内。然后在进行串并转换,在通过CPU内部数据总线传送到数据I/O缓存器,最后被CPU内部采用。 发送过程:当要发送数据出去时,先把要发送

29、的CPU内部数据存储到数据I/O缓存器,传送到数据寄存器,然后进行串并转换。UART模块内部会重置波特率发生器控制逻辑控制移位寄存器进入RS-232C串行发送的协议模式,并且使移位寄存器工作在波特率模式下,于是移位寄存器便在波特率时钟的驱动下依次将数据寄存器的数据一位一位发送到RS-232C的发送端TXD,这样就产生了RS-232C的数据发送时序。4 UART简介UART是一种通用串行数据总线,用于异步通信。该总线双向通信,可以实现全双工传输和接收。在嵌入式设计中,UART用来与PC进行通信,包括与监控调试器和其它器件。因为计算机内部采用并行数据,不能直接直接把数据发到Modem,必须经过UA

30、RT整理才能进行异步传输,其过程为:CPU先把准备写入串行设备点的数据放到UART寄存器(临时内存块)中,再通过FIFO(First Input First Output,先入先出列队)传送到串行设备,若是没有FIFO,信息将变得杂乱无章,不可能传送到Modem。 它是用于控制计算机与串行设备的芯片。有一点要注意的是,它提供了RS-232C数据终端设备接口,这样计算机就可以和调制解调器或其它使用RS-232C接口的串行设备通信了。作为接口的一部分,UART还提供以下功能:将由计算机内部传送过来的并行数据转换为输出的串行数据流。将计算机外部来的串行数据转换为字节,供计算机内部使用并行数据的器件使

31、用。在输出的串行数据流中加入奇偶校验位,并对从外部接收的数据流进行奇偶校验。在输出数据流中加入启停标记,并从接收数据流中删除启停标记。处理由键盘或鼠标发出的中断信号(键盘和鼠标也是串行设备)。可以处理计算机与外部串行设备的同步管理问题。 一般而言UART和外界通信只需要两条信号线RXD和TXD,其中RXD是UART的接收端,TXD是UART的发送端,接收与发送是全双工形式。由于可编程逻辑器件技术的快速发展,FPGA的功能日益强大,其开发周期短、可重复编程的优点也越来越明显,本设计就是在FPGA芯片上集成UART功能模块并和其他模块组合来实现一个能与其他设备进行串行通信的片上系统。本系统设计硬件

32、电路图如图4-1所示。图4-1 系统硬件原理图模块名称:uart_test 功能描述:uart的测试顶层模块 module uart_test( sys_clk, /系统时钟 uart_dataH, uart_xmitH /uart接收与发送引脚 ); input sys_clk; /系统时钟(48MHz) input uart_dataH; /uart接收引脚RXD output uart_xmitH; /uart发送引脚 TXD reg7:0 senddata; /发送一个字节的数据缓存区 reg WR_R1,WR_R2,WR_R3; /控制产生一个发送的写信号wire 7:0recdat

33、a; /接收缓存区 wire RI,TI,WR; /接收、发送中断以及写控制信号 wire clksend,clkrec; /发送和接收的时钟频率always(posedge clksend) /通过RI接收中断产生一个写信号,维持时 间为1个Clk begin WR_R1 <= RI; WR_R2 <= WR_R1; WR_R3 <= WR_R2endassign WR = (WR_R3)&(WR_R2)&(WR_R1); /控制写信号 always(posedge RI) /当接收了一个数据后,把数据加1后发 回PC机,注意串口一个一个数据发 begin

34、senddata <= recdata+8'd1; end rec uart_rec( /调用一个uart接收模块sys_rst_1(sys_rst_1), sys_clk(uart_clk), uart_dataH(uart_REC_dataH), rec_dataH(rec_dataH), rec_readyH(rec_readyH),);send uart_xmit( /调用一个uart的发送模块 sys_rst_1(sys_rst_1),sys_clk(uart_clk), uart_xmitH(uart_XMIT_dataH), ximtH(xmit_start_pul

35、seH), xmit_dataH(reg_xmit_data), xmit_doneH(xmit_doneH);Baud( /调用波特率变换器 sys_clk(uart_clk), sys_rst_1(sys_rst_1), baud_clk(uart_clk), baud_rate_div(baud_rate_div);endmodule4.1 接收模块功能设计描述 接受模块的主要功能是检测起始位S,对随后的位流解串行化,检测停止位PB,并将数据准备好CPU读取。 图4-2显示了接受模块的功能框图,包括控制状态机、解串行化器和相关逻辑。本设计仅包括最基本的功能,没有错误检测逻辑。图4-2接收

36、模块功能图 Uart_clk的频率为波特率的16倍,它是由波特率变换模块产生的。这个时钟信号用来驱动接收模块中的所有时钟。Uart_dataH是一个输入信号(就是RXD),它在送入解串行化器之前要经过两级同步器。注意:由于Uart_dataH上传输的数据是与发送端的时钟信号是同步的,而不是与接收端的时钟信号同步的,因此这个两级同步器是必不可少的。解串行化器是一个简单的串并转换移位寄存器。它有一个来自状态机的输入shiftH。当这个信号为有效(高电平)时解串行化器进行一次移位。移位寄存器的默认宽度为8位,需要主要的数据的低位先被移入。已接收位计数器用来跟踪记录累计接收到的数据位的数目。当计数器计

37、数到预先设定的值(word_len)时,状态机停止接收数据。计数器有两个控制输入端:countH和rstcountH。当countH有效(高电平)时,计数器加1;当rstcountH有效(高电平)时,计数器清零。它是一个同步计数器,计数器的默认宽度为4位。位元计数器的作用是在uart_clk中产生一个延时(波特率周期/16),这是一个由cntr_resetH信号控制的加计数器。当该信号有效(高电平)时,计数器处于复位状态;当该信号为低电平时,计数器进行加1计数。 图4-3显示了状态机的状态跳转流程,他是一个有5个状态的mealy型状态机。图4-3 UART接收模块状态图状态机把前面描述的解串行

38、化器、两级同步器、已接收位计数器和位元计数器联系在一起。当系统复位时,状态机的默认状态为r_START。在这个状态,状态机等待起始位S。输入数据在空闲状态时为“1”,当输入数据从“1”跳变到“0”,即检测到起始位S时,状态机跳转到r_CENTER状态。 在r_CENTER状态,状态机等待1/2个位元长度,以找到位元的中间位置。一个位元就是一个波特,包括16个uart_clk脉冲。因此1/2个位元就是8个uart_clk脉冲。这个延时由位元计数器产生。等待4个uart_clk脉冲而不是8个的原因是同步器有时会增加两个uart_clk脉冲,计数器一般也会增加两个uart_clk脉冲。因为在前一状态

39、r_CENTER时,输入数据已经以起始位S位元的中心对齐,因此,在r_WAIT状态,如果WORD_LEN个位元已经被采样,则状态机跳转到r_STOP状态,否则状态机等待一个波特时间(16个uart_clk脉冲)后,跳转到r_SAMPLE状态。 在r_SAMPLE状态,rec_dataH的状态被采样送入解串行化器,然后跳转到r_WAIT状态。 在r_STOP状态,rec_dataH的状态被检测以确定其是否为“1”,这一位将不被送入解串行化器。检测不到停止位PB(为“1”)并不会导致一个错误。在状态机跳转到r_START状态前,状态变量rec_readyH将被声明为有效(高电平)以通知CPU有一个

40、有效数据等待被读取。Rec_readyH在被置为有效(高电平)前,是一个触发信号或缓冲信号。接收模块程序: module uart_rec(sys_rst_1,sys_clk,uart_dataH,rec_dataH,rec_readyH); input sys_rst_1; /异步复位信号 input sys_clk; /主时钟,为16波特率 input uart_dataH; /连接到uart管脚 output 7:0 rec_dataH; /已接收到的数据(并行传送)output rec_readyH; /高电平有效,指示新数据等待被读取 /存储单元定义 reg 2:0 next_sta

41、te,state; reg rec_dataH,rec_datSyncH;reg 3:0 bitcell_cntrH; reg cntr_resetH; reg 7:0 part_dataH;reg shiftH; reg 3:0 recd_ bitcntrH; reg countH;reg rstCountH; reg rec_readyH; reg rec_readyInH; wire 7:0 rec_dataH; assign rec_dataH=par_dataH;always (posedge sys_clk or negedge sys_rst_1) if (sys_rst_1)

42、begin rec_datSyncH<=1;rec_datH<=1;rec_datH<=1; end else begin rec_datSyncH<=uart_dataH; rec_datH<=rec_datSyncH; end /位元计数器 always(posedge sys_clk or negedge sys_rst_1)if (sys_rst_1)tbitcell_cntrH<=0;else if (cntr_resetH)bitcell_cntrH<=0; else bitcell_cntrH<=bitcell_cntrH+1; /

43、串行输入移位寄存器,低位先被移入 always(posedge sys_clk or negedge sys_rst_1) if(sys_rst_1)par_dataH<=0; else if (shiftH)begin par_dataH6:0<=par_dataH7:1par_dataH 7<=rec_datH; end /已接收位计数器 always(posedge sys_clk or negedge sys_rst_1)if(sys_rst_1) recd_bitCntrH<=0;else if (countH) recd_bitCntrH<= recd

44、_bitCntrH+1; else if (rstCountH) recd_bitCntrH<=0; /状态变量传递 always(posedge sys_clk or negedge sys_rst_1) if(sys_rst_1)state<=r_START;else state<=next_state; /接收状态机 always(state or rec_datH or bitcell_cntrH or recd_bitCntrH) begin next_state=state; cntr_resetH=HI; shiftH =LO; countH =LO; rstC

45、ountH =LO; rec_readyInH=LO;case(state)r_START: begin /START状态,等待起始位Sif(rec_datH)next_state=r_CENTER; else beginnext_state=r_START; rstCountH=HI; /位计数器复位 rec_readyInH=HI; /接收模块准备好,等待接收数据 end end rCENTER: begin /定位位元中心位置,一个位元包含16个系统时钟周期 if(bitcell_cntrH=4h4) begin /如果等待1/2个位元后输入仍为低电平,则表示接收到一个有效的起始位S i

46、f(rec_datH)next_state=r_WAIT; /否则,则认为是信道干扰 else next_state=r_START; endelse begin next_state=r_CENTER; cntr_resetH=LO; /允许计数器的计数操作 endend r_WAIT: begin /WAIT状态,在对数据管脚进行采样前等待一个位元的时间 if(bitcell_cntrH=4hE)begin if(recd_bitCntrH=WORD_LEN) next_state=r_STOP; /已完成8次采样else next_state=r_SAMPLE; end else beg

47、in next_state=r_WAIT; cntr_resetH=LO; /允许计数器的计数操作endendr_SAMPLE: begin /SAMPLE状态,对接收数据管脚的状态进行采样 shiftH = HI; /将串行数据移入寄存器countH =HI; /接收到一个新的比特 next_state=r_WAIT;endr_STOP: begin /STOP状态,检测停止位PB next_state =r_START; rec_readyInH =HI; end default:begin next_state =3bXXX;cntr_resetH=X; shiftH=X; countH

48、=X; rstcountH=X; rec_readyH=X; end endcaseend /寄存状态机的输出以消除危险路径 always ( posedge sys_clk or negedge sys_rst_1) if(sys_rst_1) rec_readyH<=0; else rec_readyH<=rec_readyInH; endmodule4.2波特率模块 波特率是串行通信的重要指标,表示数据传输的速度,即每秒钟传送的二进制数据的位数,也是单位时间内传送的信息量。在串行异步传送中,常用到的波特率为1200b/s、2400b/s、4800b/s、9600b/s、19200b/s等。波特率发生器实际上是一个分频器,主要是产生和RS-232通信所采用的波特率同步的时钟。由于串行数据帧与接收数据时钟是异步的,所以存UART的接收端在什么时刻将数据移入寄存器,怎样选择可靠的采样点是非常关键的。一般采用高速时钟对串行数据采样是非常有效的方法。在实际设计中,一般最大选择16倍于波特率的时钟频率。实现波特率时钟的基本思路就是设计一个计数器,该计

温馨提示

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

评论

0/150

提交评论