1、武汉理工大学能力强化训练课程设计说明书目录串口接收模块的 verilog 设计 11 现场可编程门阵列 FPGA 22 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武汉理工大学能力强化训练课程设计说明书1串口接收模块的 verilog 设计摘要:UART(即 Universal As
2、ynchronous Receiver Transmitter)是数据通信及控制中广泛使用的一种全双工串行数据传输协议。本设计基于 FPGA 器件实现对 UART 的波特率产生器、UART 发送器和接收器及其整合电路的模块化设计,采用 Verilog HDL 语言对三个功能模块进行硬件描述。通过串口调试助手进行验证,其结果完全符合 UART 协议的要求和预期的结果。关键词:UART FPGA Verilog HDL 验证武汉理工大学能力强化训练课程设计说明书21 现场可编程门阵列 FPGA 20 世纪 80 年代中期,FPGA 刚出现时,大部分用来实现粘合逻辑、中等复杂度的状态机和相对有限的数
3、据处理任务。在 20 世纪 90 年代早期,FPGA 的规模和复杂度开始增加,那时它们的主要场所在通信和网络领域。到了 20 世纪90 年代末,FPGA 在消费、汽车和工业领域的应用经历了爆炸式增长。21 世纪早期,已经可以买到数百万容量的高性能 FPGA。今天 FPGA 几乎可以用来实现任何东西,包括通信设备和软件定义无线电,雷达、影像和其它数字信号处理的应用,直至包含硬件和软件的片上系统。FPGA(field-Programmable Gate Array),即现场可编程门阵列,它是在PAL、GAL、CPLD 等可编程器件的基础上进一步发展的产物。它是作为专用集成电路(ASIC)领域中的一
4、种半定制电路出现的,既解决了制定电路的不足,又克服了原有可编程器件门电路数有限的缺点。 目前以硬件描述语言(Verilog 或 VHDL)所完成的电路设计,可以经过简单的综合与布局,快速的烧录至 FPGA 上进行测试,是现代 IC 设计验证的技术主流。这些可编辑元件可以被用来实现一些基本的逻辑门电路(比如AND、OR、XOR、NOT)或者更复杂一些的组合功能比如解码器或数学方程式。在大多数的 FPGA 里面,这些可编辑的元件里也包含记忆元件例如触发器(Flipflop)或者其他更加完整的记忆块。 系统设计师可以根据需要通过可编辑的连接把 FPGA 内部的逻辑块连接起来,就好像一个电路试验板被放
5、在了一个芯片里。一个出厂后的成品 FPGA 的逻辑块和连接可以按照设计者而改变,所以 FPGA 可以完成所需要的逻辑功能。 FPGA 一般来说比 ASIC(专用集成芯片)的速度要慢,无法完成复杂的设计,而且消耗更多的电能。但是他们也有很多的优点比如可以快速成品,可以被修改来改正程序中的错误和更便宜的造价。厂商也可能会提供便宜的但是编辑能力差的 FPGA。因为这些芯片有比较差的可编辑能力,所以这些设计的开发是在普通的 FPGA 上完成的,然后将设计转移到一个类似于 ASIC 的芯片上。 FPGA 采用了逻辑单元阵列 LCA(Logic Cell Array)这样一个概念,内部包括可配置逻辑模块
6、CLB(Configurable Logic Block) 、输出输入模块IOB(Input Output Block)和内部连线(Interconnect)三个部分。FPGA 的基本特点主要有: 1、采用 FPGA 设计 ASIC 电路,用户不需要投片生产,就能得到合用的芯片。2、FPGA 可做其它全定制或半定制 ASIC 电路的中试样片。 3、FPGA 内部有丰富的触发器和 IO 引脚。 4、FPGA 是 ASIC 电路中设计周期最短、开发费用最低、风险最小的器件之一。 5、FPGA 采用高速 CHMOS 工艺,功耗低,可以与 CMOS、TTL 电平兼容可以说,FPGA 芯片是小批量系统提
7、高系统集成度、可靠性的最佳选择之一。FPGA 是由存放在片内 RAM 中的程序来设置其工作状态的,因此,工作时需要对片内的 RAM 进行编程。用户可以根据不同的配置模式,采用不同的编程方式当加电时,FPGA 芯片将 EPROM 中数据读入片内编程 RAM 中,配置完成后,FPGA 进入工作状态。掉电后,FPGA 恢复成白片,内部逻辑关系消失,因此,FPGA 能够反复使用。FPGA 的编程无须专用的 FPGA 编程器,只须用通用的武汉理工大学能力强化训练课程设计说明书3EPROM、PROM 编程器即可。当需要修改 FPGA 功能时,只需换一片 EPROM 即可。这样,同一片 FPGA,不同的编程
8、数据,可以产生不同的电路功能。因此,FPGA的使用非常灵活。当然 FPGA 存在于在某些场合选它而不是单片机的优势: FPGA 运行速度快:FPGA 内部集成锁项环,可以把外部时钟倍频,核心频率可以到几百 M,而单片机运行速度低的多。在高速场合,单片机无法代替FPGA。 FPGA 管脚多,容易实现大规模系统:单片机 IO 口有限,而 FPGA 动辄有数百个 IO 口,可以方便连接外设。比如一个系统有多路 AD、DA,单片机要进行仔细的资源分配,总线隔离,而 FPGA 由于丰富的 IO 资源,可以很容易用不同 IO 连接各外设。FPGA 内部程序并行运行,有处理更复杂功能的能力:单片机程序是串行
9、执行的,执行完一条才能执行下一条,在处理突发事件时只能调用有限的中断资源;而 FPGA 不同,逻辑可以并行执行,可以同时处理不同任务,这就导致了FPGA 工作更有效率。 FPGA 有大量软核,可以方便进行二次开发:FPGA 甚至包含单片机和 DSP软核,并且 IO 数仅受 FPGA 自身 IO 限制,所以 FPGA 又是单片机和 DSP 的超集,也就是说,单片机和 DSP 能实现的功能,FPGA 一般都能实现。2 Verilog HDL 简介 Verilog HDL 是一种硬件描述语言(HDL:Hardware Discription Language) ,是一种以文本形式来描述数字系统硬件的
10、结构和行为的语言,用它可以表示逻辑电路图、逻辑表达式,还可以表示数字逻辑系统所完成的逻辑功能。 Verilog HDL 是目前世界上最流行的两种硬件描述语言之一,是在 20 世纪80 年代中期开发出来的。Verilog HDL 这种硬件描述语言被用于从算法级、门级到开关级的多种抽象设计层次的数字系统建模。被建模的数字系统对象的复杂性可以介于简单的门和完整的电子数字系统之间。数字系统能够按层次描述,并可在相同描述中显式地进行时序建模。Verilog HDL 语言具有下述描述能力:设计的行为特性、设计的数据流特性、设计的结构组成以及包含响应监控和设计验证方面的时延和波形产生机制。所有这些都使用同一
11、种建模语言。此外,Verilog HDL 语言提供了编程语言接口,通过该接口可以在模拟、验证期间从设计外部访问设计,包括模拟的具体控制和运行。 Verilog HDL 语言不仅定义了语法,而且对每个语法结构都定义了清晰的模拟、仿真语义。因此,用这种语言编写的模型能够使用 Verilog 仿真器进行验证。语言从 C 编程语言中继承了多种操作符和结构。Verilog HDL 提供了扩展的建模能力,其中许多扩展最初很难理解。但是,Verilog HDL 语言的核心子集非常易于学习和使用,这对大多数建模应用来说已经足够。当然,完整的硬件描述语言足以对从最复杂的芯片到完整的电子系统进行描述。3 串行通信
12、系统在计算机系统和微机网络的快速发展领域里,串行通信在数据通信及控制系统中得到广泛的应用。UART(即 Universal Asynchronous Receiver 武汉理工大学能力强化训练课程设计说明书4Transmitter 通用异步收发器)协议是数据通信及控制系统中广泛使用的一种全双工串行数据传输协议,在实际工业生产中有时并不使用 UART 的全部功能。只需将其核心功能集成即可。波特率发生器、接收器和发送器是 UART 的三个核心功能模块,利用 Verilog-HDL 语言对这三个功能模块进行描述并加以整合UART 是广泛使用的串行数据传输协议。UART 允许在串行链路上进行全双工的通
13、信。串行外设用到 RS232-C 异步串行接口,一般采用专用的集成电路即 UART 实现。如 8250、8251、NS16450 等芯片都是常见的 UART 器件,这类芯片已经相当复杂,有的含有许多辅助的模块(如 FIFO) ,有时我们不需要使用完整的 UART的功能和这些辅助功能。或者设计上用到了 FPGA/CPLD 器件,那么我们就可以将所需要的 UART 功能集成到 FPGA 内部。使用 VHDL 或 Veriolog -HDL 将 UART的核心功能集成,从而使整个设计更加紧凑、稳定且可靠。本文应用 EDA 技术,基于 FPGA/CPLD 器件设计与实现 UART。3.1 串行通信概念
14、计算机与计算机,计算机与外部设备进行数据交换也称为通信,一般有两种方式:并行通信和串行通信。信息的各位数据被同时传送的通信方法是并行通信,并行通信依靠 I/O 接口来实现。并行通信中,数据有多少位就需要多少条信号传输线,这种通信方式快,但由于传输线较多,所以成本较高,仅适合近距离通信,通常传送距离小于 30 米,常用的并行通信协议有、ECP 等。当距离大于 30 米时则多采用串行通信方式,串行通信是指外部设备和计算机间使用一根数据线(另外需要地线,可能还需要控制线)进行数据传输的方式。数据在一根数据线上一位一位地进行传输,每一位数据都占据一个固定的时间长度。与并行通信方式相比,有以下优点: (
15、1)传输距离长,可达数千公里。 (2)长距离内串行数据传送速率会比并行数据传送速率快,串行通信的通信时钟频率比并行通信更容易提高。 (3)抗干扰力强,串行通信信号间的相互干扰完全可以忽略。 (4)通信成本低。 (5)传输线既传输数据,又传输联络信息。因此串行通信得到广泛的应用。 在串行通信中,数据通常在发送器和接收器间进行双向传送,而这种传送又根据需要可分为单工通信、半双工通信和全双工通信。 通常情况下,根据信息传送格式,串行通信又分为两类:异步串行通信和同步串行通信。同步串行通信是按软件识别同步字符来实现数据传送的;异步串行通信是一种利用字符再同步技术通信方式。 同步通信是以数据块的方式传送
16、的,数据传输率高,适合高速率、大容量的数据通信。同步通信在数据开始处用一个同步字符来指示。同步通信是指在约定的通信速率下,发送端和接收端的时钟信号频率和相信始终保持一致(同步) ,这就保证了通信双方在发送和接收数据时具有完全一致的定时关系。在发送时要插入同步字符,接收端在检测到同步字符后,就开始接收任意位的串行数据,同步通信具有较高的传输率,但对硬件要求较高。异步通信是以字符为单位传送数据的,数据传送可靠性高,适合低速通信的场合。异步通信是指通信中两个字符之间的时间间隔是不固定的,而在一个字符内各位的时间间隔是固定的。武汉理工大学能力强化训练课程设计说明书5然而本设计目的是在 FPGA 的基础
17、上设计串口通信系统,而且本文采用的是RS-232C 总线接口标准作为串行通信的交通工具,所以是采用按位传送的异步串行通信协议。3.3 RS-232 总线通信,当然就是接收信息/发送信息,在现实生活中人与人对话是通信,而传送他们信息的是空气这个媒介。写信,电话,QQ 都是通信工具,然而互相通信之间一定会有一个媒介,只是不同的通信方式,媒介不同而已。计算机与计算机,计算机与外部设备之间的通信,一般有两种方式:并行通信和串行通信。并行通信依靠 I/O 接口来实现,而串行通信就需要串行通信接口标准:RS-232C、RS-499、RS-422、RS-423、RS-485 等总线来实现。当然本设计采用一般
18、的微型计算机、计算机终端和一些外部设备都配有 RS-232C 串行接口作为本通信接口的标准。 RS232 接口,就是普通电脑后面那个串口.一般为 9 针的,也有 25 针的.是1970 年由美国电子工业协会(EIA)联合贝尔系统、调制解调器厂家及计算机终端生产厂家共同制定的用于串行通讯的标准。它的全名是“数据终端设备(DTE)和数据通讯设备(DCE)之间串行二进制数据交换接口技术标准”(RS-232C,其中 C 表示此标准修改了三次)。标准中包括了电气和机械方面的规定.该标准规定采用一个 25 个脚的 DB25 连接器,对连接器的每个引脚的信号内容加以规定,还对各种信号的电平加以规定.后来随着
19、设备的不断改进,成了目前大家普遍见到的 9 脚。在不使用传输控制信号的情况下,用 3 根线就可以传输了 9 芯的是 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 的 2
20、5 芯插头座,通常插头在 DCE 端,插座在 DTE 端。一些设备与 PC 机连接的 RS-232C 接口,因为不使用对方的传送控制信号,只需三条接口线,即“发送数据” 、 “接收数据”和“信号地” 。所以采用 DB-9 的 9 芯插头座,传输线采用屏蔽双绞线。 (3)传输电缆长度由 RS-232C 标准规定在码元畸变小于 4%的情况下,传输电缆长度应.50 英尺.其实在一般应用中,传输距离小于 50m,最大传输速率为20kbps。由于 RS-232-C 接口标准出现较早,难免有不足之处,主要有以下四点: (1)接口的信号电平值较高,易损坏接口电路的芯片,又因为与 TTL 电平不兼容故需使用电
21、平转换电路方能与 TTL 电路连接。(2)传输速率较低,在异步传输时,波特率为 20Kbps。(3)接口使用一根信号线和一根信号返回线而构成共地的传输形式,这种共地传输容易产生共模干扰,所以抗噪声干扰性弱。 (4)传输距离有限,最大传输距离标准值为 50 英尺,实际上也只能用在 50米左右。 武汉理工大学能力强化训练课程设计说明书6由于 RS-232C 是用负电压来表示逻辑状态,与 TTL 以高低电平表示的逻辑状态的规定不同,所以在实际应用时,需要将 TTL 电平转换成 RS-232 电平,如图 3-1 所示。RS232 的接口芯片很多,因此使用时须加上适当的电平转换电路,最著名的当然是 MA
22、X 公司的芯片 MAX232。图 3-1 MAX232 结构图3.3 串行通信接口组成 由于 CPU 与接口之间按并行方式传输,接口与外设之间按串行方式传输,因此串行通信接口的基本功能是:在发送时,把 CPU 送来的并行数据转换成串行数据,逐位地依次发送出去。在接收时,把外部设备发送过来的串行数据逐位地接收,组装成并行数据,并行地送给 CPU 去处理。实现这一功能的硬件电路叫做串行通信接口。串行接口的组成图如图 3-2 所示。武汉理工大学能力强化训练课程设计说明书7图 3-2 串口接口的组成在数据输入过程中,数据一位一位地从外部设备进入 UART 接口的“接收移位寄存器” ,当“接受移位寄存器
23、”中已接收完一个 UART 包的各位后,数据就从“接收移位寄存器”进入“数据输入寄存器” 。CPU 从“数据输入寄存器”中读取接收到的数据(并行读取,即同时被读至累加器中) 。 “接收移位寄存器”的移位速度由“接收时钟”确定。 在数据输出过程中,CPU 把要输出的数据(并行地)送入“数据输出寄存器” , “数据输出寄存器”的内容被传输到“发送移位寄存器” ,然后由“发送移位寄存器”通过移位操作,把数据一位一位地送到外设。 “发送移位寄存器”的移位速度有“发送时钟”确定。“控制寄存器”用来保存与此接口有关的控制信息,这些控制信息决定接口的工作方式。CPU 可以通过修改“控制寄存器”的内容来控制串
24、行通信接口的工作方式。“状态寄存器”的各位称为“状态位” ,每一个状态位都可以用来指示数据传输过程中的状态或某种错误。例如,用状态寄存器 D5 位为“1”表示“数据输出寄存器空用 D0 位表示“数据输入寄存器满” ,用 D2 位表示“奇偶检验错”等。3.4 通信协议在异步通信中,是以字符为单位传送数据,是从低位到高位逐位传送,一个字符表示一帧信息。串行异步通信协议中字符代码传输格式如图 2.3 所示,通常 UART 的一帧数据由四部分组成:一个起始位 S(一般逻辑为“0” ) ,后面是数据长度可变的数据位 D0D7(一般为 6 位到 8 位之间可变,数据的低位在前),一个可选的校验位 PB(可
25、选奇校验、偶检验或不需要检验) ,随后是一定长度的停止位 P(可选 1 位、1.5 位、或 2 位),停止位必须为逻辑“1” 。在没有数据被传输时,数据线会一直处于逻辑“1”状态。一桢数据的组成图如图 3-3 所示。武汉理工大学能力强化训练课程设计说明书8图 3-3 一桢数据标准格式 a.起始位:它是数据采样的第一个点,当接收模块检测串行输入数据管脚上的电平从“1”到“0”的跳变来确定一个 UART 包的起始位。起始位检测 8 个连续脉冲的另一个更重要的原因是,采用 16 倍频采样的时钟,第 8 个采样脉冲所对应的数据波形正好是该位数据位波形的正中点(以时钟上升沿采样),在该处读写数据应该是最
26、安全点。b,数据位:这是衡量通信中实际数据位的参数。当计算机发送一个信息包,实际的数据不会是 8 位的,标准的值是 5、7 和 8 位。如何设置取决于你想传送的信息。比如,标准的 ASCII 码是 0127(7 位) 。扩展的 ASCII 码是0255(8 位) 。如果数据使用简单的文本(标准 ASCII 码) ,那么每个数据包使用 7 位数据。每个包是指一个字节,包括开始/停止位,数据位和奇偶校验位。由于实际数据位取决于通信协议的选取,术语“包”指任何通信的情况。c,奇偶校验位:在串口通信中一种简单的检错方式。有四种检错方式:偶、奇、高和低。当然没有校验位也是可以的。对于偶和奇校验的情况,串
27、口会设置校验位(数据位后面的一位) ,用一个值确保传输的数据有偶数个或者奇数个逻辑高位。例如,如果数据是 011,那么对于偶校验,校验位为 0,保证逻辑高的位数是偶数个。如果是奇校验,校验位位 1,这样就有 3 个逻辑高位。高位和低位不为真正的检查数据,简单置位逻辑高或者逻辑低校验。这样使得接收设备能够知道一个位的状态,有机会判断是否有噪声干扰了通信或者是否传输和接收数据是否不同步。d,停止位:用于表示单个包的最后一位。典型的值为 1,1.5 和 2 位。由于数据是在传输线上定时的,并且每一个设备有其自己的时钟,很可能在通信中两台设备间出现了小小的不同步。因此停止位不仅仅是表示传输的结束,并且
28、提供计算机校正时钟同步的机会。适用于停止位的位数越多,不同时钟同步的容忍程度越大,但是数据传输率同时也越慢。在 UART 协议中,数据的发送者与接收者不共享时钟信号,也就是说,在一次 UART 通信过程中,并没有一个时钟信号从发送端传输到接收端,因此,这个协议被称为异步方式。 由于没有共享时钟信号,因此在进行数据传输之前,收发双方必须协商好一个数据传输的波特率,也就是说,UART 接收端应该知道发送端发送数据的波特率(相应的发送端也需要知道接收端的波特率) 。在大多数情况下,发送数据和接受数据的波特率是相同的。UART 发送端按照低位在前,高位在后的顺序移位输出数据。一旦在初始化过程中,双方协
29、商好了通信的波特率,收发双方的内部时钟都设定在同一波特率(但时钟的相位不同) 。在一个 UART 包传输开始,接收端将它的内部时钟调整到与发送端同步。这样接收端就可以在每一位的中心位置对数据位进行采样,保证数据传输的正确性。3.5 系统整体结构 本设计以 FPGA 为基础来实现异步通信,而 UART 模块就为本设计关键所在,武汉理工大学能力强化训练课程设计说明书9如图 3-4 所示,该模块主要有串行发送器、接收器以及波特率发生器三个模块组成。 波特率发生器模块:在异步通信中,发送方和接受方必须保持相同的波特率才能实现正确的数据传送。在本设计中,由于 RS-232C 传输必定是工作在某种波特率下
30、,为了便于和 RS-232C 总线进行同步,需要产生符合 RS-232C 传输波特率的时钟。图 3-4 系统整体结构图串口通讯系统的完整的工作流程可以简单的分为数据接收和发送两个部分。接收过程:当 UART 模块检测到有新数据(RS-232C 总线传输线的起始位)就会触发接收流程。首先 UART 模块内部会重置波特率发生器和移位寄存器,控制逻辑使移位寄存器的工作模式为波特率模式,以准备数据接收,其次移位寄存器在波特率时钟的驱动下工作,不断的读取 RS-232C 串行总线上的输入数据,一位一位的接收,并且将数据保存到内部的数据寄存器内。然后在进行串并转换,在通过 CPU 内部数据总线传送到数据
31、I/O 缓存器,最后被 CPU 内部采用。 发送过程:当要发送数据出去时,先把要发送的 CPU 内部数据存储到数据I/O 缓存器,传送到数据寄存器,然后进行串并转换。UART 模块内部会重置波特率发生器控制逻辑控制移位寄存器进入 RS-232C 串行发送的协议模式,并且使移位寄存器工作在波特率模式下,于是移位寄存器便在波特率时钟的驱动下依次将数据寄存器的数据一位一位发送到 RS-232C 的发送端 TXD,这样就产生了 RS-232C 的数据发送时序。4 UART 简介UART 是一种通用串行数据总线,用于异步通信。该总线双向通信,可以实现全双工传输和接收。在嵌入式设计中,UART 用来与 P
32、C 进行通信,包括与监控调试器和其它器件。因为计算机内部采用并行数据,不能直接直接把数据发到 Modem,必须经过 UART 整理才能进行异步传输,其过程为:CPU 先把准备写入串行设备点的数据放到 UART 寄存器(临时内存块)中,再通过 FIFO(First Input First Output,先入先出列队)传送到串行设备,若是没有 FIFO,信息将武汉理工大学能力强化训练课程设计说明书10变得杂乱无章,不可能传送到 Modem。 它是用于控制计算机与串行设备的芯片。有一点要注意的是,它提供了RS-232C 数据终端设备接口,这样计算机就可以和调制解调器或其它使用 RS-232C 接口的
33、串行设备通信了。作为接口的一部分,UART 还提供以下功能:将由计算机内部传送过来的并行数据转换为输出的串行数据流。将计算机外部来的串行数据转换为字节,供计算机内部使用并行数据的器件使用。在输出的串行数据流中加入奇偶校验位,并对从外部接收的数据流进行奇偶校验。在输出数据流中加入启停标记,并从接收数据流中删除启停标记。处理由键盘或鼠标发出的中断信号(键盘和鼠标也是串行设备) 。可以处理计算机与外部串行设备的同步管理问题。 一般而言 UART 和外界通信只需要两条信号线 RXD 和 TXD,其中 RXD 是 UART的接收端,TXD 是 UART 的发送端,接收与发送是全双工形式。由于可编程逻辑器
34、件技术的快速发展,FPGA 的功能日益强大,其开发周期短、可重复编程的优点也越来越明显,本设计就是在 FPGA 芯片上集成 UART 功能模块并和其他模块组合来实现一个能与其他设备进行串行通信的片上系统。本系统设计硬件电路图如图 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 接收引脚 RX
35、D output uart_xmitH; /uart 发送引脚 TXD 武汉理工大学能力强化训练课程设计说明书11reg7:0 senddata; /发送一个字节的数据缓存区 reg WR_R1,WR_R2,WR_R3; /控制产生一个发送的写信号wire 7:0recdata; /接收缓存区 wire RI,TI,WR; /接收、发送中断以及写控制信号 wire clksend,clkrec; /发送和接收的时钟频率always(posedge clksend) /通过 RI 接收中断产生一个写信号,维持时 间为 1 个 Clk begin WR_R1 = RI; WR_R2 = WR_R1
36、; WR_R3 = WR_R2endassign WR = (WR_R3) /控制写信号 always(posedge RI) /当接收了一个数据后,把数据加 1 后发 回 PC 机, 注意串口一个一个数据发 begin senddata = recdata+8d1; 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(
37、/调用一个 uart 的发送模块 sys_rst_1(sys_rst_1),sys_clk(uart_clk), uart_xmitH(uart_XMIT_dataH), ximtH(xmit_start_pulseH), 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 接收模块功能设计描述 接受模块的主要功能
38、是检测起始位 S,对随后的位流解串行化,检测停止位 PB,并将数据准备好 CPU 读取。 图 4-2 显示了接受模块的功能框图,包括控制状态机、解串行化器和相关武汉理工大学能力强化训练课程设计说明书12逻辑。本设计仅包括最基本的功能,没有错误检测逻辑。图 4-2 接收模块功能图Uart_clk 的频率为波特率的 16 倍,它是由波特率变换模块产生的。这个时钟信号用来驱动接收模块中的所有时钟。Uart_dataH 是一个输入信号(就是RXD),它在送入解串行化器之前要经过两级同步器。注意:由于 Uart_dataH 上传输的数据是与发送端的时钟信号是同步的,而不是与接收端的时钟信号同步的,因此这
39、个两级同步器是必不可少的。解串行化器是一个简单的串并转换移位寄存器。它有一个来自状态机的输入 shiftH。当这个信号为有效(高电平)时解串行化器进行一次移位。移位寄存器的默认宽度为 8 位,需要主要的数据的低位先被移入。已接收位计数器用来跟踪记录累计接收到的数据位的数目。当计数器计数到预先设定的值(word_len)时,状态机停止接收数据。计数器有两个控制输入端:countH 和rstcountH。当 countH 有效(高电平)时,计数器加 1;当 rstcountH 有效(高电平)时,计数器清零。它是一个同步计数器,计数器的默认宽度为 4 位。位元计数器的作用是在 uart_clk 中产
40、生一个延时(波特率周期/16) ,这是一个由 cntr_resetH 信号控制的加计数器。当该信号有效(高电平)时,计数器处于复位状态;当该信号为低电平时,计数器进行加 1 计数。 图 4-3 显示了状态机的状态跳转流程,他是一个有 5 个状态的 mealy 型状态机。图 4-3 UART 接收模块状态图武汉理工大学能力强化训练课程设计说明书13状态机把前面描述的解串行化器、两级同步器、已接收位计数器和位元计数器联系在一起。当系统复位时,状态机的默认状态为 r_START。在这个状态,状态机等待起始位 S。输入数据在空闲状态时为“1” ,当输入数据从“1”跳变到“0” ,即检测到起始位 S 时
41、,状态机跳转到 r_CENTER 状态。 在 r_CENTER 状态,状态机等待 1/2 个位元长度,以找到位元的中间位置。一个位元就是一个波特,包括 16 个 uart_clk 脉冲。因此 1/2 个位元就是 8 个 uart_clk 脉冲。这个延时由位元计数器产生。等待 4 个 uart_clk 脉冲而不是 8 个的原因是同步器有时会增加两个 uart_clk 脉冲,计数器一般也会增加两个 uart_clk 脉冲。因为在前一状态 r_CENTER 时,输入数据已经以起始位 S 位元的中心对齐,因此,在 r_WAIT 状态,如果 WORD_LEN 个位元已经被采样,则状态机跳转到r_STOP
42、 状态,否则状态机等待一个波特时间(16 个 uart_clk 脉冲)后,跳转到 r_SAMPLE 状态。 在 r_SAMPLE 状态,rec_dataH 的状态被采样送入解串行化器,然后跳转到r_WAIT 状态。 在 r_STOP 状态,rec_dataH 的状态被检测以确定其是否为“1” ,这一位将不被送入解串行化器。检测不到停止位 PB(为“1” )并不会导致一个错误。在状态机跳转到 r_START 状态前,状态变量 rec_readyH 将被声明为有效(高电平)以通知 CPU 有一个有效数据等待被读取。Rec_readyH 在被置为有效(高电平)前,是一个触发信号或缓冲信号。接收模块程
43、序: 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_state,state; reg rec_dataH,rec_datSyncH;reg 3:0 bi
44、tcell_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) begin rec_datSyncH=1;rec_datH=1;武汉理工大学能力强化训练课程设
45、计说明书14rec_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; /串行输入移位寄存器,低位先被移入 always(posedge sys_clk or negedge sys_rst
46、_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_bitCntrH+1; else if (rstCountH) recd_bitCntrH=0; /状态变量传递 always(posedge sys_c
47、lk 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; rstCountH =LO; rec_readyInH=LO;case(state)r_START: begin /START 状态,等待起始位 Sif(rec_datH)next_sta
48、te=r_CENTER; else beginnext_state=r_START; rstCountH=HI; /位计数器复位 rec_readyInH=HI; /接收模块准备好,等待接收数据 武汉理工大学能力强化训练课程设计说明书15end end rCENTER: begin /定位位元中心位置,一个位元包含 16 个系统时钟周期if(bitcell_cntrH=4h4) begin /如果等待 1/2 个位元后输入仍为低电平,则表示接收到一个有效的起始位 S if(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_stat