为了彻底弄清AXI读写时序,以及以后更好的使用DDR3 IP,会对demo结构进行彻底改造。
-
使用demo程序进行仿真,弄清程序结构,AXI读写基本时序
-
将产生AXI信号的
mig_7series_v1_9_axi4_tg
模块转移到顶层tb -
按照自己理解重写AXI操作模块
-
使用sv文件重写testbench
位宽 = 写数据宽度/8,每位代表一个字节
为1时,数据写入
AWLEN,表示一次突发写事务中传输的单位个数
![pic][1]
AWSIZE,表示每个单位数据长度
![pic][2]
![pic][3]
demo里,awlen = 2,awsize = 6
根据上表可知,每次突发写3个单位,每个单位有64字节(512bit)
-
可以在
awvalid
有效的时候改变写配置选项 -
master写好地址和ID后,发送arvalid信号,等待arready, 然后发送rready,在rready和rvalid同时有效期间出数据
-
wid和rid可以不一致。例如:wid = 1, rid = 2,只要操作地址一致,就可以正确读出数据
-
读写地址
设 地址增量为 I(axi写数据通道位宽/8)
读写地址均为ddr3 memory中以byte为单位的地址。设置的写入地址最好为'h40的整数倍
例如:写数据端口位宽为512bit,awlen = 2,awaddr = 0,则写入数据的地址分别为'h00,'h40,'h80
读地址增量同理。
当写地址不是 I 的整数倍时,实际写取数据的地址为:(raddr/'h40)*
'h40
当读地址不是 I 的整数倍时,实际读取数据的地址为:(raddr/'h40)*
'h40
# awid: 1, awaddr:0x00000000, awlen: 2, awsize:6, wdata:0xfffffffffffffffffffffee47dadc
# awid: 1, awaddr:0x00000000, awlen: 2, awsize:6, wdata:0xfffffffffffffffffffffbaa68e75
# awid: 1, awaddr:0x00000000, awlen: 2, awsize:6, wdata:0xffffffffffffffffffffff5984aeb
# arid: 1, araddr:0x00000020, arlen: 2, arsize:6, rdata:0xfffffffffffffffffffffee47dadc
# arid: 1, araddr:0x00000020, arlen: 2, arsize:6, rdata:0xfffffffffffffffffffffbaa68e75
# arid: 1, araddr:0x00000020, arlen: 2, arsize:6, rdata:0xffffffffffffffffffffff5984aeb
# arid: 1, araddr:0x00000040, arlen: 2, arsize:6, rdata:0xfffffffffffffffffffffbaa68e75
# arid: 1, araddr:0x00000040, arlen: 2, arsize:6, rdata:0xffffffffffffffffffffff5984aeb
# arid: 1, araddr:0x00000040, arlen: 2, arsize:6, rdata:0x1111111111111bbbbbbbbbbbbbbbb
# arid: 2, araddr:0x00000060, arlen: 2, arsize:6, rdata:0xfffffffffffffffffffffbaa68e75
# arid: 2, araddr:0x00000060, arlen: 2, arsize:6, rdata:0xffffffffffffffffffffff5984aeb
# arid: 2, araddr:0x00000060, arlen: 2, arsize:6, rdata:0x1111111111111bbbbbbbbbbbbbbbb
# arid: 1, araddr:0x00000080, arlen: 2, arsize:6, rdata:0xffffffffffffffffffffff5984aeb
# arid: 1, araddr:0x00000080, arlen: 2, arsize:6, rdata:0x1111111111111bbbbbbbbbbbbbbbb
# arid: 1, araddr:0x00000080, arlen: 2, arsize:6, rdata:0x112a4e737ea01e08112a4e737ea01
# arid: 2, araddr:0x000000a0, arlen: 2, arsize:6, rdata:0xffffffffffffffffffffff5984aeb
# arid: 2, araddr:0x000000a0, arlen: 2, arsize:6, rdata:0x1111111111111bbbbbbbbbbbbbbbb
# arid: 2, araddr:0x000000a0, arlen: 2, arsize:6, rdata:0x3cf43e61de915ef63cf43e61de915
# arid: 1, araddr:0x000000c0, arlen: 2, arsize:6, rdata:0x1111111111111bbbbbbbbbbbbbbbb
# arid: 1, araddr:0x000000c0, arlen: 2, arsize:6, rdata:0x65f9b314c56cb84365f9b314c56cb
# arid: 1, araddr:0x000000c0, arlen: 2, arsize:6, rdata:0x65f9b314c56cb84365f9b314c56cb
主要针对example_top.v,这个模块里调用DDR3 IP
- sys_clk_p, sys_clk_n, 输入400MHz差分时钟,
- clk_ref_p, clk_ref_n, 输入200MHz差分时钟,
- sys_rst, 低电平复位
- demo里驱动模块主频100MHz
-
axi接口
-
ddr3 IP输出的用户时钟和复位