原创 基于matlab设计、modelsim仿真的FIR滤波器的设计

2010-12-13 11:20 6660 5 10 分类: FPGA/CPLD

最近在学习基于FPGA的FIR设计,在数字通信领域里面,滤波器的设计也是极其重要的一部分,要加强实践和学习。在网上找了很久的资料,感觉都不太详细。


滤波器的设计不是关键,关键是如何使用matlab设计,modelsim进行仿真!!


首先设计一个FIR滤波器,在matlab里面使用fdatool进行设计,如图1所示:


152da7af-7cc0-495d-8dea-2d5a40c747da.JPG


FDATOOL界面


得到的滤波器系数导入workspace里面,在此我们选择8位,由此引起的量化误差,我们可以计算得到。


3b5b043e-8e28-40a8-84f7-eebfb43913d8.JPG


a798f611-0264-4ebb-b109-bcef9506d068.JPG


将数据导出。


 


在workspace里将系数同时乘以2^8,得到整数


将FIR用HDL进行实现。


`timescale 1ns / 1ps
module AFIRlowpass(Data_out,Data_in,clock,reset);


parameter order = 8;
parameter word_size_in = 8;
parameter word_size_out = 2*word_size_in + 1;



parameter b0 = 8'd7; 
parameter b1 = 8'd17;
parameter b2 = 8'd32;
parameter b3 = 8'd46;
parameter b4 = 8'd52;
parameter b5 = 8'd46;
parameter b6 = 8'd32;
parameter b7 = 8'd17;
parameter b8 = 8'd7;


output [word_size_out-1 : 0] Data_out;
input [word_size_in-1 : 0] Data_in;
input clock,reset;
reg  [word_size_in-1 : 0] Samples[1 : order];
integer k;



assign Data_out = b0*Data_in + b1*Samples[1] + b2*Samples[2] + b3*Samples[3]
        + b4*Samples[4] + b5*Samples[5] + b6*Samples[6] + b7*Samples[7]
+ b8*Samples[8];



always @ (posedge clock)
   if(reset == 1) begin
      for(k=1; k<=order; k=k+1)
         Samples[k] <= 0;
   end
   else begin
      Samples[1] <= Data_in;
      for(k=2; k<=order; k=k+1)
         Samples[k] <= Samples[k-1];
   end


endmodule


手写testbench


timescale 1ns/1ps
module Afirtest;
reg[7:0] Din;
wire[16:0] Dout;
reg clk;
reg rst;
reg[7:0] memory[0:255];
integer cnt,i,j;
integer w_file;


always #50 clk=~clk;


 


initial
begin
 clk=0;
 rst=0;
 #100 rst=1;
 #500 rst=0;
 w_file =$fopen("dataout.txt");
 cnt=0;
 // $readmemh("fir.txt",memory);
 $readmemh("fir.txt",memory);
 for(i=0;i<=255;i=i+1)
   $display("memory[%d]=%h",i,memory);
end


always@(posedge clk)
 if(rst)
    begin
  Din<=8'b0;
  j<=0;   
    end
 else
    begin
  Din<=memory[j];
  j<=j+1'b1;
    end
   
 always@(j)
 if(rst==0)
     begin
     $fdisplay(w_file,"%d",Dout);
     cnt=cnt+1;  
     if(cnt==8'd255)
     $stop;
     end
    
AFIRlowpass TEST(.clock(clk),.reset(rst),.Data_in(Din),.Data_out(Dout));
endmodule


c27be91b-fc97-4c66-b894-bffcfa969e4a.jpg


在modelsim得到的仿真结果,


将数据导入到matlab


 


29f8b936-57f5-4d67-84c7-e5ebf59d853b.jpg

PARTNER CONTENT

文章评论5条评论)

登录后参与讨论

FPGADeveloper 2013-8-26 23:53

不利于RTL,建议采用IP进行设置,FDATool产生系数

用户447865 2013-8-24 21:50

你怎么不用fdatool直接生成代码呢

用户1665678 2012-7-26 12:54

很好 谢谢啊

用户1576201 2012-5-21 16:18

fir.txt:dataout.txt怎么写啊

FPGADeveloper 2010-12-16 12:21

追逐最感兴趣和最有激情的事情。当你对某件事感兴趣时,你会在走路、吃饭或洗澡时都对它念念不忘,你想做不好都都不可能。更进一步,如果你对这事有激情,你就可能为它废寝忘食,连睡觉时想起一个主意,都会跳起来。这时候,你已经不是为了成功而工作,而是为了“享受”而工作了。这时成功就是必然的。
相关推荐阅读
FPGADeveloper 2017-04-11 12:03
界面好像比较清爽
界面好像比较清爽,试用下 ...
FPGADeveloper 2015-11-19 17:24
评论:@emesjx's Blog 博客中提到的“高速LVDS接口信号完整性处理实例”
学习看看...
FPGADeveloper 2015-01-02 17:16
2015年FPGA雏鹰培训计划
 ...
FPGADeveloper 2015-01-02 11:05
2015 新年新开始~
2015 新年新开始~...
FPGADeveloper 2014-09-12 23:28
AD DA 测试
AD DA       测试条件           ...
FPGADeveloper 2014-06-13 16:45
5位创始人讲述创业失败的教训
  失败,这是围绕在创业者身上很常见的事情,它常让创业者在很长一段时间内灰心失望。         但是总有一些创业者勇敢的面对失败,从而最后取得成功。我们采访了5位成功的创始...
EE直播间
更多
我要评论
5
5
关闭 站长推荐上一条 /1 下一条