一、FIFO存储器

是一个先入先出的双口缓冲器,即第一个进入其内的数据第一个被移出,其中一个是存储器的输入口,另一个口是存储器的输出口。
参考文档:
AXI4-STREAM DATA FIFO的学习
Vivado官方文档《 pg085-axi4stream-infrastructure》-- 43页 AXI4-Stream DATA FIFO
《AXI4-Stream协议总结》

设置界面

两个部分:基础设置和AXIS信号设置
在这里插入图片描述

PART 1 重要参数

FIFO depth:FIFO深度,决定了可以存多少个基本数据
Memory type:存储资源的使用类型–不同模式下可支持的功能不同,手册有具体介绍
Independent clocks:独立时钟设置,存取时钟是独立设置
Enable ECC:是否启动纠错设置

PART 2 AXI-Stream 格式设置

==TDATA 位宽 (bytes) ==
TDATA是基本的有效载荷,用来提供跨越接口的数据。数据为整数个字节。
使能 TSTRB
TSTRB是数据起始标志,表明起始位
使能 TKEEP
TKEEP标明了有效部分,未确认KEEP的那些相关字节是空字节,可以从数据流中去除
使能 TLAST
TLAST数据边界
TID 位宽(bits)
数据流的标识符,用来表明不同的数据流。

TDEST 位宽(bits)
TUSER 位宽(bits)

PART 3 读写标志设置界面 Flags

在这里插入图片描述
读写设置相同:
==使能 write data count ==
使能写数据计数
使能 almost full
数据存满的输出口
使能 programmable full

IP核仿真

实验设置的IP核
在这里插入图片描述

编写testbeach

没加各种其他信号的情况

module sim;

  wire [7:0]M_AXIS_tdata;
  reg M_AXIS_tready = 0;
  wire M_AXIS_tvalid;
  reg [7:0]S_AXIS_tdata = 0;
  wire S_AXIS_tready;
  reg S_AXIS_tvalid = 0;
  reg s_axis_aclk = 0;
  reg s_axis_aresetn = 1;

always #10 s_axis_aclk = ~s_axis_aclk;
initial begin
    #20 s_axis_aresetn = 0;
  //  #20 s_axis_aresetn = 1;
    #40 S_AXIS_tvalid = 1;
    #40 S_AXIS_tdata = 16;
    #40 S_AXIS_tvalid = 0;
    #60 M_AXIS_tready = 1;   
end

design_1_wrapper sss
   (M_AXIS_tdata,
    M_AXIS_tready,
    M_AXIS_tvalid,
    S_AXIS_tdata,
    S_AXIS_tready,
    S_AXIS_tvalid,
    s_axis_aclk,
    s_axis_aresetn);
endmodule

二、带FIFO的ADDA实验

Test1 带反向流控的跨时钟域传输信号的例子 DAC+FIFO

基于“DDS IP 数字波形合成DAC ” “ ADDA测试” 实验方案实现以下要求
(1)用MMCM 把 合成出100MHz的时钟,让DDS工作在100MHz时钟
(2)让DAC和DAC的接口电路工作在50MHz,此时DAC的采样率为50MHz
(3)在DDS和DAC接口电路之间,放置一个带独立时钟的AXI-Stream-Data FIFO,FIFO两端的时钟分别为DDS的工作时钟100MHz和DAC的工作时钟50MHz
(4)生成FIFO需要带data count信号(本实验仅用于观察,以后的实验中这些信号有用。)
(5)DDS的数据输出接口需要有TREADY信号
(6)DAC接口电路需要将FIFO输出端的AXI-S接口转换成DAC的接口格式,自行编写RTL代码完成该功能。另外由于DAC的工作频率小于DDS工作频率,所以DAC接口控制器给FIFO的RDY信号应该一直为高。
(7)以上结构的意义在于,把接口电路和信号处理电路分离在不同的时钟域,从而使得各部分保持独立
(8)本实验添加2个system ILA,分别观察FIFO两端接口的信号时序,注意观察 data count端口的变化。
(9)用VIO配置频率字,分别生成1MHz和3MHz的DDS正弦波形,用system ILA抓取DAC的输入数据,用Matlab分析频谱,验证频率正确。

First – 编写DAC接口电路

目的:DAC接口电路需要将FIFO输出端的AXI-S接口转换成DAC的接口格式,并且因为输出的数据比写入的数据慢,所以不需要等待写入,DAC接口电路提供的m_ready信号一直为高。

module DAC(
    clk,
    reset,
    data_ready,
    DAC_IN,
    DAC_OUT);
    parameter length=8;
    input clk;
    input reset;
    output data_ready;
    input [length-1:0] DAC_IN;
    output[length-1:0] DAC_OUT;
    
    reg data_ready;
    reg [length-1:0] DAC_OUT;
    always@(posedge clk) begin
        if(!reset) begin
            data_ready<=0;
            DAC_OUT<=0;
        end
        else begin
            DAC_OUT[7]<=~DAC_IN[7];
            DAC_OUT[6:0]<=DAC_IN[6:0];
            data_ready<=1;
        end 
    end
endmodule

Second – Block Design 设计

一、Simulation

1、将IP核连接好,DDS接100Mhz,DAC电路接50Mhz
在这里插入图片描述
2、Behavioral Simulation
(1)写入
在这里插入图片描述
(2)读出在这里插入图片描述
读出的数据是从count开始计数的第一个周期开始时存的数据
在这里插入图片描述

二、Download

1、添加system ILA 观察信号
在这里插入图片描述2、写入端的system ILA (1MHz)
在这里插入图片描述
3、读出端的system ILA
在这里插入图片描述
4、DAC输出模拟信号自环给ADC的模拟输入
(1)1MHz
在这里插入图片描述
matlab频谱图
在这里插入图片描述
(2)3MHz
在这里插入图片描述

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