21-05-16 Vivado FFT IP核调试问题若干(真相是假)

概述

该IP核主要用于完成FFT或者IFFT等功能,接口信号也分为几个类型:IP核基本信号(配置信号、时钟信号等)、接收信号部分(AXI从端口,用于接收需要处理的信号)、发送信号部分(AXI主端口,用于发送FFT/IFFT后的结果)、工作状态的时间变量。
例化说明:

//fft ip核例化 20位数据
xfft_0 u_fft(
    .aclk(CLK_62_5M),                                                // 时钟信号(input)
    .aresetn(RST),                                           // 复位信号,低有效(input)
    .s_axis_config_tdata(8'd1),                                // ip核设置参数内容,为1时做FFT运算,为0时做IFFT运算(input)
    .s_axis_config_tvalid(1'd1),                               // ip核配置输入有效,可直接设置为1(input)
    .s_axis_config_tready(fft_s_config_tready),                // output wire s_axis_config_tready
    //作为接收时域数据时是从设备
    .s_axis_data_tdata(fft_s_data_tdata),                      // 把时域信号往FFT IP核传输的数据通道,[47:20]为虚部,[19:0]为实部(input,主->从)
    .s_axis_data_tvalid(FFT_data_en),                          // 表示主设备正在驱动一个有效的传输(input,主->从)
    .s_axis_data_tready(fft_s_data_tready),                    // 表示从设备已经准备好接收一次数据传输(output,从->主),当tvalid和tready同时为高时,启动数据传输
    .s_axis_data_tlast(fft_s_data_tlast),                      // 主设备向从设备发送传输结束信号(input,主->从,拉高为结束)
    //作为发送频谱数据时是主设备
    .m_axis_data_tdata(fft_m_data_tdata),                      // FFT输出的频谱数据,[73:40]对应的是虚部数据,[33:0]对应的是实部数据(output,主->从)。
    .m_axis_data_tuser(fft_m_data_tuser),                      // 输出频谱的索引(output,主->从),该值*fs/N即为对应频点;
    .m_axis_data_tvalid(fft_m_data_tvalid),                    // 表示主设备正在驱动一个有效的传输(output,主->从)
    //.m_axis_data_tready(fft_m_data_tready),                    // 表示从设备已经准备好接收一次数据传输(input,从->主),当tvalid和tready同时为高时,启动数据传输
    .m_axis_data_tready(1'd1),                                   //默认从设备准备好接收
    .m_axis_data_tlast(fft_m_data_tlast),                      // 主设备向从设备发送传输结束信号(output,主->从,拉高为结束)
    //其他输出数据
    .event_frame_started(fft_event_frame_started),                  // output wire event_frame_started
    .event_tlast_unexpected(fft_event_tlast_unexpected),            // output wire event_tlast_unexpected
    .event_tlast_missing(fft_event_tlast_missing),                  // output wire event_tlast_missing
    .event_status_channel_halt(fft_event_status_channel_halt),      // output wire event_status_channel_halt
    .event_data_in_channel_halt(fft_event_data_in_channel_halt),    // output wire event_data_in_channel_halt
    .event_data_out_channel_halt(fft_event_data_out_channel_halt)   // output wire event_data_out_channel_halt
  );
 

1.仿真跳回verilog源代码

仿真到一个时间,跳回verilog文件,仿真报错为:
Failure: ERROR:add_1 must be in range [-1,DEPTH-1]
Time: 2157526 ns Iteration: 1
$finish called at time : 2157526 ns : File “F:/MSK/WindBand_AD_FFT/sim/WindBand_I_FFT/WindBand_I_FFT.srcs/sources_1/new/WindBand_I_FFT.v” Line 246
原因:fft_m_data_tready 为输出FFT结果的AXI总线中需要从设备的准备信号,需要由下一级模块给出,或者这一级模块直接赋1’d1。

另外,当 fft_m_data_tready为不定态时,fft_m_data_tdata也为不定态(X),此时fft_m_data_tuser/fft_m_data_tvalid可能是有信号的,但是fft_m_data_tdata显示无信号。

2.IP核输出工作状态相关事件变量

该部分引自:原文链接:https://blog.csdn.net/gslscyx/article/details/107171595

IP核提供一些实时非AXI信号报告IP核的状态信息。这些信号IP是必须输出的,但是如果这些信号不连接,则会被综合工具综合掉,以节约资源。某些事件信号在某些模式下是不出现的,这在后续会有介绍。
event_frame_started

当IP核开始处理新帧时,会插入该信号,且该信号只持续一个时钟周期。该信号允许用于计数帧数,也可以用于同步配置特殊帧。

envent_tlast_missing

当IP核输入的数据数目大于Vivado设置的最大FFT/IFFT点数时,会插入此信号。该信号持续一个时钟周期。是否插入s_axis_data_tlast与此信号无关。

event_tlast_unexpected

当s_axis_data_tlast插入的位置不是最后一个帧数据时,该时钟会有效,持续一个时钟周期。如果一个帧中出现多个s_axis_data_tlast高电平,此信号也会对应的插入多个。

event_fft_overflow

该信号用来监视FFT/IFFT输出数据m_axis_data_tdata是否溢出。如果数据一直溢出,该信号一直输出高电平。该信号只在缩放模式或者单精度浮点模式下使用,其他配置模式(块浮点模式)无此信号。

event_data_in_channel_halt

该信号在当FFT/IFFT核需要从数据输入通道接收数据,而没有数据可用时,会插入此信号。例如,当NFFT设置为1024点,而输入数据只输入了1000点数据,此时,该信号会插入,直到有新的数据插入时,该信号才会变为低电平。

event_data_out_channel_halt

当FFT/IFFT核需要写数据到输出通道时,但缓冲buffer已经满了,此时,该信号会出现高电平,表示输出通道挂起,直到输出buffer非满,该信号才会变为低电平。该信号只在Non-Realtim模式中应用。

event_status_channel_halt
当FFT/IFFT核需要写数据到状态通道时,但缓冲buffer已经满了,此时,该信号会出现高电平,表示状态通道挂起,直到输出buffer非满,该信号才会变为低电平。该信号只在Non-Realtim模式中应用。

关于以上信号的一些问题:
1.当s_axis_data_tready与s_axis_data_tvalid均为1时(主机从机均已准备好接收数据),s_axis_data_tdata该信号有效,开始送入IP核,然而event_frame_started信号(表示一帧)在几个周期后才会拉高,表示一帧的开始,不知道时为什么。
2.因为event_frame_started的开始与s_axis_data_tvalid不是同步的,所以最后一个值即s_axis_data_tlast输入后,event_tlast_unexpected被拉高(该IP核认为这不是最后一个数据),在5-6个周期后envent_tlast_missing被拉高(该IP核认为此时应该是最后一个数据,而此时s_axis_data_tlast并未拉高)。理论上如果开始信号与valid一起被拉高,最后的last信号应该正常,不会出现异常事件报错。

3.仿真图若干

输入信号为matlab产生的500k采样率、信号频率为10k和30k信号,可以看到上拉的last、unexperted、missing信号
输入信号为matlab产生的500k采样率、信号频率为10k和30k信号
FFT结果,将实部和虚部分别取出,并与matlab结果做对比,根据FFT频谱分辨率(500k/8192)计算频点,得到10k与30k证明结果正确

FFT仿真结果,实部以及虚部图像
matlab结果
matlab仿真FFT实部虚部图像

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值