PCIE_DMA实例二:xapp1052的EDK仿真

这篇具有很好参考价值的文章主要介绍了PCIE_DMA实例二:xapp1052的EDK仿真。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一:前言

二:前期准备

三:操作步骤

四:仿真结果

五:总结


一:前言

     对于有的同学,想要学习基于FPGA的PCIe DMA控制器设计,但是手上没有合适的Xilinx开发板,而且xapp1052又没有提供仿真代码,学习陷入了困境。此文章用EDK搭建一个微小系统,然后用modelsim来仿真xapp1052的DMA收发控制,这样应该是最全面的理解PCIe_DMA了,希望对大家都有帮助。

二:前期准备

1、Xapp1052 Demo(http://download.csdn.net/download/yuzeren48/7723795)

2、ISE14.1套件

3、基本会使用EDK(主要是Xilinx Platform Studio,XPS 和 Software Development Kit,SDK)

三:操作步骤

1、编译库文件,将D:\Xilinx\14.1\ISE_DS\ISE\verilog\mti_se\10.1b\nt\modelsim.ini中选中部分复制粘贴到D:\modeltech_10.1b\modelsim.ini中

PCIE_DMA实例二:xapp1052的EDK仿真

2、打开XPS,新建一个最小系统,使用microblaze和PLB总线,总线上挂载的硬件IP如图2所示,硬件的总线地址如图3所示

PCIE_DMA实例二:xapp1052的EDK仿真

图2 硬件IP

PCIE_DMA实例二:xapp1052的EDK仿真

图3 硬件IP总线地址

3、完成硬件系统搭建后,导出到SDK

PCIE_DMA实例二:xapp1052的EDK仿真

4、打开SDK后,先新建一个BSP包,步骤请参考《Xilinx FPGA开发实用教程》

然后新建一个空的Xilinx C Project,命名为example。

在E:\xapp1052\dma_performance_demo\win32_sw\win32_driver\source下找到ioctrl.h,复制粘贴到E:\pcie_edk\EDK\workspace\example\src

在src中添加C文件,命名为RC_example.c。再将

D:\Xilinx\14.1\ISE_DS\EDK\sw\XilinxProcessorIPLib\drivers\pcie_v4_01_a\examples\xpcie_rc_enumerate_example.c中的代码复制到RC_example.c中

对RC_example.c做如下修改:

//#define PCIE_CFG_BAR_0_ADDR         0x11110000
#define PCIE_EP_CFG_BAR_0_ADDR       0x0000FFFF        // Remote EP BAR0
#define PCIE_RC_CFG_BAR_0_ADDR      0x0000EEEE         // RC BAR0

添加:

//-------------------BMD Mrd Test
*(unsigned int*)(XPAR_PLBV46_PCIE_0_IPIFBAR_0 + DCR_OFFSET)             = Xil_EndianSwap32(0x00000001);      //1. DMA assert reset
*(unsigned int*)(XPAR_PLBV46_PCIE_0_IPIFBAR_0 + DCR_OFFSET)             = Xil_EndianSwap32(0x00000000);        //
*(unsigned int*)(XPAR_PLBV46_PCIE_0_IPIFBAR_0 + READ_ADDR_OFFSET)       = PCIE_RC_CFG_BAR_0_ADDR;            //2. Read DMA TLP Address Register
*(unsigned int*)(XPAR_PLBV46_PCIE_0_IPIFBAR_0 + READ_SIZE_OFFSET)       = Xil_EndianSwap32(0x0000050/);     //3. Read DMA TLP Size Register
*(unsigned int*)(XPAR_PLBV46_PCIE_0_IPIFBAR_0 + READ_COUNT_OFFSET)      = Xil_EndianSwap32(0x00000100);      //4. Read DMA TLP Count Register
*(unsigned int*)(XPAR_PLBV46_PCIE_0_IPIFBAR_0 + READ_PATTERN_OFFSET)    = Xil_EndianSwap32(0xA3A2A1A0);      //5. Read DMA Data Pattern Register
*(unsigned int*)(XPAR_PLBV46_PCIE_0_IPIFBAR_0 + DCSR_OFFSET)            = Xil_EndianSwap32(0x00010000);      //7. MWr start

或者

//-------------------BMD Mrd Test
*(unsigned int*)(XPAR_PLBV46_PCIE_0_IPIFBAR_0 + DCR_OFFSET)             = Xil_EndianSwap32(0x00000001);      //1. DMA assert reset
*(unsigned int*)(XPAR_PLBV46_PCIE_0_IPIFBAR_0 + DCR_OFFSET)             = Xil_EndianSwap32(0x00000000);        //
*(unsigned int*)(XPAR_PLBV46_PCIE_0_IPIFBAR_0 + READ_ADDR_OFFSET)       = PCIE_RC_CFG_BAR_0_ADDR;            //2. Read DMA TLP Address Register
*(unsigned int*)(XPAR_PLBV46_PCIE_0_IPIFBAR_0 + READ_SIZE_OFFSET)       = Xil_EndianSwap32(0x0000050/);     //3. Read DMA TLP Size Register
*(unsigned int*)(XPAR_PLBV46_PCIE_0_IPIFBAR_0 + READ_COUNT_OFFSET)      = Xil_EndianSwap32(0x00000100);      //4. Read DMA TLP Count Register
*(unsigned int*)(XPAR_PLBV46_PCIE_0_IPIFBAR_0 + READ_PATTERN_OFFSET)    = Xil_EndianSwap32(0xA3A2A1A0);      //5. Read DMA Data Pattern Register
*(unsigned int*)(XPAR_PLBV46_PCIE_0_IPIFBAR_0 + DCSR_OFFSET)            = Xil_EndianSwap32(0x00010000);      //7. MWr start

在初始化RC端配置寄存器时,添加代码:

//---------------------------------------------------- Configure RC
//Write Address to PCIe BAR0
HeaderData = PCIE_RC_CFG_BAR_0_ADDR;
XPcie_WriteLocalConfigSpace(XlnxRootComplexPtr, PCIE_CFG_BAR_0_REG, HeaderData);

将RC端pcie_bar0设为0x0000EEEE (有大小端,故实际地址为0xEEEE0000)。

在枚举使需要初始化远端EP,修改代码,使能master enable bit:

ConfigData |= (PCIE_CFG_CMD_BUSM_EN | PCIE_CFG_CMD_MEM_EN | 0x80000000    //master enable bit ); 

修改EP端pcie_bar0为0x0000FFFF(有大小端,故实际地址为0xFFFF0000):

/* Write Address to PCIe BAR0 */
ConfigData = (PCIE_EP_CFG_BAR_0_ADDR | PCIeBusNum | PCIeDevNum | PCIeFunNum);

最后,去掉所有printf函数,打印太慢了,影响仿真。

编译后生成elf文件,打开XPS,设置sim executable:

PCIE_DMA实例二:xapp1052的EDK仿真

在Edit中设置preference

PCIE_DMA实例二:xapp1052的EDK仿真

然后点击Generate HDL Files,再Launch Simulator

在打开的modelsim脚本栏中输入c;

完成RC编译,再输入s; 开始对RC端仿真。

5、若要仿真整个PCIE DMA,则需要修改..\EDK\simulation\behavioral文件夹下的system_tb.v,在system_tb.v中加入EP端用户逻辑,修改如下:

// START USER CODE (Do not remove this line)
 
  // User: Put your stimulus here. Code in this
  //       section will not be overwritten.
 initial
    begin
      pcie_sysclk_p = 'b1;
      forever #(fpga_0_clk_1_sys_clk_p_pin_PERIOD)
        pcie_sysclk_p = ~pcie_sysclk_p;   //100MHz
    end
 
  initial
    begin
      pcie_sysclk_n = 'b0;
      forever #(fpga_0_clk_1_sys_clk_p_pin_PERIOD)
        pcie_sysclk_n = ~pcie_sysclk_n;   //100MHz
    end
 
reg EP_pcie_sysclk_p;
reg EP_pcie_sysclk_n;
 
  initial
    begin
      EP_pcie_sysclk_p = 'b1;
      forever #()
        EP_pcie_sysclk_p = ~EP_pcie_sysclk_p;   //125 MHz
    end
 
  initial
    begin
      EP_pcie_sysclk_n = 'b0;
      forever #()
        EP_pcie_sysclk_n = ~EP_pcie_sysclk_n;   //125 MHz
    end
 
wire ep_pci_exp_txp;
wire ep_pci_exp_txn;
 
    always@* begin
        plbv46_pcie_0_RXP_pin = ep_pci_exp_txp;
        plbv46_pcie_0_RXN_pin = ep_pci_exp_txn;
    end
 
xilinx_pcie_2_0_ep_v6 # (
 
      .PL_FAST_TRAIN("TRUE")
 
)
EP (
 
      // SYS Inteface
      .sys_clk_p(EP_pcie_sysclk_p),
      .sys_clk_n(EP_pcie_sysclk_n),
      .sys_reset(fpga_0_rst_1_sys_rst_pin),
 
`ifdef ENABLE_LEDS
      // Misc signals
      .led_0(led_0),
      .led_1(led_1),
      .led_2(led_2),
`endif
 
      // PCI-Express Interface
      .pci_exp_txn(ep_pci_exp_txn),
      .pci_exp_txp(ep_pci_exp_txp),
      .pci_exp_rxn(plbv46_pcie_0_TXN_pin),
      .pci_exp_rxp(plbv46_pcie_0_TXP_pin)
 
);
  // END USER CODE (Do not remove this line)

6、打开modelsim,输入以下脚本

cd E:/pcie_edk/EDK/simulation/behavioral

do system_setup.do

c;

do ../bmd_sim/simulate_mti.do

s;

do ../bmd_sim/wave.do

run all

四:仿真结果

这里只贴出DMA写操作的仿真结果

PCIE_DMA实例二:xapp1052的EDK仿真

Ep端DMA发送

PCIE_DMA实例二:xapp1052的EDK仿真

RC端接收

PCIE_DMA实例二:xapp1052的EDK仿真

写入BRAM

五:总结

从搭建系统到最后仿真,工作量还是比较大的。一篇博客很难把每一步都讲得仔仔细细,小编把里面最重要的几个点都给出来了,希望能够帮到有需要的朋友。

对于初学者,可能看了这篇博客觉得不够详细,没法真正理解PCIe DMA的使用,所以小编在最后留下一个支付宝账号【账户:bubble_fish@yeah.net  姓名:俞则人】,10元/份出售以上全部EDK工程文件以及modelsim仿真文件,这样做的目的一是为了激发您学习的动力(花钱买来的东西终究比免费得来的更加珍惜),二是为了赞助我的泡泡鱼团队基金,尊重每一位码农的劳动成果!

✧⁺⸜(●˙▾˙●)⸝⁺✧都看到这了,就劳烦大侠动动你发财的小手点个赞吧!✧⁺⸜(●˙▾˙●)⸝⁺✧

PCIE_DMA实例二:xapp1052的EDK仿真

 文章来源地址https://www.toymoban.com/news/detail-420460.html

到了这里,关于PCIE_DMA实例二:xapp1052的EDK仿真的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • pcie 的bdf 详细介绍,及用法实例、linux 查看pci设备信息命令详解

    PCIe是指PCI Express,是一种计算机总线标准。在PCIe中,每个连接到主板上的设备都有唯一的地址,被称为BDF。 BDF:Bus、Device、Function 的缩写。其中Bus是指PCIe总线编号(一个系统中可能存在多个PCIe总线),Device是指连接到该总线上的某个设备编号,Function是指同一个设备上不同

    2024年02月16日
    浏览(35)
  • Hdmi接口与XAPP460

    之前写过VGA,其实HDMI也写过,但是没记笔记。         HDMI 是新一代的多媒体接口标准,英文全称是 High-Definition Multimedia Interface,即高清多媒体接 口。它能够同时传输视频和音频,简化了设备的接口和连线;同时提供了更高的数据传输带宽,可以传输 无压缩的数字音频

    2024年02月07日
    浏览(29)
  • RT1052的EPWM

    RT1052 具有 4 个 eFlexPWM(eFlexWM1~eFlex_PWM4)。 每个 eFlexPWM 可以产生四路互补 PWM即产生 8 个 PWM,也可以产生相互独立的 PWM 波。四路分别是模块0-3 每个 eFlexPWM 具有各自的故障检电路,当故障发生时根据程序锁定 PWM 输出引脚的电平状态。 PWM_A 与 PWM_B 可以独立输出也可以作为互补对

    2024年02月12日
    浏览(19)
  • PTA 1052 Linked List Sorting

    个人学习记录,代码难免不尽人意。 A linked list consists of a series of structures, which are not necessarily adjacent in memory. We assume that each structure contains an integer key and a Next pointer to the next structure. Now given a linked list, you are supposed to sort the structures according to their key values in increasing order. Inp

    2024年02月15日
    浏览(37)
  • 【UEFI基础】EDK网络框架(ARP)

    从这里开始涉及到的网络协议都是比较通用的了,在一般的TCP/IP四层模型中都能够看到这些内容,不过这里主要介绍的还是其在BIOS下的实现,但是在此之前还是需要先说明ARP的作用。 ARP的全称是 A ddress R esolution P rotocol,它是一种解决地址问题的协议。以目标IP为线索,用来

    2024年01月20日
    浏览(42)
  • Arduino与Proteus仿真实例-简单红外寻迹小车控制仿真

    红外寻迹小车是一种简单的Line Flower Robot(LFR)自主导向机器人,它会随地面上的线来检测白色表面上的暗线或黑色表面上的白线。LRF跟随线,因此,机器人必须检测到线的存在,这样问题就变成了如何在 LFR 中实现线路感应机制。 我们知道,光在白色表面的反射最大,在黑色表

    2024年02月09日
    浏览(35)
  • asp.net1052-酒店管理系统#毕业设计

    项目编号:asp.net1052-酒店管理系统#毕业设计 运行环境:VS+SQL 开发工具:VS2010及以上版本 数据库:SQL2008及以上版本 使用技术:HTML+JS+HTML 开发语言:C#,框架:asp.net   酒店业是一个前景广阔而又竞争激烈的行业。改革开放以来,我国的酒店业迅速发展,已经成为一个具有相当规

    2023年04月08日
    浏览(47)
  • 突破编程_前端_JS编程实例(目录导航)

    目录导航组件旨在提供一个滚动目录导航功能,使得用户可以方便地通过点击目录条目快速定位到对应的内容标题位置,同时也能够随着滚动条的移动动态显示当前位置在目录中的位置: 组件需要能够自动提取网页内容中的所有标题元素(如 h1, h2, h3 等)。 提取的标题需要

    2024年03月20日
    浏览(41)
  • 【UEFI基础】EDK网络框架(TCP4)

    相比UDP4,TCP4是一种面向连接的通信协议,因此有更好的可靠性。 TCP4的首部格式如下: 各个参数说明如下: 字段 长度(bit) 含义 Source Port 16 源端口,标识哪个应用程序发送。 Destination Port 16 目的端口,标识哪个应用程序接收。 Sequence Number 32 序号字段。 TCP链接中传输的数

    2024年01月22日
    浏览(34)
  • 【UEFI基础】EDK网络框架(UDP4)

    UDP的全称是 U ser D atagram P rotocol,它不提供复杂的控制机制,仅利用IP提供面向无连接的通信服务。它将上层应用程序发来的数据在收到的那一刻,立即按照原样发送到网络。 UDP报文格式: 各个参数说明如下: 字段 长度(字节) 描述 Source Port 2 发送端口,标识哪个应用程序

    2024年01月22日
    浏览(37)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包