AXI4 STREAM DATA FIFOS的IP核使用说明
AXI4 STREAM DATA FIFOS的IP核使用说明
输入输出接口均为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 = 8'b0; end initial begin #5 rest = 1; din = 8'b0001_1000; s_axis_valid = 1; repeat(8) #5 w_clk = ~w_clk; #10; din = 8'b0011_0000; #10 repeat(8) #5 w_clk = ~w_clk; din = 8'b0011_1000; #10 repeat(8) #5 w_clk = ~w_clk; din = 8'b0011_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输出显示。
- 分享
- 举报

-
浏览量:828次2020-06-19 15:56:33
-
浏览量:636次2018-04-12 11:32:51
-
浏览量:881次2017-11-16 11:30:55
-
浏览量:481次2020-05-14 17:30:06
-
浏览量:439次2019-10-18 09:46:53
-
浏览量:927次2017-11-23 18:51:47
-
浏览量:683次2019-12-28 10:17:47
-
浏览量:454次2020-03-03 22:19:33
-
浏览量:462次2020-08-05 20:32:31
-
浏览量:698次2017-11-08 13:22:30
-
浏览量:348次2020-04-24 11:04:36
-
浏览量:533次2019-11-09 19:10:44
-
浏览量:425次2020-07-28 17:54:29
-
浏览量:449次2019-11-09 18:26:29
-
浏览量:454次2019-07-20 14:05:57
-
2020-07-01 11:02:45
-
浏览量:741次2017-11-16 18:17:23
-
2020-06-23 17:04:09
-
浏览量:368次2019-01-09 19:48:36
-
广告/SPAM
-
恶意灌水
-
违规内容
-
文不对题
-
重复发帖

在各个uadu







举报类型
- 内容涉黄/赌/毒
- 内容侵权/抄袭
- 政治相关
- 涉嫌广告
- 侮辱谩骂
- 其他
详细说明