Skip to content

将mcdma例程从7ev移植到7020上 内存地址需改小,适配7020。7020的ddr最大到3FFFFFFF

通道开启数量:4

DDR收发内存的默认值

起始收发数据是从0xc开始

Sendpacket里从c开始传到结束

收发寄存器的数据一致

手动创建4个模拟信号发生ip核 添加ila,AXIS格式的数据要更改成相应的ila接口

接下来需要验证从4个信号源发送的数据是否通过mcdma存到了DDR相应内存中

4个信号源的数据是128个F然后发送递减数据

sendpacket在此验证中可注释掉。不需要进行数据回环 数据源-->stream-->S2MM MM2S-->ila

sendpaket的功能是什么

  1. PS 自己造一段测试数据
  2. 给 MCDMA 填写发送任务单(BD)
  3. 启动 MCDMA 把数据从内存发到 AXI4-Stream 接口

直接注释掉sendpacket这条语句。停止造数,数据从外部模拟信号源输入 只收不发,所以发送通道初始化也注释掉 删掉头文件关于发送的函数原型,以及对应代码 注释无用变量

程序卡在这个地方,需要100个10BD的数据包程序才会跳出循环 此时memory一直没有变化,说明模拟造数的数据并没有传到mcdma中

观察到7020未烧录bit程序

确保fpga程序 正常烧录 模拟信号发生模块是128个F递减数据传输

ddr内存未改变,写入失败??

一、核心问题:

字数
1857 字
阅读时间
8 分钟

移植4个模拟信号源时手动搭建,复制粘贴,导致四个AXIS_tdes信号一样,没法区分通道id。

解决方法:将tdes改成不一样的id号

二、问题跟踪

2.1 怀疑是mcdma无法区分通道id

2.2实际区分通道id是通过AXIS_tdes

修改bd,用ila监测switch的4个输入和1个输出。 更新platform,跑程序抓数

datagen的位宽是128,switch的输入位宽是512,有何影响

为什么前端输入4个512位的data,且tvalid是4位

,此方法可暂时解决。先上电,再打开电脑打开软件。

tx配置后,0x03100000清零

rx配置后寄存器未变化,且卡在while1中,暂停过后程序进入异常中断

继续打 断点测试,看rx配置函数是否异常

再rxsetup内部打断点,发现chanid是1的时候可以完成一次for循环,

,在Status = SetupIntrSystem(&Intc, McDmaInstPtr, ChanIntr_Id(Rx_Chan, ChanId),这个位置程序进入异常中断。

chanid是1的时候是能够完整跑完一遍for循环的。chanid是2的时候会在XMcdma_IntrEnable(Rx_Chan, XMCDMA_IRQ_ALL_MASK);这个地方跑进异常中断

程序实在chanid=2的时候,打开 MCDMA 接收中断的总开关XMcdma_IntrEnable(Rx_Chan, XMCDMA_IRQ_ALL_MASK);的过程中进入异常中断的 确认 XMDMA 的中断是否成功注册

怀疑是chanid=2的rx_chan的地址不合法?(定位结果:是校验出了问题) 打印出自中断函数DoneHandler(void * CallBackRef, u32 Chan_id)

chanid=2的的时候好像完整跑完了程序,第三次for循环的时候chanid=N/A了 所以问题有可能是chanid=2时出现的,也有可能是chanid=2运行完成以后chanid=N/A的时候出现的

这里有个data校验,而这个data校验是用于收发循环例程的校验代码 那个例程里是从0xc开始递增造数发出。收通道校验是否是从0xc开始的递增数据。 而目前代码的接收端是接在模拟源上的,不需要校验,注释掉这段校验代码防止异常中断发生

问题,为什么chanid=1的时候校验没出问题,但是chanid=2的时候校验却出问题了呢

中断函数的这个地方不断增加,i增加,bd递增,达到1000bd以后

0123探针ila口接4路信号源,4号探针接switch出口,验证信号源是正确的

为什么tlast后面还有两个数据???

为什么ila没有抓到tdest的值?

两个数据源切换,switch取datagen3前部分和datagen0后部分拼成一个,这样是否可行,是不是数据传输时候要带着tdest来区分通道编号,那为什么ila又看不到tdest的值?

修改bd数量 bd改小以后收到数据了

一个bd是64字节 100个bd是6400字节 单通道BD占用 = 100×64 = 6400 字节 = 0x1900 单通道数据缓冲区 = 10包×1024字节 = 10240 字节 = 0x2800 4个通道100个bd

找到rx通道起点,算出ddr对于4个收通道的地址分配

通道号数据起始地址结束地址核心作用
通道 10x060000000x060027FF通道 1 所有 AXIS 数据存在这
通道 20x060028000x06004FFF通道 2 所有 AXIS 数据存在这
通道 30x060050000x060077FF通道 3 所有 AXIS 数据存在这
通道 40x060078000x06009FFF通道 4 所有 AXIS 数据存在这

信号源造数规则:

通道号规则步进
通道1递减1
通道2递减5
通道3递增1
通道4递增5
接收数据情况:134通道收到数据,2通道未收到
看ddr内存情况是所有的数据都是递减且步进1

地址分配规则:

DMA必须要求64字节对齐,偏移地址可能破坏对齐 DDR起始地址0x00000000 避开前16m:0x00000000 ~ 0x01000000 放 FSBL / 启动文件,禁止占用 必须 64 字节对齐 TX/RX 的 BD/Buffer 必须完全独立,间隔越大越安全

配置通道1的时候的指针:起始地址

这个for循环功能: 批量分配数据缓存空间 + 向 MCDMA 硬件提交 BD 描述符,告诉硬件:收到数据后往哪里存、存多大。

chanid=1的时候,执行完上述循环,缓存空间的指针已经溢出很大了

感觉地址分配有问题。增大地址的空间 出现报错

问题原因:

Mcdma访问不到那个地方 再改成这个,改小点 无效果

新思路: 所以等配置完4通道以后统一打开通道

贡献者

The avatar of contributor named as dz13718198068 dz13718198068

文件历史

撰写