广告

原创 32位存储器写任务

2019-8-15 11:16 738 5 5 分类: FPGA/CPLD 文集: Xilinx PCIe仿真模型
完成剩下的DS端口模型任务函数学习,本文来看看存储32bit写,首先复习下32-bit地址存储器写TLP的头部格式,如下图所示:

图1:32位地址存储器写TLP头部格式
接下来我们来看DS端口模型里是如何使用这个函数的,在启动DMA操作之前都需要对DMA进行复位,这时候需要Host使用存储写操作往设备控制状态寄存器使能复位,具体实现代码如下(下述代码先写1启动复位,再写0,释放复位):
  1. DATA_STORE[0] = 8'h01; //reset
  2. DATA_STORE[1] = 8'h00;
  3. DATA_STORE[2] = 8'h08; //data width path
  4. DATA_STORE[3] = 8'h14; //fpga family
  5. TSK_TX_MEMORY_WRITE_32(DEFAULT_TAG,DEFAULT_TC, 10'd1,BAR_INIT_P_BAR[0][31:0]+8'h00, 4'h0, 4'hF, 1'b0);
  6. TSK_TX_CLK_EAT(10);
  7. DEFAULT_TAG = DEFAULT_TAG + 1;
  8. DATA_STORE[0] = 8'h00; //reset
  9. TSK_TX_MEMORY_WRITE_32(DEFAULT_TAG,DEFAULT_TC, 10'd1,BAR_INIT_P_BAR[0][31:0]+8'h00, 4'h0, 4'hF, 1'b0);
  10. TSK_TX_CLK_EAT(10);
  11. DEFAULT_TAG = DEFAULT_TAG + 1;
至于BMD各个设计描述寄存器请查阅xapp1052文档,这里给出各个寄存器地址的截图:

图2:BMD设计描述寄存器地址

:很重要,对于初学者来说,理解PCIe应用里各种地址有点困难。图2中寄存器地址是FPGA逻辑为DMA操作定义的寄存器,DMA引擎依据这些寄存器来采取对应的操作,这些寄存器可以通过存储器读写来进行访问。而配置寄存器则是与PCIe核相关,这些寄存器的相对地址和这里的寄存器地址甚至名称都可能一样,但是完全不是一个概念,配置寄存器只能通过Type0/1配置寄存器读写程序访问,且一般是驱动程序发起,电脑上电时BIOS也会发起。)

个人理解,上述寄存器用户可以随意定义,前提是要知会驱动程序以及软件设计人员,上中下层级协调一致即可。当然,对应FPGA设计者来说如果是基于BMD的设计,没有必要从头再来另搞一套,除非用户自己设计自己的DMA控制器。


下面来分析TSK_TX_MEMORY_WRITE_32这个函数,下图对函数输入参数进行了简单说明

对应前面调用该函数时,可以看到,写数据长度是1,即一个DW数据。

LastDW BE和First DW BE这两个字段的使用规则如下。

  • 如果传送的数据长度在一个对界的双字(DW)之内,则Last DW BE字段为0b0000,而First DW BE的对应位置1;如果数据长度超过1DW,Last DW BE字段一定不能为0b0000。PCIe总线使用LastDW BE字段为0b0000表示所传送的数据在一个对界的DW之内。

  •  如果传送的数据长度超过1DW,则First DW BE字段至少有一个位使能。不能出现First DW BE为0b0000的情况。

  • 如果传送的数据长度大于等于3DW,则在First DW BE和Last DW BE字段中不能出现不连续的置1位。

  •  如果传送的数据长度在1DW之内时,在First DW BE字段中允许有不连续的置1位。此时PCIe总线允许在TLP中传送1个DW的第1,3字节或者第0,2字节。

  • 如果传送的数据长度为2DW之内时,则First DW BE字段和Last DW BE字段允许有不连续的置1位
根据以上规则,在发起BDM的DMA操作的时候,多次用该函数,而每次仅对一个寄存器进行写,故只有1个DW数据,所以Last DW BE字段为0b0000,而First DW BE的对应位置1。此外,函数的地址参数是BAR的基地址+对应寄存器地址(即偏移地址,图2中各个寄存器地址)。

作者: coyoo, 来源:面包板社区

链接: https://www.mianbaoban.cn/blog/uid-me-1010859.html

版权声明:本文为博主原创,未经本人允许,禁止转载!

广告

文章评论 0条评论)

登录后参与讨论
相关推荐阅读
coyoo 2019-08-26 17:48
对应Xilinx的PCIe DMA写操作仿真问题的解决
问题描述:EP端发起了DMA写,但是RP侧并未收到DMA写的TLP,但是收到了写完成的中断TLP。参考了Xilinx官网论坛这个帖子,解决了这个问题:https://forums.xilinx.com...
coyoo 2019-08-14 16:05
在ModelSim里添加带路径的文件
最近在仿真Xilinx的PCIe,用的是其xapp1052下的参考工程,这个工程基于vivado,默认使用vivado自带的仿真器,如果转换成ModelSim的话,vivado会后台自动生成一系列脚本...
coyoo 2019-08-14 12:20
如何理解Xilinx的BMD?
BM是Bus Master的缩写,其中D是DMA。xapp1052讲使用PCIe的系统中通常有两种硬件实现的DMA,一种是系统DMA(System DMA),另外一种是总线主机DMA。系统DMA通常是...
coyoo 2019-08-14 11:35
如何获取PCIe BAR
从网上找到一段话:“pc上电初始化的时候,BIOS接管pc的初始化工作,分配管理内存,分配管理io空间,所以开始会扫描主板上的pci设备,并且为扫描到的pci设备分配对应的内存或者io,分配完毕之后,...
coyoo 2019-08-08 15:19
创建PCIe空间映射子函数
BAR初始化第一步,即BAR_SCAN子函数了解完了,下面我们了解初始化第二步,即TSK_BUILD_PCIE_MAP函数。再次复习下BAR初始化步骤(在TSK_BAT_INIT任务里面其实是在模拟B...
我要评论
0
5
广告