输入输出接口均为AXIS接口的数据缓存器,和其他fifo一样是先进先出形式。
上图中是FIFO的13.0版本的IP核的设置页面,各个引脚的功能说明如下:
输入引脚:
S_axis_tdata[7:0]
:数据输入端
S_axis_tlast:数据末尾标志端,在SLAVE的写入数据时在数据最后一个和数据倒数第二个的时候将s_axis_tlast拉高。然后打开MASTER接口将STREAM FIFO内部的数据读出。从MASTER接口的数据流可以看出,将数据最后一个和数据倒数第二个读出的同时也会将m_axis_tlast信号拉高。
S_axis_tvalid:数据有效标志端,将s_axis_tvalid信号置高,在下个时钟上升沿,STREAM FIFO便开始收数
M_aclk:读取数据时钟
S_aclk:写入数据时钟
S_aresetn:复位,低电平有效;当复位信号拉高后的第三个时钟上升沿s_axis_tready信号会自动拉高,该fifo处于等待接收数据状态。
M_axis_tready:当FIFO的后端将m_axis_tready拉高时,MASTER接口便会将数据送出去。输出引脚:
M_axis_tdata[7:0]
:数据输出端;
M_axis_tlast:输出数据末尾标记端;
M_axis_tvalid:当STREAM FIFO接收到数据并传到MASTER接口上时,m_axis_tvalid便会拉高,由于使用的STREAM FIFO为异步时钟模式,数据写入时钟比数据读出时钟要快,而读数据计数器的刷新是在读数据时钟的上升沿,所以可以从仿真图中看到读数据计数器的值是跳跃上升的。
S_axis_tready:当STREAM FIFO的前端有数据需要发送时,在s_axis_tready为高时将s_axis_tvalid信号置高,在下个时钟上升沿,STREAM FIFO便开始收数。接收进最后一个数据的同时,s_axis_tready将会变为低,告诉前级fifo已满,不能再收数据了。
Axis_wr_data_count[4:0]:写数据计数器
Asis_rd_data_count[4:0]:读数据计数器
Axis_prog_full:
Axis_prog_empty:根据上文端口引脚描述就能够看懂这副仿真图片,在这里做个记录,以便以后回头查看,也供大家翻阅参考。更多具体的细节可以去看官方英文文档pg085-axi4stream-infrastructure.pdf。可以在NODC软件中搜索到的。
2018年10月10号修改:添加关于仿真的一些细节
为了仿真,写了一个TEST_BT文件,代码内容如下:
`timescale 1ns / 1ps ////////////////////////////////////////////////////////////////////////////////// // Company: // Engineer: // // Create Date: 2018/07/16 11:22:11 // Design Name: // Module Name: FIFO_TB // Project Name: // Target Devices: // Tool Versions: // Description: // // Dependencies: // // Revision: // Revision 0.01 – File Created // Additional Comments: // ////////////////////////////////////////////////////////////////////////////////// module FIFO_TB; reg r_clk,w_clk,rest,m_axis_ready,s_axis_valid; reg [7:0] din; wire empty,full,s_axis_ready,m_axis_valid; wire [4:0] rd_data_count; wire [4:0] wr_data_count; wire [7:0] out; initial begin r_clk = 0; w_clk = 0; rest = 0; m_axis_ready = 0; s_axis_valid = 0; din = 8b0; end initial begin #5 rest = 1; din = 8b0001_1000; s_axis_valid = 1; repeat(8) #5 w_clk = ~w_clk; #10; din = 8b0011_0000; #10 repeat(8) #5 w_clk = ~w_clk; din = 8b0011_1000; #10 repeat(8) #5 w_clk = ~w_clk; din = 8b0011_1100; #10 repeat(16) #5 w_clk = ~w_clk; m_axis_ready = 1; #10 repeat(32) #5 r_clk = ~r_clk; end fifo_test fifo_test_1( .r_clk(r_clk), .w_clk(w_clk), .rest(rest), .m_axis_ready(m_axis_ready), .m_axis_valid(m_axis_valid), .s_axis_valid(s_axis_valid), .s_axis_ready(s_axis_ready), .din(din), .empty(empty), .full(full), .rd_data_count(rd_data_count), .wr_data_count(wr_data_count), .out(out) ); reg a,b,start,s; wire mux_out; initial begin a=0; b=0; start=0; s=0; end initial begin #10 b = 1; #10 s = 1; #10 s = 0; #10 s = 1; #10 s = 0; #10 start = 1; #10 s = 1; #10 s = 0; #10 s = 1; #10 s=~s; end mux21_0 mux21( .ap_start(start), .sig_a(a), .sig_b(b), .select_r(s), .ap_return(mux_out) ); endmodule以上就是测试仿真用的代码源文件。接下来分析一下仿真结果:
写入时序的分析先贴仿真时序图:
我设置了din[7:0]的数据为18,30,38,然后当将s_axis_valid和s_axis_ready都制高电平(即有效)时,w_clk时钟上升沿来时,就开始向FIFO中写数据。这里注意到当写有效之后,需要两个时钟脉冲之后输出已经写入的个数才会更新。有意思的是,这两个数据都是18。
读取时序的分析
先贴仿真时序图:
在写入了一定的数据之后,我将激励信号进行了调整,这是吧m_axis_ready置高,m_axis_vaild因为里面已经有数据了,IP核会自动置高。当两者都为高,当读时钟r_clk的上升沿来时,就会开始读取数据。可以看到先读出来的数据是最先写进去的18,然后里面还有多少个数也会从端口rd_data_count输出显示。
免责声明:文章内容来自互联网,本站不对其真实性负责,也不承担任何法律责任,如有侵权等情况,请与本站联系删除。
转载请注明出处:AXI4 STREAM DATA FIFOS的IP核使用说明 https://www.yhzz.com.cn/a/19756.html