修改时间 01-28-2021 03:42 PM
工程背景:
Processor: 7020-2; ADC的读写时序和数据处理由PL完成,之后将处理好的数据给到PS;core0:peta-linux; core1: 裸核;核间通信:open-AMP;
我用AXI 作为数据交换总线,PL端封装为AD7606_IP,包含两个AXI接口:AXI_Lite_Slave, AXI_Full_master; lite用于PS下发配置参数,full用于PL数据写到DDR或OCM。block图见附件;
经常出现PS读取到的ADC数据不对,主要在几种情况下出现:
1. 同样的软件,运行在不同的硬件;
2. 同样的代码和xsa,在vitis2019上OK,移植到2020版本,出现异常;
3. 在vitis2019上仿真OK的core1.elf文件,下载到添加了uart IP的bitstream的petaliunx;
这个问题,貌似跟硬件,vitis平台,bitstream都有关系,但又相互矛盾,无法解释;请指出调试方法,谢谢
修改时间 01-28-2021 04:37 PM
"经常出现PS读取到的ADC数据不对"
具体是什么不正确?
“PL侧的数据写到PS”
是写到reserve的DDR位置,然后PS再读取吗?然后PS中读取到的就不正确了吗?cache有没有刷新?
如果不跑openamp的话,也会出现相同现象吗?
修改时间 01-28-2021 05:46 PM
数据不对指:ADC监测到的正弦信号,由于数据不对,导致波形畸形;如图;该数据是PL写到OCM(0xFFFFFF00,写到reserve的DDR 0x36000000,也会出现),每次写4*16字节(16通道,每通道4字节float数据),写完后PL产生中断通知Core1读取出来的;
PS读取之前有调用,Xil_DCacheFlushRange()刷新数据;
不跑openAMP,在vitis里仿真也会出现。
修改时间 01-28-2021 06:43 PM
在波形异常的时候,有用ILA抓取过你axi接口上的时序吗?数据是否都正确写入OCM或者DDR了?axi_full接口的实现是否完全符合AXI标准?
我推测可能PL写入过程中,不能总是独占传输通路,从而引起这样的现象。
你可以尝试将数据不直接写入DDR或者OCM中,而是先写入到一个FIFO中,然后再通过DMA将数据搬到OCM或者DDR中,看看是否还会出现问题。
修改时间 01-29-2021 10:10 AM
路径上不会避开,但是你可以利用fifo的中断,当FIFO中的数据累计到一定深度后,通过DMA一次性传输到DDR或OCM中。
好处是这样大数据量传输一是降低了对总线占用的频次,二是采用DMA方式,不用担心总线占用仲裁之类的处理,能保证数据完整性。
参考设计你可以参考以下链接:
https://www.xilinx.com/support/answers/57550.html
https://www.xilinx.com/support/answers/57562.html