基于FPGA开发的UART接口模块

UART是通用异步收发器(Universal Asynchronous Receiver/Transmitter)的简称,它包括了RS232、RS499、RS423、RS422和RS485等接口标准规范和总线标准规范,是非常通用的一种数据接口,它规定了通信口的电气特性、传输速率、连接特性和解耦的机械特性等内容。通过收、发数据线和地线,实现数据收发,由于数据传输过程中没有使用时钟信号线进行同步控制,所以这样的传输是异步方式。

1. 整体功能架构描述

本文所设计的模块,用于连接在ARM内核中的一种APB总线上的UART模块。

1.1 模块结构概述

基于FPGA开发的UART接口模块_第1张图片
图 1-1模块结构图

上图所示,该设计包括接收模块、发送模块、收发FIFO模块、波特发生器三大部分,将在接下来的章节中对各个模块分别进行详细描述。

1.2 接口信号描述

序号 信号名 方向 宽度 信号描述 备注
1 Rst in 1 ARM时钟域复位信号,电平信号,‘0’有效。‘1’:模块不复位;‘0’:模块复位。 全局信号
2 Rst26m in 1 26M时钟域复位信号,电平信号,‘0’有效。‘1’:模块不复位;‘0’:模块复位。 全局信号
3 clk in 1 全局时钟信号,输出数据通道时钟。 全局信号
4 ch_clk in 1 全局时钟信号,输入数据通道时钟。 全局信号
5 Clk26m in 1 26M时钟信号,外部输入通道时钟。 全局信号
6 Paddr_i in [3:0] APB总线地址通道,由外围总线桥单元驱动。 APB总线信号
7 Pwdata_i in [31:0] APB总线写通道,最大可达32位。 APB总线信号
8 Prdata_o in [31:0] APB总线读通道,最大可达32位。 APB总线信号
9 Psel_i in 1 APB总线模块片选信号,电平信号,‘1’有效。‘1’:选择该模块;‘0’:未选择该模块。 APB总线信号
10 Penable_i in 1 APB总线模块使能信号,电平信号,‘1’有效‘1’:使能该模块;‘0’:未使能该模块。 APB总线信号
11 Pwrite_i in 1 APB总线读写信号,电平信号,高低均有效‘1’:写操作选择;‘0’:读操作选择。 APB总线信号
12 Utxd_o out 1 UART发送数据线,电平信号,‘1’有效‘1’:可发送数据状态‘0’:不可发送数据状态 其他信号
13 Urxd_i in 1 UART接受数据线,电平信号,‘1’有效‘1’:可接受数据状态‘0’:不可接受数据状态 其他信号
14 Cts_i in 1 UART发送流控信号,电平信号,‘1’有效‘1’:可发送数据‘0’:不可发送数据 其他信号
15 Rts_o out 1 UART接收流控信号,电平信号,‘1’有效‘1’:可接收数据‘0’:不可接收数据 其他信号
16 Uart_int_o out 1 UART中断信号发送,电平信号,‘1’有效‘1’:发送中断‘0’:不发送中断 其他信号

1.3 接口时序

以下两幅时序图为APB总线读写时的时序图。以APB读和写通道为例其中当pwrite信号为低的时候为读指令通道,为高的时候为写指令通道,图中所示信号分别为:


基于FPGA开发的UART接口模块_第2张图片
图 1-2APB总线写时序图
基于FPGA开发的UART接口模块_第3张图片
图 1-3APB总线读时序图

输入通道的所有片选信号均以系统ARM时钟域为跳变参照,当片选信号Psel为高的时候选择该元器件,可读写目标地址,当Penable信号拉高与Psel均为高的时候数据可根据Pwrite的高低,执行读写操作。在执行写数据操作时可在Psel信号拉高的时候将数据放在APB总线口,只有在Penable为高的时候数据才被采沿写入。

输出通道接口时序和输入通道一致,不同的是所有信号同步于时钟clk。

