UART转AHB模块ModelSim仿真
一、简介
UART转AHB模块用于实现一种简单的通过上位机控制FPGA内部寄存器的方式。上位机通过串口助手发送读写寄存器的指令,UART转AHB模块接收指令后解析出地址,命令,数据信息,然后转成AHB总线格式输出。这时UART转AHB模块相当于AHB master主模块,对应的包含寄存器的就是AHB slave从模块。
UART接口是上位机最简单最通用的接口,物理接口就TXD和RXD两根线,通过FPGA的3.3V引脚接可以接入。协议方面按字节传输,网上教程也比较多,这里不做详细介绍。时序图如下,也比较简单,只是每个传输的字节是什么功能需要自己定义。
一般设置参数都是波特率115200,有效数据位8,停止位1,无奇偶校验位。
AHB(Advanced High-performance Bus)是一种常用的FPGA内部总线接口。接口保留AHB接口中的主要端口,描述如下。
AHB总线的一次传输由如下两部分组成。地址段,一个周期;数据段,一个或多个周期,可以由HREADY发出请求延长一个周期。
下图是一次没有等待状态的简单的传输时序图。HCLK上升沿 master 驱动地址和控制信号。HCLK下一周期上升沿 slave 采样地址和控制信息,如果是读操作,slave 发出相应的反馈信息,在第三个时钟上升沿被 master采样,同时 slave 完成数据的读写操作。
二、模块介绍
仿真工程可以从此地址下载https://download.csdn.net/download/cjie221/90484623
如下图是UART转AHB模块的功能框图。主要分两部分,uart_slv_top模块和uart_ahb_mst模块。
1. uart_slv_top模块
uart_slv_top模块相当于UART的从设备,接收从上位机发送过来的串行指令数据,转成字节数据和数据使能信号。框图和主要端口如下图。
其中uart_rxs用2个计数器,一个计每个bit位的时钟数,另一个计bit位数,1个开始位,8个数据位,一个停止位,共10位。然后将串行8个数据位转成并行输出并加上数据有效指示信号。
uart_txs同样也是用2个计数器实现数据转换,一个计每个bit位的时钟数,另一个计bit位数。在tx_rdy信号为高时,等待tx_wrreq请求信号和数据,然后拉低tx_rdy信号,表示发送模块正在忙,待串行数据传输完,再拉高tx_rdy。
2. uart_ahb_mst模块
uart_ahb_mst模块接收uart_slv_top模块发送过来的rx_data数据,解析出读写命令和地址,再转成AHB总线接口输出控制AHB slave从模块。如果是读命令,还要将读回的寄存器值转成tx_wrreq请求信号和数据送给uart_slv_top模块。
采用FIFO实现UART时钟域到AHB时钟域的转换。因为UART传输较慢,而AHB传输较快,FIFO还具有指令和数据缓存的作用。对UART RX的FIFO可以保证UART指令接收完再进行AHB读写。对UART TX的FIFO可以缓存多条AHB的返回数据,从而保证UART能有足够时间完成数据的发送。
框图和主要端口如下图。
三、实际仿真过程
如下图所示是testbench框图,除uart_ahb_mst_top模式是被测试模块,其他模块是测试激励和相关辅助模块。
uart_cmd_trans模块主要有两个作用,一是负责将如下字符转成ASCII 码输出。
`define CHAR_SPACE 8'h20
`define CHAR_R_UP 8'h52
`define CHAR_r_LO 8'h72
`define CHAR_W_UP 8'h57
`define CHAR_w_LO 8'h77
`define CHAR_0 8'h30
`define CHAR_1 8'h31
`define CHAR_2 8'h32
`define CHAR_3 8'h33
`define CHAR_4 8'h34
`define CHAR_5 8'h35
`define CHAR_6 8'h36
`define CHAR_7 8'h37
`define CHAR_8 8'h38
`define CHAR_9 8'h39
`define CHAR_A_UP 8'h41
`define CHAR_B_UP 8'h42
`define CHAR_C_UP 8'h43
`define CHAR_D_UP 8'h44
`define CHAR_E_UP 8'h45
`define CHAR_F_UP 8'h46
`define CHAR_a_LO 8'h61
`define CHAR_b_LO 8'h62
`define CHAR_c_LO 8'h63
`define CHAR_d_LO 8'h64
`define CHAR_e_LO 8'h65
`define CHAR_f_LO 8'h66
二是产生寄存器读写测试指令。可根据自己需要,修改指令数量和内容
localparam N = 3;//instruction number, must match with actual memory depth
assign memc[0] = "R 00000004 ";
assign memc[1] = "W 0000000a 00001234";
assign memc[2] = "R 0000000a ";
写寄存器命令格式W 地址 数据,例如:W 0000000a 00001234
读寄存器命令格式R 地址,例如:R 00000004
命令,地址和数据之间用1个空格隔开,命令w和r,大小写都可以。地址和数据都用32位的十六进制表示,不用加0x前缀。
uart_mst_top模块将ASCII 码转成UART格式串行输出,模拟上位机的UART端口。
仿真波形如下图所示。
结语
通过ModelSim仿真,我们能够确认UART转AHB转换模块的功能,满足预期设计。