有关MAC FIR v5.1的一点东西,也许除了我没有人能看懂写得是什么……

今天很大一部分时间在解决MAC FIR v5.1上面,我知道这篇博文除了我也许没人能看懂,但借优快云宝地,我记录下今天的一天……

环境:Xilinx ISE10.1  和 ModelSim SE PLUS 6.2b,FPGA型号似乎不重要,因为一年前和现在我使用的FPGA型号不一样。

其实这是一年前的事了,我在用ModelSim仿真包含MAC FIR v5.1的程序时,MAC FIR v5.1的输出就一直是不确定值,也就是一条红线,我实在是不明白,为什么会是一条红线……

这个坎必须得过,因为我必须得用MAC FIR v5.1 IP核,我就单独仿真MAC FIR v5.1,输出竟然正常了,为什么单独仿真IP核输出正常,而放到其它模块里面就不正常呢?

我想是不是我单独仿真时输入的数据较小,而在模块里面仿真时输入的数据太大呢?好吧,我改,我把在模块里面的FIR的输入改小,改成和单独仿真时的一样,但结果还是不行……

是不是输出端我接线接的不合适了,毕竟在模块里面仿真FIR涉及到很多连接,好吧,我把连接全断开,也不行呀……

到底是什么问题?

为什么单获仿真MAC FIR v5.1时正确而在模块里面仿真时输出就不对了呢?

粘一段代码吧:

module test_fir;

 // Inputs
 reg CLK;
 reg RESET;
 reg ND;
 reg [14:0] DIN;

 // Outputs
 wire RDY;
 wire RFD;
 wire [37:0] DOUT;

 // Instantiate the Unit Under Test (UUT)
 mac_fir uut (
  .CLK(CLK),
  .RESET(RESET),
  .ND(ND),
  .DIN(DIN),
  .RDY(RDY),
  .RFD(RFD),
  .DOUT(DOUT)
 );

 initial begin
  // Initialize Inputs
  CLK = 0;
  RESET = 0;
  ND = 0;
  DIN = 0;

  // Wait 100 ns for global reset to finish
  #100;

       
  // Add stimulus here

 end
     
endmodule

 这是建仿真文件时自动生成的一段代码,注意加粗的部分,一般都是延时100ns的,我在单独仿真时未加修改,而在模块仿真时在后面又加了一行代码“#32;”其实是我是为了对时钟的,因为我的时钟是这样输入的“always#4 CLK=~CLK; ”,哎,不管是为了啥吧,反正算是我多此一举啦,反正就是又延时了32ns,怎么地吧!

怎么地?

结果就是让我的仿真结果不对呗……

因为我观察我的仿真波形如下:

正常时:

不正常时如下:

 

注意两幅图中的RFD信号,正常情况下它是从低变高就不变了,而不正常情况下是由低变高,然后被复位,然后又变高,但却自己变成了不确定状态,这是怎么回事呢?

于是我想到了是不是延时的问题,后来去掉那个32ns的延时果然就可以了,我看了半天手册,也没看出什么行道来,哎,认了吧……

 

刚才又重试了一下,也不知哪儿的问题,我在那个#100后又加了#90的延时仍然正常,但再大就不正常了,为什么呢?

你知道么?

反正我不知道……

我今天就是瞎写,因为感觉这么一天得到的这点结论不记录下来对不起自己……

网友您如果搜到了本篇文章,就不要看了……

见谅……

附:verilog test fixture代码

module test_mac_fir;

 // Inputs
 reg CLK;
 reg RESET;
 reg ND;
 reg [14:0] DIN;

 reg [14:0] counter,counter_d1,counter_d2,counter_d3,counter_d4,counter_d5,counter_d6;
 // Outputs
 wire RDY;
 wire RFD;
 wire [37:0] DOUT;

 // Instantiate the Unit Under Test (UUT)
 mac_fir uut (
  .CLK(CLK),
  .RESET(RESET),
  .ND(ND),
  .DIN(DIN),
  .RDY(RDY),
  .RFD(RFD),
  .DOUT(DOUT)
 );

 initial begin
  // Initialize Inputs
  CLK = 0;
  RESET = 0;
  ND = 0;
  DIN = 0;
  counter_d1=0;
  counter_d2=0;
  counter_d3=0;
  counter_d4=0;
  counter_d5=0;
  counter_d6=0;
  // Wait 100 ns for global reset to finish
  #100;
  #90;

  RESET = 1;
  #800;
  RESET = 0;
  // Add stimulus here

 end
always@(posedge CLK)
 if(RESET)
  begin
   ND<=1;
  end
 else
  begin
   ND<=~ND;
  end
always@ (posedge CLK)
 begin
  counter_d1<=counter;
  counter_d2<=counter_d1;
  counter_d3<=counter_d2;
  counter_d4<=counter_d3;
  counter_d5<=counter_d4;
  counter_d6<=counter_d5;
  DIN<=0;
  if(RESET)
   begin
    counter<=14'b11_1111_1111_0000;
    counter_d1<=0;
    counter_d2<=0;
    counter_d3<=0;
    counter_d4<=0;
    counter_d5<=0;
    counter_d6<=0;
   end
  else
   begin
    counter<=counter+15'd1;
   end
 end
  
always#4 CLK=~CLK;  
endmodule

 

 

### FIR滤波器无反馈的工作原理及特点 FIR(Finite Impulse Response,有限长单位冲激响应)滤波器的核心特性之一是没有反馈回路。这意味着其输出仅依赖于当前和过去的输入样本,而不涉及任何过去输出的再处理[^1]。 #### 工作原理 FIR滤波器通过计算输入信号 \(x(n)\) 和一组固定系数之间的卷积来生成输出 \(y(n)\),表达式如下: \[ y(n) = \sum_{k=0}^{N-1} h(k)x(n-k) \] 其中: - \(h(k)\) 是滤波器的冲激响应系数, - \(N\) 表示滤波器的阶数或长度。 由于该公式只涉及到输入信号及其加权求和操作,因此不存在任何形式的反馈路径。这种结构使得FIR滤波器具有严格的因果性和稳定性条件[^1]。 #### 特点分析 1. **线性相位能力** - 大多数情况下,设计者可以确保FIR滤波器具备精确的线性相位响应。这对于音频处理、图像处理等领域尤为重要,因为非线性的相位失真可能会引起信号畸变[^1]。 2. **稳定性和可靠性** - 鉴于缺乏内部状态变量循环利用的现象,即使面对极端情况下的数值溢出或者舍入误差累积等问题时,仍然能够保持良好的性能表现[^1]。 3. **易于实现并行化运算** - 由于每一步计算都是独立完成的,所以非常适合现代硬件架构下大规模并发执行模式的要求[^1]。 4. **灵活性高** - 可以方便地调整参数以满足不同应用场景需求,比如低通、高通、带通等各种类型的频率选择功能都可以轻松实现。 ```python import numpy as np from scipy.signal import firwin, lfilter # 设计一个简单的低通FIR滤波器 fs = 1000 # Sampling frequency (Hz) nyq_rate = fs / 2.0 # Nyquist rate cutoff_hz = 30 # Cutoff frequency of the filter (Hz) taps = firwin(numtaps=50, cutoff=cutoff_hz/nyq_rate, window='hamming') # 测试数据 input_signal = np.random.randn(1000,) output_signal = lfilter(taps, 1.0, input_signal) ```
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值