高通FIR数字滤波器设计verilog要点.docx

上传人:b****6 文档编号:4720598 上传时间:2022-12-07 格式:DOCX 页数:19 大小:1.06MB
下载 相关 举报
高通FIR数字滤波器设计verilog要点.docx_第1页
第1页 / 共19页
高通FIR数字滤波器设计verilog要点.docx_第2页
第2页 / 共19页
高通FIR数字滤波器设计verilog要点.docx_第3页
第3页 / 共19页
高通FIR数字滤波器设计verilog要点.docx_第4页
第4页 / 共19页
高通FIR数字滤波器设计verilog要点.docx_第5页
第5页 / 共19页
点击查看更多>>
下载资源
资源描述

高通FIR数字滤波器设计verilog要点.docx

《高通FIR数字滤波器设计verilog要点.docx》由会员分享,可在线阅读,更多相关《高通FIR数字滤波器设计verilog要点.docx(19页珍藏版)》请在冰豆网上搜索。

高通FIR数字滤波器设计verilog要点.docx

高通FIR数字滤波器设计verilog要点

电子科技大学

 

ASIC课程设计报告二

 

学号:

201222240937

姓名:

周恒

课题题目:

高通FIR数字滤波器设计

 

2013年5月

FIR数字滤波器设计

已知FIR型数字滤波器的z域系统函数为:

即:

要求如下:

•设计平台:

基于QuartusII或ISE平台,选择AlteraCycloneII系列的EP2C8F256C8或XilinxSparten3系列的XC3S400(PQ208);

•testbench的信号输入激励源使用Matlab生成三角波信号;

•输入位宽16位,输出位宽24位,中间级可自行截位;

v设计

(1)直接型FIR设计

画出直接实现结构的框图,完成其verilogHDL电路描述及testbench,完成功能仿真和时序仿真,给出仿真波形图;

一、直接型结构框图如下:

长度为M的因果有限冲激响应滤波器由传输函数H(z)描述:

(1)

它是次数为M-1的z-1的一个多项式。

在时域中,上述有限冲激响应滤波器的输入输出关系为:

(2)

其中y(n)和x(n)分别是输出和输入序列。

有限冲激响应滤波器的一种直接型实现,可由式

(2)生成,M=5的情况如上图所示。

通常一个长度为M的有限冲激响应滤波器由M个系数描述,并且需要M个乘法器和(M-1)个双输入加法器来实现。

本设计包含的模块有4个16位寄存器块、5个16位乘法器、4个32位加法器模块

用QuartusII综合,顶层模块框图如下:

1、寄存器模块

寄存器用于寄存一组二值代码,只要求它们具有置1、置0的功能即可。

在本设计中用D触发器组成寄存器,实现寄存功能。

本设计中使用带异步复位reset_n端的D触发器,当reset_n=1时,输出信号q_out=d_in,当reset_n=0且上升沿脉冲到达时q_out=0。

其综合框图部分截图如下图所示。

●程序代码如下:

moduledff16(reset_n,clk,d_in,q_out);

inputreset_n,clk;

input[15:

0]d_in;

outputreg[15:

0]q_out;

always@(posedgeclkornegedgereset_n)

begin

if(!

reset_n)

q_out<=16'h0;

else

q_out<=d_in;

end

endmodule

在顶层文件中例化了D1、D2、D3、D4四个寄存器模块

dff16D1(.reset_n(reset_n),.clk(clk),.d_in(x_in),.q_out(q1)),

D2(.reset_n(reset_n),.clk(clk),.d_in(q1),.q_out(q2)),

D3(.reset_n(reset_n),.clk(clk),.d_in(q2),.q_out(q3)),

D4(.reset_n(reset_n),.clk(clk),.d_in(q3),.q_out(q4));

2、乘法器模块

从资源和速度考虑,常系数乘法运算可用移位相加来实现。

本设计采用加法树乘法器兼顾了资源与速度,将每个乘数例化了一个数组,然后移位相加得出乘积,这样使得乘法运算可以一个周期内完成。

●程序代码如下:

modulemult16(outcome,a,b);

input[15:

0]a,b;

outputwire[31:

0]outcome;

wire[30:

0]temp0;

wire[29:

0]temp1;

wire[28:

0]temp2;

wire[27:

0]temp3;

wire[26:

0]temp4;

wire[25:

0]temp5;

wire[24:

0]temp6;

wire[23:

0]temp7;

wire[22:

0]temp8;

wire[21:

0]temp9;

wire[20:

0]temp10;

wire[19:

0]temp11;

wire[18:

0]temp12;

wire[17:

0]temp13;

wire[16:

0]temp14;

wire[15:

0]temp15;

 

function[15:

0]mult16x1;

input[15:

0]operand;

inputsel;

begin

mult16x1=(sel)?

(operand):

15'b0;

end

endfunction

assigntemp15=mult16x1(a,b[0]);

assigntemp14=((mult16x1(a,b[1]))<<1);

assigntemp13=((mult16x1(a,b[1]))<<2);

assigntemp12=((mult16x1(a,b[1]))<<3);

assigntemp11=((mult16x1(a,b[1]))<<4);

