欢迎光临
我们一直在努力

FPGA实战(52): FPGA数据生成与DMA上传模块设计详解

一、引言

在FPGA开发中,经常需要模拟数据源或进行DMA(直接内存访问)测试。本文介绍一套通用的数据生成与上传控制模块,包含复位同步延迟、可调速测试数据生成、FIFO反压处理以及数据源选择功能。该设计已应用于某高速采集系统,稳定可靠,可复用性强。

二、整体架构

系统由三个独立模块组成:

  • rst_block – 上电/手动复位同步与延迟模块,输出系统所需的正、负极性复位信号。
  • gen_test_data – 可变速的测试数据发生器,支持FIFO满反压。
  • gen_dma_data – DMA上传数据选择器,可选择内部测试数据或外部输入数据,并驱动DMA上传使能。
  • 在这里插入图片描述

    三、模块详细说明

    3.1 复位模块 rst_block

    功能点
    • 输入手动复位信号 man_rst(高有效异步复位)。
    • 输出两个系统复位信号:
      • sys_rst_n:低电平有效,用于复位大多数逻辑。
      • sys_rst:高电平有效,方便某些需要正电平复位的模块。
    • 内部实现复位延迟计数器,计数满 0x131_2D00(约20ms @ 100MHz)后释放复位,确保电源和时钟稳定。
    创新点
    • 双极性输出:同时提供正、负有效复位,适应不同IP核的复位极性需求。
    • 可配置延时:延迟值可根据实际时钟频率调整,确保系统完全初始化。
    • 异步复位同步释放:采用同步释放逻辑(此处用异步复位、同步释放的计数器计数方式),避免复位释放时的亚稳态。
    关键代码片段

    // 复位延迟计数器
    always @(posedge i_clk , posedge i_rst) begin
    if(i_rst)
    r_sys_rst_cnt <= \’d0;
    else if(r_sys_rst_cnt < \’h131_2D00)
    r_sys_rst_cnt <= r_sys_rst_cnt + \’d1;
    else
    r_sys_rst_cnt <= r_sys_rst_cnt;
    end

    // 产生低有效复位
    always @(posedge i_clk , posedge i_rst) begin
    if(i_rst)
    ro_sys_rst_n <= \’d0;
    else if(r_sys_rst_cnt < \’h131_2D00)
    ro_sys_rst_n <= \’d0;
    else
    ro_sys_rst_n <= \’d1;
    end


    3.2 测试数据发生器 gen_test_data

    功能点
    • 输入 speed_div(16位分频值),控制数据生成速率。
    • 输入 fifo_full(FIFO满信号),反压停止输出。
    • 输出 test_en(1个时钟周期的脉冲使能)和 test_data(32位递增值)。
    • 内部计数逻辑:当 fifo_full 无效且计数达到 speed_div 时,产生一个有效脉冲,同时测试数据加1。
    创新点
    • 速率灵活可调:通过 speed_div 寄存器可动态改变生成频率,适应不同测试场景。
    • FIFO反压机制
    赞(0)
    未经允许不得转载:171主机测评 » FPGA实战(52): FPGA数据生成与DMA上传模块设计详解
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址