在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 4068|回复: 2

一个关于IIR滤波器的代码(VHDL)仿真问题

[复制链接]
发表于 2008-11-20 17:45:37 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
小弟在Meyer-Baese的《数字信号处理的FPGA实现》(相信此牛书在这个论坛能找到)看到了一段IIR的代码如下:

PACKAGE n_bit_int IS             -- User defined type
  SUBTYPE BITS15 IS INTEGER RANGE -2**14 TO 2**14-1;
END n_bit_int;

LIBRARY work;
USE work.n_bit_int.ALL;

LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
USE ieee.std_logic_arith.ALL;

ENTITY my_iir_3 IS
  PORT ( x_in  : IN   BITS15;   -- Input
         y_out : OUT  BITS15;   -- Result
         clk   : IN   STD_LOGIC);
END my_iir_3;
ARCHITECTURE flex OF my_iir_3 IS
  SIGNAL  x, x3, sx, y, y9 : BITS15;
            
BEGIN
  PROCESS  -- Use FFs for input, output and pipeline stages
  BEGIN
    WAIT UNTIL clk = '1';
    x   <= x_in;
    x3  <= x / 2 + x / 4;                 -- Compute x*3/4
    sx <=  x + x3;                     -- Sum of x element i.e. output FIR part
    y9  <= y / 2 + y / 16;           -- Compute y*9/16
    y   <= sx + y9;                       -- Compute output
  END PROCESS;
  y_out <= y ;                   -- Connect register y to output pins
  
END flex;

用Quartus II 7.0仿真,输入x_in取为一个时钟周期的正整数1000,发现结果严重错误,仔细察看各信号和变量后发现问题在于Quartus II 7.0在处理正整数时会莫名将最高符号位置1,导致正数全变负数,结果相差十万八千里。
作者用的是MUXplusII编译仿真的,结果正常,会不会是这两种编译器对整数的处理存在差异?我没有MuxplusII,还未做此比照。
小弟发现一解决办法是将整数的范围设定为0 to 2**14-1,Quartus II 7.0仿真结果立马正确。
然而,实际处理问题时回避处理负整数是一个不明智的选择,中间计算过程如有减法,则难保不够减即出现负数溢出的情况。
此外小弟也尝试用一些数据类型转换的函数,也没有解决这个问题。
翻看书后所附的相应的verilog代码后发现,处理数据不分正负,即全部按位矢量处理,由于我目前对verilog还不熟悉,故还未对该verilog代码仿真
望论坛里各位牛人能提点一二,小弟感激不尽!
附相应的verilog代码如下:

module iir_pipe (x_in, y_out, clk); //----> Interface
  parameter W = 14; // Bit width - 1
  input          clk;
  input  [W:0]  x_in;   // Input
  output [W:0]  y_out;  // Result
  reg [W:0] x, x3, sx;
  reg [W:0] y, y9;  
            
  always @(posedge clk)  // Infer FFs for input, output and
  begin                                                              // pipeline stages;
    x   <= x_in;                                                       // use non-blocking FF assignments
    x3  <= {x[W],x[W:1]} + {x[W],x[W],x[W:2]};           // i.e. x / 2 + x / 4 = x*3/4
    sx  <= x + x3;                                                  // Sum of x element i.e. output FIR part
    y9  <= {y[W],y[W:1]} + {{4{y[W]}},y[W:4]};        // i.e. y / 2 + y / 16 = y*9/16
    y   <= sx + y9;                                                // Compute output
  end
  assign y_out = y ;   // Connect register y to output pins
endmodule
 楼主| 发表于 2008-11-20 21:54:50 | 显示全部楼层
自己顶一下,免得沉了
 楼主| 发表于 2008-11-21 21:27:33 | 显示全部楼层
我再顶起来
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /1 下一条

小黑屋| 手机版| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-11-16 13:48 , Processed in 0.015363 second(s), 7 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表