assigntemp10=((mult16x1(a,b[1]))<<5);

assigntemp9=((mult16x1(a,b[1]))<<6);

assigntemp8=((mult16x1(a,b[1]))<<7);

assigntemp7=((mult16x1(a,b[1]))<<8);

assigntemp6=((mult16x1(a,b[1]))<<9);

assigntemp5=((mult16x1(a,b[2]))<<10);

assigntemp4=((mult16x1(a,b[3]))<<11);

assigntemp3=((mult16x1(a,b[4]))<<12);

assigntemp2=((mult16x1(a,b[5]))<<13);

assigntemp1=((mult16x1(a,b[6]))<<14);

assigntemp0=((mult16x1(a,b[7]))<<15);

wire[31:

0]out1,c1,d1;

wire[29:

0]out2;

wire[27:

0]out3,c2;

wire[25:

0]out4;

wire[23:

0]out5,c3,d2;

wire[21:

0]out6;

wire[19:

0]out7,c4;

wire[17:

0]out8;

assignout1=temp0+temp1;

assignout2=temp2+temp3;

assignout3=temp4+temp5;

assignout4=temp6+temp7;

assignout5=temp8+temp9;

assignout6=temp10+temp11;

assignout7=temp12+temp13;

assignout8=temp14+temp15;

assignc1=out1+out2;

assignc2=out3+out4;

assignc3=out5+out6;

assignc4=out7+out8;

assignd1=c1+c2;

assignd2=c3+c4;

assignoutcome=d1+d2;

endmodule

其综合框图部分截图如下图所示。

本设计例化了5个乘法器分别为m0,m1,m2,m3,m4.

