手把手教你学会 Xilinx PCIE/XDMA 读写DDR系列(三) ——XDMA读写DDR项目工程讲解和下板测试

这篇具有很好参考价值的文章主要介绍了手把手教你学会 Xilinx PCIE/XDMA 读写DDR系列(三) ——XDMA读写DDR项目工程讲解和下板测试。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

因最近想通过PCIE把数据从FPGA传到PC,借此机会和大家一起学习XDMA读写DDR

制作不易,记得三连哦,给我动力,持续更新!!!

完整工程文件下载:XDMA读写DDR工程   提取码:4sxh


在前两篇文章的学习中,我们已经成功配置了XDMA读写DDR所需的两个关键IP核,并深入学习了XDMA读写DDR的理论知识。现在是时候趁热打铁,一次性搞定整个XDMA读写DDR工程的构建,并对其功能进行验证了。本章将引导我们逐步完成以下步骤,确保我们的工程顺利实现:

好的,废话不多说,直接来干货!!!!!

一、整体设计全貌

整体设置主要包括四个部分:数据输入部分,读写DDR部分(图中写错了),DDR配置部分,XDMA配置部分。

亮点:同时接出来了用户数据接口,以后可以很方便的接用户数据,并且此接口为AXI4协议接口,同时也留出来PC端用户接口,用于用户通过PC传输指令到FPGA。

实现整体功能为:实现数据流到DDR,然后通过PCIE读出,并从PCIE写数据,然后读DDR的回环测试。

数据流方向:user DATA -->> DDR --> PC --> DDR --> uesr DATA

手把手教你学会 Xilinx PCIE/XDMA 读写DDR系列(三) ——XDMA读写DDR项目工程讲解和下板测试,XDMA,fpga开发,fpga,硬件工程

接下来讲把每个模块单独拎出来,独立进行讲解。

二、模块介绍

(1)数据输入模块

        此模块的功能:为此设计模拟输入数据源,同时也为以后用户外接数据留出接口

        主要通过AXI_data_out模块产生AXI数据,然后通过AXI data fifo对数据进行缓存,然后输出标准的AXI协议的数据。

手把手教你学会 Xilinx PCIE/XDMA 读写DDR系列(三) ——XDMA读写DDR项目工程讲解和下板测试,XDMA,fpga开发,fpga,硬件工程

AXI_data_out具体部分代码:

module AXI_data_OUT (
  input wire clk,
  input wire rst_n,
  output reg valid,
  output reg last,
  input wire fifo_ready,
  output reg [31:0] data
);

  reg [11:0] count;

  always @(posedge clk or posedge rst_n) begin
    if (~rst_n) 
        count <= 0;
    else if (count < 400)
        count <= count + 1;
    else
        begin
            count <= 0;
        end 
    end
  
/* 
因
字
数
限
制
  
部
分
代
码
省
略
*/


endmodule

(2)读写DDR模块

        此模块主要为把用户数据写入DDR,以及读出PC端写入DDR的数据,进行软硬件数据交互,并且通过总线连接到AXI connect IP。

        通过wr_addr模块把数据转化成总线形式,把数据地址和数据通过AXI协议总线连接到AXI Smartconnect IP,同时添加ILA查看读写数据总线状态,方便后期调试数据使用。

        手把手教你学会 Xilinx PCIE/XDMA 读写DDR系列(三) ——XDMA读写DDR项目工程讲解和下板测试,XDMA,fpga开发,fpga,硬件工程

wr_addr部分具体代码:

