串口发送模块设计与验证
[media]https://imgcache.qq.com/tencentvideo_v1/playerv3/TPout.swf?max_age=86400&v=20161117&vid=t0188laefyn&auto=0[/media]
课程目标:1.实现基于FPGA的RS232协议发送数据模块
2.使用ISSP进行调试与验证设计的数据发送模块
实验平台:芯航线FPGA学习套件核心板、PC机
实验原理:
通用异步收发传输器(UniversalAsynchronous Receiver/Transmitter,简称UART)是一种异步收发传输器,其将并行数据转换成串行数据以便传输;将接收到的串行数据转换成并行数据。它包括了RS232、RS449、RS423、RS422和RS485等接口标准规范和总线标准规范,即UART是异步串行通信口的总称。而RS232、RS449、RS423、RS422和RS485等,是对应各种异步串行通信口的接口标准和总线标准,它规定了通信口的电气特性、传输速率、连接特性和接口的机械特性等内容。
RS-232是美国电子工业联盟(EIA)制定的串行数据通信的接口标准,原始编号全称是EIA-RS-232(简称232,RS232),被广泛用于计算机串行接口外设连接。其DB9接口的针脚定义如图11-1所示,引脚功能如表11-1所示。
图11-1 RS232,DB9针脚定义
表11-1 针脚功能
在RS-232标准中,8bit数据,没有奇偶校验,1bit停止位下发送一个字节时序图如图11-2所示,首先是一个起始位后面紧跟8个数据比特,最后是停止位。
图11-2 UART发送一个字节时序图
串行通信在软件设置时需要做多项设置,最常见的设置包括波特率(Baud)、奇偶校验(Parity Check)和停止位(Stop Bit)。
波特率:是指从一设备发到另一设备的波特率,即每秒钟多少符号。典型的波特率有300, 1200, 2400, 9600, 19200, 115200等。一般通信两端设备都要设为相同的波特率,但有些设备也可设置为自动检测波特率。
奇偶校验:是用来验证数据的正确性。奇偶校验一般不使用,如果使用,则既可以做奇校验(Odd Parity)也可以做偶校验(Even Parity)。在偶校验中,因为奇偶校验位会被相应的置1或0(一般是最高位或最低位),所以数据会被改变以使得所有传送的数位(含字符的各数位和校验位)中“1”的个数为偶数;在奇校验中,所有传送的数位(含字符的各数位和校验位)中“1”的个数为奇数。奇偶校验可以用于接受方检查传输是否发送生错误,如果某一字节中“1”的个数发生了错误,那么这个字节在传输中一定有错误发生。如果奇偶校验是正确的,那么要么没有发生错误要么发生了偶数个的错误。如果用户选择数据长度为8位,则因为没有多余的比特可被用来作为同比特,因此就叫做“非奇偶校验(Non Parity)”。
停止位:是在每个字节传输之后发送的,它用来帮助接受信号方硬件重同步。停止位可以是1、1.5或者2位的(1.5是用在波特率为60wpm的电传打字机上的)。
RS232通信协议需要一定的硬件支持,早期的是RS232转TTL,这时需要MAX232这类IC来做数据转换,其典型电路图如11-3所示。
图11-3 RS232转TTL电路图
现在由于系统集成度越来越高,DB9的RS232接口占用PCB面积过大,多数系统已经转用USB转TTL,也就是芯航线FPGA开发板板载的方式,其电路图如图11-4所示。具体的使用原理可以参见新航线附赠的数据手册,与RS232转TTL只有硬件上的区别。
图11-4 USB转TTL电路图
实验过程:
基于以上原理,串口发送模块整体框图如图11-5所示,其接口列表如表11-2所示。
图11-5 串口发送模块整体框图
表11-3 模块接口列表
经过以上的分析,串口发送模块详细结构图如图11-6所示,其中每一子模块的作用如表11-4所示。其中绿色的框代表单一结构的寄存器,来实现数据的稳定输入以及输出。
图11-6 串口发送模块结构图
表11-4 子功能块功能描述
建立工程子文件夹后,新建一个以名为uart_byte_tx的工程保存在prj下,并在本工程目录的rtl文件夹下新建verilog file文件并以uart_byte_tx.v保存。由上面的分析可以得出如下的信号列表。
串口发送模块两个主要组件之一即为波特率时钟生成模块,这里需要计数的计数值与波特率之间的关系如表11-5所示,其中系统时钟周期为System_clk_period,这里为20ns。
表11-5 波特率计算
前面讲到了想扩展其本模块的复用性,需要可以根据需要设置不同的波特率,也就是指的设置不同的波特率时钟计数值。这里使用查找表即可实现,下面只举出了五个波特率的设置,如需要其他波特率可根据实际使用情况具体修改。
对波特率时钟进行计数,来确定数据发送的循环状态。
同样为了使得模块可以与其他模块进行控制或者调用,这里产生一个byte传送结束的信号。一个数据位传输结束后Tx_done信号输出一个时钟的高电平。
产生数据传输状态信号,当在正常传输的时候uart_state信号为高电平,其他情况均为低电平。这里实现的电路结构同样是具有优先级顺序的,但与C语言本质是不同的。在图11-6中的MUX2_1与MUX2_2也就是下面的设计实现的if—else if—else的电路结构。
由于RS232是一个异步的收发器因此为了保证发送的数据在时钟到来的时候是稳定的,这里采用将输入数据进行寄存。
在模块结构图11-6中也有一个十选一多路器 ,作用是根据bps_cnt的值来确定需要发送位。
进行分析和综合直至没有错误以及警告。
为了测试仿真编写测试激励文件,新建uart_byte_tx_tb.v文件保存到testbench文件夹下,除编写正常的时钟外,输入以下内容再次进行分析和综合直至没有错误以及警告。以下生成了复位信号以及使能信号、待传输数据。这里与系统时钟错开1ns,是为了更能清楚看到输入输出数据与时钟的时序关系。
设置好仿真脚本后进行功能仿真,可以看到如图11-7所示的波形文件,可以看出在复位信号置高以及使能信号有效之前输出信号Rs232_Tx均为0,在复位结束以及使能后输出信号才开始正常,且当输入数据为8`b10101010(MSB)后,输出信号依次为1、0(起始位)、01010101(LSB)、1(终值位);当输入数据为8`b01010101(MSB)后,输出信号依次为1、0(起始位)、10101010(LSB)、1(终值位)。state处于发送为0,即仿真通过。
图11-7 单byte数据传输仿真波形图
为了实现前面所说的效果先将以前编写好的按键消抖模块添加到工程当中,并再次使用ISSP,其主要参数配置如图11-8所示,并加入到工程中。
图11-8 ISSP主要参数配置
在本工程目录的rtl文件夹下新建verilog file文件在此文件下输入以下内容并以uart_tx_top.v保存,并设置为顶层文件。这里Tx_done不对外控制这里先不进行连接。
编译无误后,点击RTL_viewer可以看到如图11-9的各模块连接图。
图11-9 各模块连接图
分配引脚后全编译无误后下载工程到开发板中。在Quartus II中点击Tools—In-System Source and Probes Editor启动ISSP,手动选择下载器后,并将数据格式改为设计中的hex格式。打开串口助手波特率设置为9600、没有校验位、8位数据位以及1bit停止位。
在Quartus II中,使用In system sources and probes editor工具,输入需要通过串口发送出去的数据,然后按下学习板上的按键0,则FPGA自动将所需要发送的数据发送出去,即可在串口助手中看到相关数据。且板载的LED_RX每接收一byte数据均会亮一下,这里由于时钟较快,数据传输过程很快,因此代表传输状态的led0看着“常亮”。
图11-10 串口上位机接收数据显示
至此完成了基于FPGA的串口发送通信协议实现以及In system sources and probes editor(ISSP)调试工具的使用。
小梅哥
芯航线电子工作室