原创 多相抽取fir滤波器的fpga仿真实现

2015-4-25 18:13 3390 6 7 分类: FPGA/CPLD 文集: FPGA&verilog

今天仿真了下多相抽取滤波器的仿真实现,其原理其实很简单就是根据抽取的原则,将fir滤波器的系统函数分解,称之为多相,所以又叫多相抽取滤波器。

一、原理如下图:

11111111111.jpg
 
系统实现函数为:
222222.jpg
 
二、参考一篇论文和田耕书仿真如下:
结合matlab参数进行测试,代码贴在最后面:
matlab输出结果:
3333333.jpg
 
modesim仿真结果如下:
444444.jpg
 
 
两者结果还是相同的。。
 
现在把源代码贴在下面:
matlab代码:
close all;clc;clear all;
h = [0.48301 0.8365 0.2241 -0.1294];
NX = 9;
x_in = 0:NX-1;
x1 = filter(h,1,x_in);
M=2;
y1 = x1(1:M:NX);
y = fix(y1);
stem(y)
 
fpga代码:
part1:
module polyfilter(clk,clk2,reset,x_in,y_out);
 
parameter even = 0,odd =1;
 
input clk;
input clk2;
input reset;
input [7:0] x_in;
output [8:0] y_out;
 
reg [16:0] m0,m1,m2,m3,r0,r1,r2,r3;
reg [16:0] x33,x99,x107;
reg [16:0] y;
reg [7:0] x_odd,x_even,x_wait;
wire [16:0] x_odd_sxt,x_even_sxt;
reg state;
 
always @(posedge clk ) begin
if(!reset) begin
      state <= odd;
      x_even <= 0;
     x_odd <= 0;
     x_wait <= 0;
end
else begin
  case(state)
      even:begin
            x_even <= x_in;
            x_odd <= x_wait;
           state <= odd;
      end
     odd: begin
           x_wait <= x_in;
          state <= even;
      end
endcase
end
end
 
assign x_odd_sxt = {{9{x_odd[7]}},x_odd};
assign x_even_sxt = {{9{x_even[7]}},x_even};
 
always @(posedge clk) begin
if(!reset) begin
          x33 =0;
          x99 = 0;
         x107 = 0;
         m0 =0;
           m1 = 0;
         m2 =0;
        m3 =0;
end
else begin
     x33 = (x_odd_sxt << 5) + x_odd_sxt;
     x99 = (x33 << 1) + x33;
     x107 = x99 + (x_odd_sxt <<3);
 
     m0 = (x_even_sxt << 7) - (x_even_sxt <<2);
     m1 = x107 << 1;
     m2 = (x_even_sxt << 6);
     m3 = x33;
end
end
 
always @(posedge clk2) begin
if(!reset) begin
     r0 <= 0 ;
     r1 <= 0;
     r2 <= 0;
     r3 <= 0;
end
else begin
    r0 <= r2 + m0;
   r2 <= m2;
 
   r1 <= -r3 + m1;
   r3 <= m3;
 
    y <= r0 + r1;
end
end
 
assign y_out = y[16:8];
 
endmodule
 
part2:
module polyfilter_tb();
 
reg clk;
reg clk2;
reg reset;
reg [7:0] x_in_d1;
wire [8:0] y_out;
 
reg [7:0] x_in[8:0];
polyfilter polyfilter_d1(
.clk(clk),
.clk2(clk2),
.reset(reset),
.x_in(x_in_d1),
.y_out(y_out));
 
 
initial  begin
    clk =0;
   reset =0 ;
    clk2 =1;
 
  #20 reset = 1;
end
 
always #4 clk <= ~clk;
 
always @(posedge clk)
    clk2 <= ~clk2;
 
reg [3:0] count;
 
//就只输入9个数和matlab一致
always @(posedge clk or negedge reset)
begin
if(!reset)
begin
        x_in_d1 <= 8'd0;
        x_in[8] <= 8'd8;
       x_in[7] <= 8'd7;
         x_in[6] <= 8'd6;
      x_in[5] <= 8'd5;
       x_in[4] <= 8'd4;
      x_in[3] <= 8'd3;
      x_in[2] <= 8'd2;
       x_in[1] <= 8'd1;
       x_in[0] <= 8'd0;
count <= 4'd0;
end
else if(count == 4'd9)
begin
       count <= count;
       x_in_d1 <= 8'd0;
end
else
begin
      count <= count + 1;
       x_in_d1 <= x_in[count]; 
end
end
 
endmodule
 
 
 
 
 
 
PARTNER CONTENT

文章评论1条评论)

登录后参与讨论

用户1069018 2015-9-28 16:47

谢谢分享

自做自受 2014-1-17 22:56

这台热水器的所谓智能化电子控制器不稳定,自己掌握了规律,还可以用,卖给人家,万万不可。借此也提请大家日常使用的消费类电子电器产品,不要图多功能、智能化,那玩意儿,可谓一坏具损,修理昂贵,留之无益,弃之浪费,迫害环境。

用户377235 2014-1-6 09:11

上网二手卖掉,买卖双方都受益
相关推荐阅读
用户1715035 2015-05-18 10:41
The art of counting in fpga(2)
接前面,居然一篇放不下--------------------------------------------------------------------------------- Cus...
用户1715035 2015-05-18 10:40
The art of counting in fpga(1)
转载至fpga4fun,觉得对重新理解fpga很好,而且从来没有在中文网站上看到这种东西,而且讲的通俗易懂,以后多看点英文网站。先转下来备忘,从以前的一个自己的博客上转载过来的。。 (1)Bi...
用户1715035 2015-04-20 16:20
fir 滤波器的matlab实现和modesim实现仿真对比
本测试主要是为了测试fir滤波器在matlab和modesim中有什么不同。。 用的fir滤波器都是8阶直接,而且信号处理过程也是一模一样。 第一步:以matlab为原型,现在matla中...
用户1715035 2015-04-19 00:29
直接型iir滤波器的matlab实现和modesim仿真对比
本文测试直接I型的IIr低通滤波器在matlab中和在fpga实现中有什么不同。。 为了看的清楚写的简略,可以参考后面贴的代码 第一步:产生两个信号源,采样率fs =1000hz,单频信号...
用户1715035 2015-04-09 23:03
matlab和modesim的一种读写交互方式(通过txt文件)
在进行modesim仿真时,由于matlab强大的数据处理能力,时常需要比较复杂的激励或者需要把仿真结果保存下来用matlab来处理。利用matlab工具来辅助modesim仿真显得十分重要。。 ...
EE直播间
更多
我要评论
1
6
关闭 站长推荐上一条 /3 下一条