module wr_addr
(
    input                       clk,
    input                       rst_n,
    
    input                       i_valid,
    input                       i_last,
    input   [31:0]              i_data,
    output  reg                 fifo_ready,
    
    input                   xdma_valid,
    input                   i_fifo_ready,
    output                  o_valid,
    output                  o_last,
    output  [31:0]          o_data,
    
    
    //AXI总线    
        input wire  m00_axi_init_axi_txn,
		output wire  m00_axi_txn_done,
		output wire  m00_axi_error,
		input wire  m00_axi_aclk,
		input wire  m00_axi_aresetn,
		output wire [C_M00_AXI_ID_WIDTH-1 : 0] m00_axi_awid,
		output wire [C_M00_AXI_ADDR_WIDTH-1 : 0] m00_axi_awaddr,
		output wire [7 : 0] m00_axi_awlen,
		output wire [2 : 0] m00_axi_awsize,
		output wire [1 : 0] m00_axi_awburst,
		output wire  m00_axi_awlock,
		output wire [3 : 0] m00_axi_awcache,
		output wire [2 : 0] m00_axi_awprot,
		output wire [3 : 0] m00_axi_awqos,
		output wire [C_M00_AXI_AWUSER_WIDTH-1 : 0] m00_axi_awuser,
		output wire  m00_axi_awvalid,
		input wire  m00_axi_awready,
		output wire [C_M00_AXI_DATA_WIDTH-1 : 0] m00_axi_wdata,
		output wire [C_M00_AXI_DATA_WIDTH/8-1 : 0] m00_axi_wstrb,
		output wire  m00_axi_wlast,
		output wire [C_M00_AXI_WUSER_WIDTH-1 : 0] m00_axi_wuser,
		output wire  m00_axi_wvalid,
		input wire  m00_axi_wready,
		input wire [C_M00_AXI_ID_WIDTH-1 : 0] m00_axi_bid,
		input wire [1 : 0] m00_axi_bresp,
		input wire [1 : 0] m00_axi_rresp,
		input wire  m00_axi_rlast,
		input wire [C_M00_AXI_RUSER_WIDTH-1 : 0] m00_axi_ruser,
		input wire  m00_axi_rvalid,
		output wire  m00_axi_rready          
);

    wire         aw_ready;
    wire         w_ready;
  
    reg           [31:0]    aw_addr_cnt;

    reg            [1:0]       state, state_next;
    localparam            s0 = 2'b00, s1 = 2'b01, s2 = 2'b10, s3 = 2'b11;
    

/* 
因
字
数
限
制
  
部
分
代
码
省
略
*/
    
   
    assign m00_axi_wdata      = w_data        ;
	assign m00_axi_wvalid     = w_valid       ;
	assign m00_axi_wlast      = w_last        ;
	assign m00_axi_wstrb      = w_strb        ;
	
	assign m00_axi_awaddr     = aw_addr       ;
	assign m00_axi_awlen      = aw_len        ;
	assign m00_axi_awsize     = aw_size       ;
	assign m00_axi_awburst    = aw_burst      ;
	assign m00_axi_awvalid    = aw_valid      ;
	assign aw_ready         = m00_axi_awready ;

	assign b_resp           = m00_axi_bresp   ;
	assign b_valid          = m00_axi_bvalid  ;
	assign m00_axi_bready     = b_ready       ;
	
	
	assign m00_axi_araddr     = ar_addr       ;
    assign m00_axi_arlen      = ar_len        ;
    assign m00_axi_arsize     = ar_size       ;
    assign m00_axi_arburst    = ar_burst      ;
    assign m00_axi_arvalid    = ar_valid      ;
    assign ar_ready         = m00_axi_arready ;
    
    assign r_data           = m00_axi_rdata   ;
    assign r_last           = m00_axi_rlast   ;
    assign r_resp           = m00_axi_rresp   ;
    assign r_valid          = m00_axi_rvalid  ;
    assign m00_axi_rready     = r_ready       ;
  
endmodule

(3)DDR配置模块 和 XDMA配置模块

        这两个模块在前两个章节已经做了具体的介绍,如果需要可以去前两个章节进行详细查看和学习:

DDR配置快速入口:

手把手教你学会 Xilinx PCIE/XDMA 读写DDR系列(一) DDR/MIG配置详细步骤_xlinx pcie xdma 流模式-CSDN博客

