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

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

相关文章:

  • C语言每日一练——day_10
  • 冒泡排序:古老算法中的智慧启示
  • c++学习系列----003.写文件
  • MySQL——数据类型
  • Postman 新手入门指南:从零开始掌握 API 测试
  • 嵌入式Linux | 什么是 BootLoader、Linux 内核(kernel)、和文件系统?
  • 基于javaweb的SpringBoot智能相册管理系统图片相册系统设计与实现(源码+文档+部署讲解)
  • 音视频处理的“瑞士军刀”与“积木”:FFmpeg 与 GStreamer 的深度揭秘
  • 【系统架构设计师】操作系统 - 文件管理 ③ ( 树形目录结构 | 文件属性 | 绝对路径 与 相对路径 )
  • C++类:特殊的数据成员
  • Linux环境使用jmeter做性能测试
  • 全球化2.0 | ZStack云计算系统工程师(ZCCE)国际认证培训成功举办
  • win10 c++ VsCode 配置PCL open3d并显示
  • 猎豹移动(Cheetah Mobile)
  • 【Unity】TextMesh Pro显示中文部分字体异常
  • 基于FPGA的3U机箱模拟量高速采样板ADI板卡,应用于轨道交通/电力储能等
  • 游戏引擎学习第157天
  • LeRobot源码剖析——对机器人各个动作策略的统一封装:包含ALOHA ACT、Diffusion Policy、VLA模型π0
  • 关于微信小程序端base64解码问题
  • 【Spring】声明式事务传播机制
  • 核电开闸!国常会核准10台新机组,拉动超2000亿投资,新项目花落谁家?
  • 广西给出最后期限:6月30日之前主动交代问题可从宽处理
  • 时代邻里:拟收购成都合达联行科技剩余20%股权
  • 韩国京畿道骊州市市长率团访问菏泽:想和菏泽一起办牡丹节
  • 潘功胜:央行将实施好适度宽松的货币政策,推动中国经济高质量发展
  • 嫦娥八号任务合作项目,这十个入选