2各个子模块功能详细描述

2.1APB模块

本文所设计的APB模块主要用于低带宽的周边外设之间的连接,支持多个主模块,在主时钟的跳变下两个时钟周期传输、无需等待周期和响应信号、控制逻辑简单,只有四个控制信号。

2.1.1接口信号

基于FPGA开发的UART接口模块_第4张图片
图 2-1接收模块接口信号
序号 信号名 方向 宽度 信号描述
1 Clk in 1 全局时钟信号,电平信号,‘1’有效。‘1’:高电平;‘0’:低电平。
2 Rst in 1 全局同步复位信号,电平信号,‘1’有效。‘1’:模块复位;‘0’:模块不复位。
3 Paddr_i in [3:0] APB总线地址通道,由外围总线桥单元驱动。
4 Pwdata_i in [31:0] APB总线写通道,最大可达32位。
5 Prdata_o out [31:0] APB总线读通道,最大可达32位。
6 Psel_i in 1 APB总线模块片选信号,电平信号,‘1’有效。‘1’:选择该模块;‘0’:未选择该模块。
7 Penable_i in 1 APB总线模块使能信号,电平信号,‘1’有效‘1’:使能该模块;‘0’:未使能该模块。
8 Pwrite_i in 1 APB总线读写信号,电平信号,高低均有效‘1’:写操作选择;‘0’:读操作选择。
9 Cts_i in 1 UART发送流控信号,电平信号,‘1’有效‘1’:可发送数据‘0’:不可发送数据
10 Rts_o out 1 UART接收流控信号,电平信号,‘1’有效‘1’:可接收数据‘0’:不可接收数据

2.1.2 接口时序

输入时序如图1-2所示。

该模块同时将接收到的数据通过输出至相对应寄存器地址的寄存器中,同时将操作寄存器控制其他各个模块运作。

2.1.3关键设计

APB interface可同时进行读写操作,读操作采用组合逻辑输出数据,而写操作则根据时钟沿跳变采用时序逻辑输出,读操作相对于采用时序逻辑输出更快

基于FPGA开发的UART接口模块_第5张图片
图 2-2APB总线读写操作同时进行

如图所示,读和写是相互独立的操作,同时在读写操作位宽大小是32字节,可进行读写寄存器操作和写Uart等操作。

基于FPGA开发的UART接口模块_第6张图片
图 2-3pread和pwrite读取修改

2.2TX/RXFIFO模块

TX/RXFIFO模块包括了发送FIFO和接收FIFO,将两个模块分别用于Uart接收和发送时防止数据处理问题,平滑数据流,分别负责接收和传输的工作。

2.2.1 接口信息

基于FPGA开发的UART接口模块_第7张图片
图 2-4TXFIFO模块信号
基于FPGA开发的UART接口模块_第8张图片
FIFO接口

2.2.2 接口时序

基于FPGA开发的UART接口模块_第9张图片
TXFIFO模块时序图

该模块写入的主要信号入图2-4所示,数据在fiforoom为0的时候empty信号置位高电平,在数据达到16个时候Full信号置高电位。开始传输数据时候empty为低

2.2.3 内部主要信号描述

rd_ptr:读指针,在读操作的时候记录数据存储的读地址,判断数据的位置和读取位置。

wr_ptr:写指针,在进行写操作的时候记录写数据存储的写地址,判断数据的位置和写位置,同时最高位与读指针做比较判断空满标志,输出empty和full。

Fifo_room:存储数据的数组,深度为16,位宽为8,对输入数据进行处理和存储。

datacnt:输入数据计数器,对输入数据的个数进行技术,判断fifo_room存储数据的个数。

dataout:输出数据,数据位宽为8,当read信号拉高的时候,数据输出给tx_uart输出模块。

2.2.4 流程图

基于FPGA开发的UART接口模块_第10张图片
图 2-5TXFIFO流程图

2.2.5 设计关键