XDMA配置快速入口:

手把手教你学会 Xilinx PCIE/XDMA 读写DDR系列(二) ——XDMA详细配置步骤_xdma创建设备流程-CSDN博客

因以前有详细介绍,在这里就不过多介绍了。

三、下板测试

(1)XDMA驱动安装

       1、环境设置

        由于 Xilinx 提供的 XDMA 驱动程序未经过数字认证签名,而是使用测试签名,所以我们还需要在Windows 系统中开启允许加载已进行测试签名的驱动程序,以便启用此驱动程序的安装,否则安装不了XDMA 的驱动。
下面我们介绍如何在 Windows 系统中启用或禁用测试签名代码的使用。按键盘上的 Win+x 快捷键,在弹出的菜单窗口中选择“Windows PowerShell(管理员)(A)” ,以管理员身份运行 PowerShell
在 PowerShell 中输入如下命令以启用测试签名代码的加载:
手把手教你学会 Xilinx PCIE/XDMA 读写DDR系列(三) ——XDMA读写DDR项目工程讲解和下板测试,XDMA,fpga开发,fpga,硬件工程

        在 Windows 系统中启用测试签名代码的加载后, 要使更改生效,必须重新启动计算机。 另外 PCIe 程序下载完成后, 也需要重启电脑(对主机进行热启动),以使电脑能检测到 PCIe 设备,所以现在我们重启安插有开发板的电脑主机。

        2、下载XDMA驱动:

        可以通过官网下载最新版本,也可以 通过直接下载我使用的这个稳定版本

        Windows XDMA驱动下载

        3、安装XDMA驱动

          以 Win10 为例。进入解压缩后的x64\XDMA_Driver\Win10_Release 目录下,鼠标右键点击 XDMA.cer 文件,在弹出的菜单中选择“安装证书(I)”,如下图所示:

手把手教你学会 Xilinx PCIE/XDMA 读写DDR系列(三) ——XDMA读写DDR项目工程讲解和下板测试,XDMA,fpga开发,fpga,硬件工程

然后一路next即可,显示下图表示证书导入成功

手把手教你学会 Xilinx PCIE/XDMA 读写DDR系列(三) ——XDMA读写DDR项目工程讲解和下板测试,XDMA,fpga开发,fpga,硬件工程

        安装完证书后,进入当前目录下的 XDMA_Driver 目录,鼠标右键点击 XDMA.inf 文件,在弹出的菜单中选择“安装(I)”,如下图所示:

手把手教你学会 Xilinx PCIE/XDMA 读写DDR系列(三) ——XDMA读写DDR项目工程讲解和下板测试,XDMA,fpga开发,fpga,硬件工程

在弹出的“Windows 安全中心”界面中选择“始终安装此驱动程序软件(I)”,如下图所示:

手把手教你学会 Xilinx PCIE/XDMA 读写DDR系列(三) ——XDMA读写DDR项目工程讲解和下板测试,XDMA,fpga开发,fpga,硬件工程

弹出操作成功完成窗口, 点击“确定”按钮如下图所示:

手把手教你学会 Xilinx PCIE/XDMA 读写DDR系列(三) ——XDMA读写DDR项目工程讲解和下板测试,XDMA,fpga开发,fpga,硬件工程

(2)下载bit文件测试

通过vivado下载工程编译出的bit文件,然后重启插板卡的主机

1、检测XDMA设备

        完成驱动的安装后,点击设备管理器中的“扫描检测硬件改动” 按钮,会显示出 Xilinx Drivers,如下图所示:

手把手教你学会 Xilinx PCIE/XDMA 读写DDR系列(三) ——XDMA读写DDR项目工程讲解和下板测试,XDMA,fpga开发,fpga,硬件工程

2、测试代码

        进入解压后的驱动文件的bin目录下,里面包含一些使用XDMA驱动程序的基本应用程序如下图所示并执行其中的应用程序的方式是在该文件窗口中:

