AXI4 STREAM DATA FIFOS的IP核使用说明

易百纳技术社区 2018-09-27 20:15:39 15354

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输出显示。

声明:本文内容由易百纳平台入驻作者撰写,文章观点仅代表作者本人,不代表易百纳立场。如有内容侵权或者其他问题,请联系本站进行删除。
红包 点赞 收藏 评论 打赏
评论
0个
内容存在敏感词
手气红包
    易百纳技术社区暂无数据
相关专栏
置顶时间设置
结束时间
删除原因
  • 广告/SPAM
  • 恶意灌水
  • 违规内容
  • 文不对题
  • 重复发帖
打赏作者
易百纳技术社区
易百纳技术社区
您的支持将鼓励我继续创作!
打赏金额:
¥1易百纳技术社区
¥5易百纳技术社区
¥10易百纳技术社区
¥50易百纳技术社区
¥100易百纳技术社区
支付方式:
微信支付
支付宝支付
易百纳技术社区微信支付
易百纳技术社区
打赏成功!

感谢您的打赏,如若您也想被打赏,可前往 发表专栏 哦~

举报反馈

举报类型

  • 内容涉黄/赌/毒
  • 内容侵权/抄袭
  • 政治相关
  • 涉嫌广告
  • 侮辱谩骂
  • 其他

详细说明

审核成功

发布时间设置
发布时间:
是否关联周任务-专栏模块

审核失败

失败原因
备注
拼手气红包 红包规则
祝福语
恭喜发财,大吉大利!
红包金额
红包最小金额不能低于5元
红包数量
红包数量范围10~50个
余额支付
当前余额:
可前往问答、专栏板块获取收益 去获取
取 消 确 定

小包子的红包

恭喜发财,大吉大利

已领取20/40,共1.6元 红包规则

    易百纳技术社区