一、config部分
拉出clk
resetn,
s_axis_config_tdata,
s_axis_config_tready,
s_axis_config_tvalid .这四个信号。
时序行为解释:s_axis_config_tdata是FFT的配置信息,在resetn信号之后,valid信号拉高且只拉高一个时钟周期,然后就能发现s_axis_config_tready拉低了,因为这个时候FFT的配置已经完毕了,过一段时间后s_axis_config_tready信号又会拉高,这时候就不用管了, 因为这个时候拉高是为了实现FFT的重配置功能,一般情况下用不到。
二、tdata部分
拉出s_axis_data_tready
s_axis_data_tvalid
s_axis_data_tdata
s_axis_data_tlast
时序行为解释:s_axis_data_tready会一直拉高,中间这段s_axis_data_tready拉低了一段,我也不知道为什么(规律是第一个数据输入了之后会停下来一个时钟周期,这对于流水线简直是灾难),但是我的读取下一个值的计数器是s_axis_data_tready 有效才会读取下一个数据,所以影响不大。
s_axis_data_tvalid在需要进行FFT的数据s_axis_data_tdata开始的地方拉高就可以。
s_axis_data_tlast
@(posedge clk)begin
if(s_axis_data_tready == 1)begin
// 此时给输入数据有效也拉高,准备传输需要做fft的数据
// reg [data_length*2-1:0] s_axis_data_tdata
// 高data_length位是输入数据的虚部,低data_length位是输入数据的实部
// 因为输入数据是正弦波,转化为二进制浮点数,肯定是没有虚部,高data_length位置0就行
// 注意,这个32后边要改,因为不适合在点数变化的时候使用
#1;
s_axis_data_tdata = {data_in_im[data_in_cnt],data_in_re[data_in_cnt]};
if(data_in_cnt == transform_length-1)begin
// 当输入数据完毕,停止读取,tlast信号持续一个时钟周期
data_in_cnt = 0;
s_axis_data_tlast = 1;
// 满足AXI协议的tlast信号要求,在信号结束的时候拉低,注意,需要找方法改进
#10;
s_axis_data_tlast = 0 ;
data_in_cnt = 1 ;
end
else begin
data_in_cnt = data_in_cnt + 1 ;
end
end
#1;
s_axis_data_tvalid = 1;
end
补充:为什么s_axis_data_tready会拉低一个时钟周期呢?
因为real time mode需要buffer一个数据