手把手教你学会 Xilinx PCIE/XDMA 读写DDR系列(三) ——XDMA读写DDR项目工程讲解和下板测试,XDMA,fpga开发,fpga,硬件工程

在打开的Powershell窗口中输入下面命令:

.\xdma_test.exe

        执行结果可以看到, XDMA 使用的是 AXI-MM 接口模式,使用的是双通道的 h2c 和 c2h,在每个 h2c和 c2h 通道上传输 4096 字节的数据并验证数据是匹配的。 从 xdma_test 的检测结果和读写测试中可以知道我们设计的 XDMA Vivado 工程是没有问题的。

手把手教你学会 Xilinx PCIE/XDMA 读写DDR系列(三) ——XDMA读写DDR项目工程讲解和下板测试,XDMA,fpga开发,fpga,硬件工程

3、测试读DDR里面的数据

在打开的Powershell窗口中输入下面命令:

.\xdma_rw.exe c2h_0 read 0x00000000 -b -f datafile4K_rd.bin -l 4096

该命令以二进制的形式创建并打开文件 datafile4k_rd.bin 文件,通过 c2h_0 通道从 DDR 内存地址0x00000000 中读取 4096 字节数据写入到 datafile4k_rd.bin 文件。

手把手教你学会 Xilinx PCIE/XDMA 读写DDR系列(三) ——XDMA读写DDR项目工程讲解和下板测试,XDMA,fpga开发,fpga,硬件工程

测试结果:

手把手教你学会 Xilinx PCIE/XDMA 读写DDR系列(三) ——XDMA读写DDR项目工程讲解和下板测试,XDMA,fpga开发,fpga,硬件工程

如上图用16进制打开之后,就是刚刚在数据输入模块写入的数据,测试结果没问题,说明 此工程从DDR -->PCIE 没问题。

4、测试从PC写数据到DDR

在打开的Powershell窗口中输入下面命令:

.\xdma_rw.exe h2c_0 write 0x00000000 -b -f datafile4K.bin -l 4096

该命令以二进制的形式读取文件 datafile4k.bin 并通过 h2c_0 通道将其前 4096 字节(对于 datafile4k.bin文件而言是整个文件数据) 数据写入到 DDR 内存地址 0x00000000。 执行结果如下图所示:
手把手教你学会 Xilinx PCIE/XDMA 读写DDR系列(三) ——XDMA读写DDR项目工程讲解和下板测试,XDMA,fpga开发,fpga,硬件工程

然后通过ila看DDR的信号:

手把手教你学会 Xilinx PCIE/XDMA 读写DDR系列(三) ——XDMA读写DDR项目工程讲解和下板测试,XDMA,fpga开发,fpga,硬件工程

如上图可以看出,ila上的数据就是从PC写入的3个数据,说明此工程中 PCIE--> DDR也没问题

总结:

这样的话,此工程的读写DDR全部测试完成,并且读写DDR都没有问题,下一次我们可以结合以前写的Aurora的使用,来创建一个通过光纤传输数据到DDR,然后再通过PC读出的一个大工程,这部分后续有时间会继续更新。

如果感觉文章对您有用,麻烦三连支持一下,方便下次用到的时候,就可以快速找到我,非常感谢您的支持!!!文章来源地址https://www.toymoban.com/news/detail-838923.html