mult16m0(.outcome(mout0),.a(x_in),.b(8'd2)),

m1(.outcome(mout1),.a(q1),.b(8'd7)),

m2(.outcome(mout2),.a(q2),.b(8'd8)),

m3(.outcome(mout3),.a(q3),.b(8'd7)),

m4(.outcome(mout4),.a(q4),.b(8'd2));

3、加法器模块

由于本设计只涉及到相加,而没有减法,所以本加法器实现两个32位无符号数的相加运算。

即将输入的两数,在时钟脉冲到来时相加运算,输出结果。

由于加法器相对于乘法器等模块占用的资源少,所以本设计没有再单独设计加法器,而是直接综合出加法器。

●程序代码如下:

moduleadd32(a,b,out);

input[31:

0]a,b;

output[34:

0]out;

assignout=a+b;

endmodule

在本设计中共有4个加法器a1,a2,a3,a4

add32a1(.a(mout0),.b(mout1),.out(aout1)),

a2(.a(aout1),.b(mout2),.out(aout2)),

a3(.a(aout2),.b(mout3),.out(aout3)),

a4(.a(aout3),.b(mout4),.out(aout4));

二、波形仿真

首先用Matlab产生一个周期为16点位宽为16位三角波:

n=1:

7;

x1(n)=n-1;

n=8:

15;

x1(n)=15-n;

x1=x1*100;

x2=uint16(x1);

fid=fopen('E:

/CX/Verilog/design/FIR/FIR1/tri.txt','wt+');

fprintf(fid,'%x\n',x2);

fclose(fid);

产生的三角波如下:

n=1:

15;

subplot(3,1,1);

stem(n,x1);

subplot(3,1,2);

x1fft=fft(x1);

stem(n,abs(x1fft));

三角波时域图

三角波频域图

通过testbench模块将Matlab产生的测试数据tri.txt,将各个模块添加到顶层图中联合测试,最终实现所需要的功能。

测试代码如下所示:

`timescale1ns/1ps

`defineclock50

moduletest;

regclk,reset_n;

reg[15:

0]x_in;

reg[15:

0]data_mem[0:

15];

integeri;

wire[23:

0]y_out;

always#`clockclk=~clk;

initial

begin

clk=0;

reset_n=1;

#20reset_n=0;

#10reset_n=1;

end

initial

begin

$readmemh("tri.txt",data_mem);

end

always@(posedgeclkornegedgereset_n)

begin

if(!

reset_n)begin

x_in<=15'b0;

i<=0;

end

elseif(i<=13)begin

x_in<=data_mem[i];

i<=i+1;

end

elsebegin

x_in<=data_mem[i];

i<=0;

end

end

fir_topfir(.reset_n(reset_n),.clk(clk),.x_in(x_in),.y_out(y_out));

endmodule

产生的仿真波形如下图所示:

v设计

(2)直接型流水线FIR设计

对上述直接实现结构的FIR数字滤波器给出几种使用流水线方法实现的结构

框图,并选择其中一种流水线型FIR数字滤波器进行verilogHDL电路描述及相应testbench,完成功能仿真及时序仿真,给出仿真波形图;

直接型二级流水线结构FIR:

直接型三级流水线结构FIR:

一、流水线设计

以二级流水线为例,在乘法器与加法器中间插入一级寄存器,将电路分为两级,这样可以增加电路的吞吐能力,并且降低了功耗。

电路实现:

在前面直接型结构的基础上,在乘法器模块和加法器模块之间加一级寄存器模块。

1.位寄存器模块

●程序代码如下:

modulereg32(clk,reset_n,in,out);

inputclk,reset_n;

input[31:

0]in;

output[31:

0]out;

reg[31:

0]out;

always@(posedgeclkornegedgereset_n)

begin

if(!

reset_n)

out<=31'd0;

else

out<=in;

end

endmodule

本设计例化了5个32位寄存器,分别为r0,r1,r2,r3,r4.

reg32r0(.clk(clk),.reset_n(reset_n),.in(mout0),.out(re0)),

r1(.clk(clk),.reset_n(reset_n),.in(mout1),.out(re1)),

r2(.clk(clk),.reset_n(reset_n),.in(mout2),.out(re2)),

r3(.clk(clk),.reset_n(reset_n),.in(mout3),.out(re3)),

r4(.clk(clk),.reset_n(reset_n),.in(mout4),.out(re4));

其综合后的结构框图如下图所示:

2.流水线顶层模块

加入流水线后,顶层模块代码如下:

modulefir_top(reset_n,clk,x_in,y_out);

inputclk,reset_n;

input[15:

0]x_in;

output[23:

0]y_out;

wire[15:

0]q1,q2,q3,q4;

wire[31:

0]mout0,mout1,mout2,mout3,mout4;

wire[31:

0]re0,re1,re2,re3,re4;

wire[34:

0]aout1,aout2,aout3,aout4;

dff16D1(.reset_n(reset_n),.clk(clk),.d_in(x_in),.q_out(q1)),

D2(.reset_n(reset_n),.clk(clk),.d_in(q1),.q_out(q2)),

D3(.reset_n(reset_n),.clk(clk),.d_in(q2),.q_out(q3)),

D4(.reset_n(reset_n),.clk(clk),.d_in(q3),.q_out(q4));

mult16m0(.outcome(mout0),.a(x_in),.b(8'd2)),

m1(.outcome(mout1),.a(q1),.b(8'd7)),

m2(.outcome(mout2),.a(q2),.b(8'd8)),

m3(.outcome(mout3),.a(q3),.b(8'd7)),

m4(.outcome(mout4),.a(q4),.b(8'd2));

reg32r0(.clk(clk),.reset_n(reset_n),.in(mout0),.out(re0)),

r1(.clk(clk),.reset_n(reset_n),.in(mout1),.out(re1)),

r2(.clk(clk),.reset_n(reset_n),.in(mout2),.out(re2)),

r3(.clk(clk),.reset_n(reset_n),.in(mout3),.out(re3)),

r4(.clk(clk),.reset_n(reset_n),.in(mout4),.out(re4));

add32a1(.a(re0),.b(re1),.out(aout1)),

a2(.a(aout1),.b(re2),.out(aout2)),

a3(.a(aout2),.b(re3),.out(aout3)),

a4(.a(aout3),.b(re4),.out(aout4));

assigny_out=aout4[34:

11];

endmodule

用QuartusII综合出的框图截图如下:

二、波形仿真

首先用Matlab产生一个周期为16点位宽为16位三角波:

n=1:

7;

x1(n)=n-1;

n=8:

15;

x1(n)=15-n;

x1=x1*100;

x2=uint16(x1);

fid=fopen('E:

/CX/Verilog/design/FIR/FIR2/tri.txt','wt+');

fprintf(fid,'%x\n',x2);

fclose(fid);

产生的三角波如下:

n=1:

15;

subplot(3,1,1);

stem(n,x1);

subplot(3,1,2);

x1fft=fft(x1);

stem(n,abs(x1fft));

三角波时域图

三角波频域图

通过testbench模块将Matlab产生的测试数据tri.txt,将各个模块添加到顶层图中联合测试,最终实现所需要的功能。

测试代码如下所示:

`timescale1ns/1ps

`defineclock50

moduletest;

regclk,reset_n;

reg[15:

0]x_in;

reg[15:

0]data_mem[0:

15];

integeri;

wire[23:

0]y_out;

always#`clockclk=~clk;

initial

begin

clk=0;

reset_n=1;

#20reset_n=0;

#10reset_n=1;

end

initial

begin

$readmemh("tri.txt",data_mem);

end

always@(posedgeclkornegedgereset_n)

begin

if(!

reset_n)begin

x_in<=15'b0;

i<=0;

end

elseif(i<=13)begin

x_in<=data_mem[i];

i<=i+1;

end

elsebegin

x_in<=data_mem[i];

i<=0;

end

end

fir_topfir(.reset_n(reset_n),.clk(clk),.x_in(x_in),.y_out(y_out));

endmodule

产生的仿真波形如下图所示:

v直接结构的FIR数字滤波器流水线型FIR数字滤波器进行性能比较。

直接型FIR资源消耗情况流水线型FIR资源消耗情况

流水线型需要的寄存器数量为165个,是直接型的64个的两倍多。

流水线型消耗了更多的资源。

速度对比:

直接型FIR速度情况

流水线型FIR速度情况

QuartusII的速度分析结果,采样流水线型,速度反而降低了!

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高中教育 > 其它课程

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1