AXI协议
一个贼有用的链接
http://www.cnblogs.com/lkiller/p/4773235.html关于AXI4代码的一些认知(真的比CSDN好用,小声BB)
写操作。
首先,在设计时需要确定突发长度,AWLEN[7:0]决定写传输的突发长度。
AXI4突发类型[AxBURST]来决定
INCR :增量突发,突发长度为1~256,传输过程中,地址递增。增量取决于Axsize的值
WRAP:回环突发,和增量突发类似,但会在特定高地址的边界处回到低地址处。回环突发的长度只能是2,4,8,16次传输,传输首地址和每次传输的大小对齐。最低的地址整个传输的数据大小对齐。回环边界等于(AxSIZE*AxLEN)。
(AWLEN[7:0]=wlen,AWSIZE=110,AWBURST=01)
Address_N = Aligned_Address + (N-1) x Number_Bytes
WSTRB[n:0]对应于对应的写字节,WSTRB[n]对应WDATA[8n+7:8n]。WVALID为低时,WSTRB可以为任意值,WVALID为高时,WSTRB为高的字节线必须指示有效的数据。(因为传输的位宽为64bit,每个字节都有效,WSTRB=8‘hff)
AWPORT(000正常、安全、数据存取)、AWLOCK(0正常,不支持独占)、AWCACHE(0011,bufferable&cacheable)这三个信号主要是安全级别的,不是很懂慢慢再看
为了预防READY信号和VALID信号之间发生锁死的情况,需要遵守两个原则:
1)一个通道中的VALID信号绝对不能依存于其它通道中的READY信号。即,一个通道拉起VALID信号的唯一原因只能是该通道需要发起数据传输,而不看其它通道有没有完成数据传输。
2)一个通道中,READY信号可以等到VALID信号拉起后再根据自身状况适时拉起。言外之意是,READY信号提前拉起来也可以,只要宿设备已经能够随时接收源设备的数据
1)写地址通道:主设备只有在发送地址和控制信号时,才可以拉起AWVALID信号,只有当从设备拉起AWREADY信号后,主设备才可以更新地址和控制信号;如果地址和控制信号发送结束了,主设备在得到从设备的最后一个AWREADY信号时,才可以将AWREADY信号拉低。如果得不到从设备的AWREADY,主设备就必须保持AWVALID和地址等信号不变。
读地址通道除去那几个自定义的信号,那就是只剩下四个信号需要控制啦,其中一个包括从设备的AWREADY输入信号和三个输出信号:AWVALID、AWLEN、AWADDR。
协议设定时,首先是要更新地址和突发大小的更新(地址来自PS端,信号trans_addr来确定。传输大小也是PS端传输的,信号trans_len来决定如果trans_len大于255的话呢,就先传255,如果学校与255呢,就传输trans_len-1)
因为一个BURST能传输的最大的数据量是256*8byte,对应的么一个BURST的补偿地址是2^8*2^3。
这时,问题来了。怎么判断一个BURST传输完成了,以及只剩最后一个BURST了。(只剩最后一个BURSET的话,就是补偿地址的高位(大于11)和需要传输的数据数的高位(大于8)相等,那就是说,需要传书的数据只需要一个BURST就可以完成了),如果低位相等的话,则说明一个BURST传输完成 。如果BURST传输完成了,就传数据。最后一次传输完成了就传输新的地址。
传输地址的状态机来判断AWVALID信号什么时候为高。首先,只有主设备发送地址和控制信号时,AWVALID才会变高(设计为当FIFO中的数大于一个BURST的数据量时)。
awready信号和wready信号可以默认为高,这样就可以少断言一次
从设备控制的用于发送写响应信号的BVALID信号必须要等到从设备接收了写数据之后才可以拉起。只有写数据操作完成了,从设备才可以向主设备发送响应信号。
来一段代码:(算了)
2)写数据通道:主设备和从设备在写数据通道的握手方式和写地址通道相同。
这个通道就主要是:WDATA(rdata)、WLAST、WVALID(fifo数据有效)、WREADY,WSTRB
当wvalid和wready信号都为高时,传输数据有效
设计两个计数器,在传输信号开始后,wvalid和wready信号都相等时,分别用来计算本burst传输的数据次数以及一共传输的数据数。还是需要在最后一次burst传输时,判断最后一次出传输的数据量。wlast表示一个burst的最后一次传输。
3)写响应通道:与写地址通道、写数据通道不同的是,在写响应通道中,BVALID信号的控制者是从设备,BREADY信号的控制者是主设备。
还有一个BRESP信号,由从机控制。表明写事物的状态。
TOP文件就是把AXI端口的信号和FIFO相对应的信号进行一个链接,以及设计写入数据的地址。这个以后再写好了。(设计的这个模块FIFO是主,DDR是从设备)
4)读地址通道:主设备和从设备在读地址通道的握手方式和写地址通道相同。
ARVALID信号不依存于任何信号,只要主设备要读数据,就可以拉起ARVALID信号,将地址和控制信号送上读地址通道;从设备控制的ARREADY信号可以先于ARVALID或后于ARVALID信号拉起;而从设备控制的RVALID信号必须等ARVALID和ARREADY都拉起来后,即从设备已经得到了主设备发来的地址及控制信号,然后从设备就可以去相应的地址将数据读出来,并放上读数据通道,同时可以拉起RVALID信号;而主设备控制的RREADY既可以看RVALID的情况拉起,也可以自行适时拉起。
读地址通道需要控制的信号:ARLEN,ARVALID,ARADDR(trans_addr)ARREADY(从设备控制)
首先,依旧是地址的更新和传输大小的控制
然后是一个传输地址的状态机,当接收到trans_start信号之后就开始写FIFO状态,如果FIFO不满,就拉高ARVALID,传输地址,传输之后再看传输进行到哪一步了,如果没传完就进入等待状态,如果传完了,就回到初始状态。
5)读数据通道:ARVALID的控制者是从设备,ARREADY的控制者是主设备。
RDATA,RRESP,RLAST,RVALID和rready(FIFO不为空就拉高,最后一个传输了就拉低)
好像没啥可写的了哇。。。。就,先这样吧。