Vivado HLS实现FIR滤波器(3)——RAM输出高阻态导致FIR输出高阻态解决方法

1、FIR输出高阻态原因

上一节说错了,不是因为c_address在11-16之间无法识别,我将HLS中的阶数改成16阶仿真时地址仍然有几个时钟的高阻态,所以我认为地址出现高阻态的原因是因为在这几个时钟内要计算输出y,这一段时间是时延,c_address在此时间内不操作,观察HLS内的仿真可以看到,在c_address为高阻态时,滤波器系数在此阶段保持上一时刻的值;而在VIVADO中调用BRAM时,若地址为高阻态X,则输出为高阻态,这样计算y时就有高阻态数据存在,所得输出y为高阻态。

2、ram_out代码

ram_out代码作用:当ram的输出为高阻态时,ram_out输出0(即此时滤波系数为0),否则将ram的输出寄存一个时钟后输出,这样ram的输出波形就能和HLS仿真中的一致(延时了1个时钟),而不再会因为滤波器系数存在高阻态造成滤波输出为高阻态。

module ram_out(
    ram_clk,
    data_in,
    data_out
    );

input ram_clk;    
input [31:0] data_in;
output signed [31:0] data_out;

wire ram_clk;
wire [31:0] data_in;
reg [31:0] data_out;

always @ ( posedge ram_clk )
begin
//此处如果直接判断是否为32位的高阻态数据会不成功,没弄清楚为什么
//后来直接判断最低位是否为0或1,是的话寄存一个时钟后输出,否则输出上次的数据
    if(data_in[0] == 1'b0)		
      begin
        data_out <= data_in;
      end 
    else if( data_in[0] == 1'b1 )
      begin
        data_out <= data_in;
      end
    else		//高阻态,保持上次的数据
      begin
        data_out <= data_out;
      end   
end 

endmodule

3、打包成IP



记住IP存放的位置,后面调用时去这个位置找

在其他工程中调用ram_out的IP,Settings->IP->Rep…,点加号找到刚才生成的IP所在路径,确定。

4、整体图

5、未完待续。。。

按照这样仿真,给定8MHz和12MHz信号,发现按照上述操作滤出的y不再是高阻态,将波形调成模拟显示,发现波形不对。当给定波形200KHz叠加20MHz信号信号时发现完美滤波,滤波后的波形频率恰好为200KHz,实验后发现当低频波形小于1MHz时都能在滤波后获得低频的波形。但是仔细想想后发现不对,这样滤出的低频波形属于加性叠加才能用LPF滤出的波形,但是我的叠加方式是乘性叠加,是调制,应该积化和差,这样看结果是错的!
下篇博客找错误点(其实是数据的时钟问题,没有好好理解FIR的时域公式)

发布了27 篇原创文章 · 获赞 54 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/DengFengLai123/article/details/83998162