最近在学习基于FPGA的FIR设计,在数字通信领域里面,滤波器的设计也是极其重要的一部分,要加强实践和学习。在网上找了很久的资料,感觉都不太详细。
滤波器的设计不是关键,关键是如何使用matlab设计,modelsim进行仿真!!
首先设计一个FIR滤波器,在matlab里面使用fdatool进行设计,如图1所示:
FDATOOL界面
得到的滤波器系数导入workspace里面,在此我们选择8位,由此引起的量化误差,我们可以计算得到。
将数据导出。
在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
在modelsim得到的仿真结果,
将数据导入到matlab
FPGADeveloper 2013-8-26 23:53
用户447865 2013-8-24 21:50
用户1665678 2012-7-26 12:54
用户1576201 2012-5-21 16:18
fir.txt:dataout.txt怎么写啊
FPGADeveloper 2010-12-16 12:21