wr_ptr和rd_ptr均为[4:0]最高位为空满标志比较位,当两个低4位相等的时候,最高位相等则为空标志,当最高位不相等的时候为满标志,

基于FPGA开发的UART接口模块_第11张图片
fifo满状态
基于FPGA开发的UART接口模块_第12张图片
fifo空状态

如图所示,指针可能出现在fifo中的任何位置,但是当指针最高位相等的时候为空状态标志,但是当不相等的时候为满状态标志。

其中RX_TRIP位标志当TXfifo中的数据小于等于该值的时候将TX_INT状态位拉高,同理RXfifo原理如此。

2.3 UART_TX/RX模块

在UART_TX模块中,使用一个计数器br_cnt的进位信号控制波特发生器,之后使用位计数器bit_cnt控制数据逐位移位输出。Start信号触发一次发送,start为高的时候,置busy为高,并计算校验位以及将数据和校验位给移位寄存器shift_reg。发送接收时,会产生进位bit_co,此时,置busy为低。在start或busy为高时使能br_cnt和bit_cnt计数,每次br_cnt进位产生br_en,shift_reg移位。而接收模块原理与发送模块相似。

2.3.1接口信号

基于FPGA开发的UART接口模块_第13张图片
图 2-7Uart_TX工作模块
基于FPGA开发的UART接口模块_第14张图片
TX接口

2.3.2接口时序

基于FPGA开发的UART接口模块_第15张图片
图 2-7Uart_TX工作时序

该模块的数据根据波特率时钟采沿得到sample,根据sample进行计数,在计数到10的时候标志着结束,产生进位信号,bit_co,同时将busy信号拉低。

2.3.3 内部主要信号描述

  1. Br_cnt:计数器控制数据逐位移位输出。

  2. Bit_co:由bit_cnt计数产生进位信号,此时置busy为低电位。

  3. Shift_reg:移位寄存器,将计算校验位以及数据和校验位赋给移位寄存器。

2.3.4 流程图

基于FPGA开发的UART接口模块_第16张图片
图 2-7Uart_TX工作流程图

utxd_o是发送流控。用于控制数据输出速率。

2.3.5实现方法

基于FPGA开发的UART接口模块_第17张图片
图 2-7Uart_TX工作流程图

上图所示为发送状态机。在busy等于0的时候跳转到空闲状态。
IDLE:空闲状态,当busy==0的时候为空闲状态。
START:开始传输状态,当start==1的时候start拉高,开始传输数据。
SEND:发送状态,此时busy拉高,持续发送数据,bit_cnt开始计数。
CHECK:当check为高的时候使能奇偶检验。
STOP:bi_co被拉高的时候bit_cnt计数溢满的时候发出一个bi_co信号标志传输完成。

2.4Baud发生器

波特率发生器是指数据信号对载波的调制速率,单位时间内载波调制状态的次数。每秒钟通过信道传输的信息量被称为位传输速率。比特率表示有效数据的传输速率。波特率与比特率的关系是比特率=波特率X单个调制状态对应的二进制位数。波特率是传输通道频宽的指标。

2.4.1 接口信号

基于FPGA开发的UART接口模块_第18张图片
图 2-7Uart_Baud发生器
基于FPGA开发的UART接口模块_第19张图片
baud发生器接口

2.4.2 接口时序

基于FPGA开发的UART接口模块_第20张图片
图 2-7Uart_Baud发生器时序图

该模块根据baud_div设置的分频值大小,当Baud_Count计数至分频值大小的时候产生跳变实现分频功能。

2.4.3内部主要信号描述

  1. Baud_div:分频时钟计数器,rst为低电平的时候清零为0,与计数值进行比较如果计数等于Baud_Count的时候clk_out跳变一次。

看到这里的小伙伴如果需要源码和testbench可以直接私信我哟,提供的代码均是可以综合的代码~

你可能感兴趣的:(基于FPGA开发的UART接口模块)