到了这里,关于手把手教你学会 Xilinx PCIE/XDMA 读写DDR系列(三) ——XDMA读写DDR项目工程讲解和下板测试的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【算法】手把手学会二分查找

    目录 简介 基本步骤 第一种二分 第二种二分  例题 搜索插入位置 数的范围 总结  🥥二分查找,又叫折半查找,通过找到数据二段性每次都能将原来的数据筛选掉一半,通过这个算法我们能够将一个一个查找的  O(n)  的时间复杂度优化到  O(logn)  ,极大地提升了查找的效率

    2023年04月08日
    浏览(42)
  • 【算法】手把手学会前缀和

    目录 前缀和 前缀和的好处 公式的推导 例题:前缀和 二维前缀和 推导公式  例题: 子矩阵的和 🎵前缀和算法可以理解为是一种 以空间换时间的方式 ,通过建立一个新的数组来 存储从头到当前位置的数据的总和 。 初始化数组  🎵前缀和数组的初始化就是将前  i  个数存

    2024年01月17日
    浏览(41)
  • 【算法】手把手学会BFS

    目录 简介 层序遍历 例题 献给阿尔吉侬的花束 全球变暖 🍦宽度优先搜索算法(又称广度优先搜索)是 最简便的图的搜索算法之一 ,之前我们在实现对树的层序遍历时就使用过它。不仅如此它还在求最短路径,找连通块时具有奇效。 🍦层序遍历基本上借助于队列,将队头

    2023年04月09日
    浏览(98)
  • Xilinx PCIe XDMA IP中断

    IRQ Module Legacy Interrupts (1)usr_irq_req拉高导致中断发送到PCIe Host,可以同时拉高多个bit; (2)等到ack后,相应的usr_irq_req才可以拉低; 第一个 ack 表示 INT 消息已经被发送到了 PCIe block ; (3) 经过 (2) 后 ,FPGA XDMA 内的 interrupt pending register 将会拉高 , 等待 ISR 的查和处理

    2024年01月16日
    浏览(37)
  • 手把手教你SHA-256

    SHA-256是SHA-2协议簇的一部分,也是当前最流行的协议算法之一。在本篇文章中,我们会了解这个密码学算法的每一个步骤,并且通过实例演示。SHA-2因它的安全性(比SHA-1强很多)和速度为人所知。在没有键(keys)生成的情况下,例如挖掘比特币,像SHA-2这样的快速哈希算法很

    2024年02月13日
    浏览(75)
  • 手把手教你暴力破解

    暴力破解是一种攻击手段,使用大量的认证信息在认证接口尝试登录,直到得到正确的结果。 2.1标题基于表单的暴力破解 2.1.1 第一步:打开burpsuite拦截 2.1.2 第二步:将拦截到的包右击发送到intruder模块 (其中简单介绍一下intruder模块) Target主要是设置暴力破解访问的host地址

    2024年02月07日
    浏览(57)
  • 手把手教你实战TDD

    领域驱动设计,测试驱动开发。 我们在《手把手教你落地DDD》一文中介绍了领域驱动设计(DDD)的落地实战,本文将对测试驱动开发(TDD)进行探讨,主要内容有:TDD基本理解、TDD常见误区、TDD技术选型,以及案例实战。希望通过本文,读者能够理解掌握TDD并将其应用于实际

    2024年02月08日
    浏览(45)
  • 手把手教你做主成分分析

    主成分分析是一种降维处理的统计方法,实践中有三个应用场景: 信息浓缩:将多个分析项浓缩成几个关键概括性指标; 权重计算:利用方差解释率值计算各概括性指标的权重; 综合评价:基于主成分得分构造综合得分数据,用于综合评价。 接下来,以一个具体案例来学习

    2024年02月01日
    浏览(57)
  • 手把手教你落地DDD

    一、前言 常见的DDD实现架构有很多种,如经典四层架构、六边形(适配器端口)架构、整洁架构(Clean Architecture)、CQRS架构等。架构无优劣高下之分,只要熟练掌握就都是合适的架构。本文不会逐个去讲解这些架构,感兴趣的读者可以自行去了解。 本文将带领大家从日常的

    2024年02月16日
    浏览(49)
  • 手把手教你写go单元测试

    ​ 在 Go 语言中,单元测试是一种测试方法,用于验证代码的某个独立单元是否按预期功能,它的目的是确保代码的每个组成部分都在独立测试的情况下运行正常。 ​ 在我们对项目新增一个新功能时,最好就要养成写单元测试的好习惯,这样可以有助于提高我们代码的质量、

    2024年04月14日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包