ZYNQ学习--AXI4-Stream data FIFO && FIFO的ADDA实验
FIFO存储器是一个先入先出的双口缓冲器,即第一个进入其内的数据第一个被移出,其中一个是存储器的输入口,另一个口是存储器的输出口。
一、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
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)