1、ILA使用方法
在Block Design中右键点击想要在ILA中查看波形的信号,选择Debug,然后点击窗口上方出现的Run Connection Automation,之后会在Block Design中自动添加一个ILA Core,然后该信号线将连接到上面的一个Probe上。
需要注意的是,ILA的Probe位宽与这一信号位宽不匹配,所以需要双击ILA Core,然后在弹出窗口中修改这一位宽。
2、AXI地址对齐问题
根据AXI总线的4K地址对齐问题中的描述:
AXI 协议支持地址非对齐的传输,允许突发传输的首字节地址,即起始地址与突发传输位宽不对齐。举个例子,总线位宽为 32bit 时,如果起始地址为 0x1002 ,则产生了非对齐现象。与 32bit 位宽总线对齐的地址需要能被 4 整除,即 ADDR[1:0] = 2'b0。
对于非对齐写传输,主机会进行两项操作:
(1)、即使起始地址非对齐,也保证所有传输是对齐的
(2)、在首个 transfer 中增加填充数据,将首次传输填充至对齐,填充数据使用WSTRB 信号标记为无效
(此处需要说明TKEEP和TSTRB了,在写传输中,对于填充数据字节,TKEEP对应的位1,对应的WSTRB为0,表示该字节数据无效,仅用于数据填充,实现地址对齐)。
在本设计中出现了非对齐的起始地址问题,这是由于DDR中数据无法使用实现写好的文件进行初始化,我只能使用一个非常大的数组(data[6200065][8])来存放DDR中所需要的数据。而数组在定义时无法规定其起始地址,并且如果使用指针先定义数组首地址再赋值数组,也无法进行数组的直接批量初始化赋值。
所以最开始时DDR中数据都是直接拿到data数组的首地址,例如0x10e056,然后写入硬件中让硬件直接从这里取数据。从软件角度上来说,这并没有太大问题,data数组将存放在运行程序的数据段中,由于本硬件对DDR有完全访问权限,应该是可以取到这些数据的。
但是对于硬件上的AXI-master接口来说,这就有很大问题。由于AXI接口IP和ZYNQ系统接口限制,需要在AXI-master访问时提供字对齐的地址。也就是说,对于ZYNQ系统的DDR,其字大小为32bit,所以AXI-master在访问DDR取数据时发送的地址需要最低两位位保持为0,原因就是上述文章中提到的内容。否则的话取到的数据将可能不满足系统所需的要的形式,导致数据错位等问题。
3、DDR数组数据起始地址问题
在上述AXI-master地址对齐问题下,需要将DDR中的数据确定到一个对齐的位置,保证AXI-master读到正确排布的数据。
由于找不到Xilinx相关DDR数据初始化的教程(找到一个但是使用上有问题),我还是使用了数组形式在DDR中写入数据,然后用PS将数据搬运到对齐地址位置(搬到了0x20000000,DDR地址0x01000000~0x3FFFFFFF,数据量0x0BD36000),等搬完数据再给硬件信号从对齐地址取出数据,这一方法可行。
4、Reset信号高/低有效
本系统中Reset信号为高有效,AXI上的复位则是低有效,如果直接接上AXI的复位那就直接什么都跑不出来,一直是复位状态。
5、BRAM与ARM SRAM控制信号ENA/WEA高/低有效区别
BRAM波形在我前面的文章中有提到,我当时没有仔细看,结果就出问题了,很明显两者时序基本一致,但是重要的一点是ARM SRAM的ENA和WEA信号都是低有效的,而BRAM则是高有效,正好和复位反着,我在替换IP原语时直接用了之前ARM接口信号表述,这样直接导致RAM中取不到写不进数据。