生成AXI外设IP时,可以选择AXIS,就是STREAM接口了。
STREAM接口,类似于FIFO。
AXIS_MASTER,负责控制内部STREAMBUFFER的ReadPointer(RP)和WritePointer(WP),所以,AXIS上,不需要使用地址。
对于AXIS_Slave,利用ready来相应,也就是告知master,当前数据已经被取走。
对于AXIS_Master,利用valid&ready来修改RP,从而让下一个数据被送上接口,更新数据。
DataMover这个IP,是用来进行DDR和PL之间传输高速数据的常用IP,这个IP底层控制了AXI_HP核,包装成DM。
基于DM,还有二次包装的特定的IP,例如DMA,CDMA,VDMA。
DM在DDR和PL之间传输数据,有两个方向,S2MM和MM2S。即stream to mapped memory ,mapped memory to stream。
stream接口就是PL侧使用的AXIS了。
以MM2S的DM为例,来看看它需要哪些接口。
数据平面上,(data plane)
左侧,需要一个AXI FULL MASTER,它用来从AXIBUS上获取数据,这些数据地址是Mapped Memory,通常是DDRC空间内的DDR内存。
右侧,需要一个AXI STREAM MASTER,它用来将AXIBUS上获取的数据,组织成STREAM,并向PL侧的下游逻辑模块发送出去。
控制平面上,(control plane)
左侧不需要控制接口,因为AXI FULL MASTER已经完成了控制。
右侧,需要一个AXI STREAM SLAVE,它用来接收PL侧的逻辑模块发出的command,由于是STREAM,所以command是FIFO序列化的。还需要一个AXI STREAM MASTER,它用来向PL侧的逻辑模块发送DM的status,由于是STREAM,所以status是FIFO序列化的。
我们可以看到,DM从DDR里面取数据,是不需要PS参与的,PS并没有参与数据平面的传输和控制。DM中的AXI FULL MASTER完全控制AXIBUS的读写时机。DM中的控制逻辑,会根据AXIS_MASTER的空满状态,来发起AXI_FULL_MASTER的读写。
PL可以自行编写逻辑模块来控制位于控制平面上的两个AXIS,但是通常是PS来进行控制,所以,通常会使用一个转换模块,将两个AXIS接口转换成AXI_LITE的基于reg的传输。这样,PS通过读写AXI_LITE的reg的方式,而转换模块将reg转换成两个AXIS的时序接口。可以命名为cmd_status_transformer。
为了能够在两个AXIS之间跨时钟域,我们需要AXI_STREAM_DATA_FIFO这个IP,用它来进行跨时钟域处理。
两侧都是AXIS接口,但是两侧可以用不同的AXIS_ACLK。
我们可以用DM来完成VGA的framebuffer的操作。
将framebuffer放在DDR内,不用占用BRAM。PS侧向cmd_status_transformer写入command后,由cmd_status_transformer负责控制command的连续发送,这样,DM不断接收到从DDR中读取framebuffer的命令,并将数据以STREAM的形式向PL侧输出。
这样,PL侧很容易控制VGA时序。在读取了AXIS接口上的valid数据后,只要拉一下ready,就可以让STREAM更新下一个valid数据。
如果是S2MM,和MM2S唯一的区别是,在数据平面上(data plane),变成了一个AXIS_SLAVE接口,从而使得PL侧的其他逻辑模块,可以向这个AXIS_SLAVE接口发数据。
控制平面上,最需要关注的,就是CMD命令字。它是一个(N+40)宽度的比bits_vector。ZYNQ里,N为32,所以CMD有72bit。
首先回顾一下几个概念。
在DM的命名空间中,对数据有几个划分。frame,segment,burst。
burst对应于AXI总线行为,segment对应于CMD行为。frame对应于事务行为。
多个burst构成一个segment。多个segment构成一个frame。
这就涉及到EOF和TLAST的配合使用问题。
TLAST是STREAM里用来指示一个frame的最后一个word的。它的作用是用来进行数据流分界。
对于MM2S而言,TLAST是由DM来控制并发送给其他逻辑模块的,DM会在标记了EOF的CMD,传输的segment的最后一个burst的最后一个word,输出TLAST。
我们可以在MM2S的应用中,放心的使用TLAST。因为这是DM负责控制的。
对于S2MM而言,TLAST是由其他逻辑模块控制的,EOF往往是由PS控制的,这时候要特别小心EOF和TLAST的配合问题。
DM在内部,会维护trans_counter,用来统计已经成功传输的字节数。在S2MM接口上,DM使用READY来响应,并提示SOURCE更新VALID数据。DM会在segment传输完成后,复位计数器。
DM利用TLAST来监测传输状态,利用CMD和trans_counter来判断传输状态,并报告ERROR。
当TLAST有效时,DM会判断CMD和trans_counter。
如果当前CMD没有标记EOF,那么说明TLAST提前到来了,报告错误。
如果当前CMD标记了EOF,而trans_counter小于SEG_LEN,说明TLAST提前到来了,报告错误。
如果如果当前CMD标记了EOF,而trans_counter等于(SEG_LEN-1),DM会产生expect_tlast,并在trans_counter等于SEG_LEN时,与expect_tlast相与。
如果expect_tlast和TLAST相与为1,说明TLAST正确到来,报告正确。
如果expect_tlast和TLAST相与为0,说明TLAST没有来,报告错误。
如果S2MM报告了ERROR,那么只能通过复位S2MM,才能在S2MM恢复正常后,进行后续操作。
所以要慎用TLAST。
通常是不使用TLAST的,那么CMD中的EOF也是一直设置为0。在不使用EOF和TLAST时,DM在每个segment传输完成后,会报告状态。由于没有使用TLAST,所以不会出现ERROR。这是比较安全的。