为什么我不关心 IIR 滤波器的输出

问题描述 投票:0回答:1
module IIR_filter(xn, clk, rst_n, yn);
  input signed [3:0]xn;
  input clk,rst_n;
  output reg signed [3:0]yn;
  reg signed [3:0]y_1,y_2,x_1,x_2,x_3;
  
  always @(*)begin
    yn = xn - (x_1) + (x_2) + (x_3)+ (y_1>>>1) + (y_2>>>2);
  end
  always @(posedge clk or negedge rst_n)
    begin 
      if(rst_n == 0)
        begin
          y_1 <=0;y_2<=0;x_1<=0;x_2<=0;x_3<=0;
        end
      else
        begin
          y_1 <=yn; y_2<=y_1;
          x_1<=xn; x_2<=x_1; x_3<=x_2;
        end
    end
endmodule
      
  

这是组合逻辑和时序逻辑的设计

  // Code your testbench here
// or browse Examples
module IIR_filter_tb();
  reg [3:0]xn;
  reg clk,rst_n;
  wire [3:0]yn;
  integer i;
  IIR_filter test(.xn(xn),
                  .clk(clk),
                  .rst_n(rst_n),
                  .yn(yn)); 
  initial 
begin 
  clk = 0;
  #5 rst_n = 0;
  xn = 4'b0000;
  rst_n=1;
  for(i = 0; i<4;i=i+1)
    #20 xn = i;
  $display("yn = %d", yn);
    $finish; 
end 
  always
    begin
    #10 clk = ~clk;
  end
endmodule

这是测试台

问题是我不理解移位运算符的实现,并且递归结果被一一推送到下一个寄存器导致了问题。

我不在乎输出

verilog system-verilog edaplayground
1个回答
0
投票

该错误存在于您的测试平台代码中。您没有正确驱动复位信号。当我查看波形时,这一点对我来说是显而易见的。如果您仅依赖

$display
语句,则转储波浪会更有效。

改变:

  #5 rst_n = 0;

至:

  rst_n = 0;
  #5;

这修复了输出中的“不关心”(未知)。

© www.soinside.com 2019 - 2024. All rights reserved.