ZYNQ学习--AXI4-Stream data FIFO && FIFO的ADDA实验

一、FIFO存储器

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

设置界面

两个部分:基础设置和AXIS信号设置
ZYNQ学习--AXI4-Stream data FIFO && FIFO的ADDA实验_第1张图片

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

ZYNQ学习--AXI4-Stream data FIFO && FIFO的ADDA实验_第2张图片
读写设置相同:
==使能 write data count ==
使能写数据计数
使能 almost full
数据存满的输出口
使能 programmable full

IP核仿真

实验设置的IP核
ZYNQ学习--AXI4-Stream data FIFO && FIFO的ADDA实验_第3张图片

编写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
ZYNQ学习--AXI4-Stream data FIFO && FIFO的ADDA实验_第4张图片
2、Behavioral Simulation
(1)写入
ZYNQ学习--AXI4-Stream data FIFO && FIFO的ADDA实验_第5张图片
(2)读出ZYNQ学习--AXI4-Stream data FIFO && FIFO的ADDA实验_第6张图片
读出的数据是从count开始计数的第一个周期开始时存的数据
ZYNQ学习--AXI4-Stream data FIFO && FIFO的ADDA实验_第7张图片

二、Download

1、添加system ILA 观察信号
ZYNQ学习--AXI4-Stream data FIFO && FIFO的ADDA实验_第8张图片2、写入端的system ILA (1MHz)
ZYNQ学习--AXI4-Stream data FIFO && FIFO的ADDA实验_第9张图片
3、读出端的system ILA
ZYNQ学习--AXI4-Stream data FIFO && FIFO的ADDA实验_第10张图片
4、DAC输出模拟信号自环给ADC的模拟输入
(1)1MHz
ZYNQ学习--AXI4-Stream data FIFO && FIFO的ADDA实验_第11张图片
matlab频谱图
ZYNQ学习--AXI4-Stream data FIFO && FIFO的ADDA实验_第12张图片
(2)3MHz
ZYNQ学习--AXI4-Stream data FIFO && FIFO的ADDA实验_第13张图片

你可能感兴趣的:(ZYNQ学习笔记,fpga开发)