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输出显示。
- 分享
- 举报
-
浏览量:4593次2020-06-19 15:56:33
-
浏览量:5732次2020-10-13 17:14:09
-
浏览量:5138次2020-08-25 18:07:54
-
浏览量:2485次2020-08-25 18:07:51
-
浏览量:4891次2021-03-26 15:39:50
-
浏览量:3293次2018-04-12 11:32:51
-
2024-08-22 21:17:40
-
浏览量:3661次2017-11-16 11:30:55
-
浏览量:5969次2022-05-09 11:00:58
-
浏览量:3428次2020-11-03 10:31:30
-
浏览量:15406次2021-07-12 23:53:03
-
浏览量:7046次2022-05-11 08:10:28
-
浏览量:2834次2020-05-14 17:30:06
-
浏览量:6458次2022-05-10 12:41:18
-
浏览量:3025次2020-08-26 17:29:05
-
浏览量:2068次2019-10-18 09:46:53
-
浏览量:16698次2020-12-03 00:29:52
-
浏览量:3471次2017-11-23 18:51:47
-
浏览量:3972次2020-03-03 22:19:33
-
广告/SPAM
-
恶意灌水
-
违规内容
-
文不对题
-
重复发帖
易百纳技术社区
感谢您的打赏,如若您也想被打赏,可前往 发表专栏 哦~
举报类型
- 内容涉黄/赌/毒
- 内容侵权/抄袭
- 政治相关
- 涉嫌广告
- 侮辱谩骂
- 其他
详细说明