当前位置: 首页 > article >正文

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转换模块的功能,满足预期设计。


http://www.kler.cn/a/590661.html

相关文章:

  • Qt 通过MSVC编译运行项目
  • 数据库:一文掌握 PostgreSQL 的各种指令(PostgreSQL指令备忘)
  • Linux环境使用jmeter做性能测试
  • Elastic Stack 8.16.0 日志收集平台的搭建
  • 智能合约:Solidity(基于以太坊或兼容链,如 Polygon、BSC)(仅供学习区块链知识,不可进行违法开发应用)
  • 使用 NetworkX 进行图论分析与可视化
  • 仿RabbitMQ的消息队列
  • hadoop集群配置-整体介绍
  • LSM-Tree(Log-Structured Merge-Tree)详解
  • 使用 .NET Core 实现 RabbitMQ 消息队列的详细教程
  • React前端开发中实现断点续传
  • C++中类对象作为类成员(对象成员/成员对象)的一些注意事项
  • 微信开发者工具内建终端使用不了npm,但是cmd可以
  • 如何设置爬虫的延时避免被封禁
  • LeetCode Hot 100:1.两数之和、49.字母异位词分组、128.最长连续序列、283.移动零、11.盛水最多的容器
  • DNA语言模型GROVER学习人类基因组中的序列上下文
  • C/C++都有哪些开源的Web框架?
  • go语言的包使用,以及错误处理
  • 欧拉降幂-乘积幂次
  • 深入理解 IP、子网掩码、端口号和协议