1、VLSI结课设计报告分布式算法FIR滤波器 学院:班级:姓名:学号:指导老师:一、设计目的1熟悉FPGA设计基本方法2掌握用Verilog语言设计一个数字滤波器二、设计原理与方法 目前FIR滤波器的实现方法有三种:利用单片通用数字滤波器集成电路、DSP器件和可编程逻辑器件实现。单片通用数字滤波器使用方便,但由于字长和阶数的规格较少,不能完全满足实际需要。使用DSP器件实现虽然简单,但由于程序顺序执行,执行速度必然不快。FPGA有着规整的内部逻辑阵列和丰富的连线资源,特别适合于数字信号处理任务,相对于串行运算为主导的通用DSP芯片来说,其并行性和可扩展性更好。但长期以来,FPGA一直被用于系统逻
2、辑或时序控制上,很少有信号处理方面的应用,其原因主要是因为在FPGA中缺乏实现乘法运算的有效结构。现在这个问题得到了解决,使FPGA在数字信号处理方面有了长足的发展。分布式算法(Distributed Arithmetic,DA)是一种已实现乘加运算为目的的运算方法。它与传统实现乘加运算算法的不同之处在于:执行部分积运算的先后顺序不同。简单地说,分布式算法在完成乘加功能时是通过将各输入数据每一对应位产生的部分积预先进行相加形成相应部分积,然后再对各部分积进行累加形成最终结果;而传统算法是等到所有乘积产生之后再进行相加来完成乘加运算的。与传统算法相比,分布式算法可极大地减少硬件电路规模,很容易实
3、现流水线处理,提高电路的执行速度。在实际中,不仅是对于滤波器方面,在卷积、相关、DFT等有乘累加运算的地方,都可以使用这种方法实现。DA设计的先决条件是滤波器的系数hi可以通过运算得到,那么在技术部分乘积项hi*xn-1就变成了一个常数乘法(也就是缩放)。DA算法的主要特点是,巧妙地利用查找表将固定系数的MAC运算转化为查表操作,其运算速度不随系数和输入数据位数的增加而降低,而且相对直接实现乘法器而言,在硬件规模上得到了极大的改善。分布式FIR算法原理分布式算法是在30年前被首次提出的,但直到Xilinx公司发明FPGA的查找表结构以后,DA算法才广泛应用在计算乘积和之中。对于FIR(有限长单
4、位冲激响应)滤波器,其基本结构是一个分节的延时线,每一节的输出加权累加,得到滤波器的输出。其输出y就是输入x和系数h的内积: (1)输入数据xn可以采用B+1位补码来表示,即 (2)因为系数h为已知常数,则内积y可以写成: (3)将式(3)中的第二部分展开,重新分别求和,这也是“分布式算法”名称的由来,可以得到:(4) 这样就可以将式(3)化简为 (5)计算hnxbn,就是用查找表实现一个映射,然后再将此映射经过相应的二次幂加权,最后即可得到滤波器的输出。分布式FIR的实现结构 图1给出了分布式FIR滤波器最直接的实现结构,虚线为流水线寄存器。对于小位宽的数据来讲,Da算法不仅速度快,而且所占
5、用的芯片资源也很少。XB-10 X10 X00XB-11 X11 X01XB-1N-1 X1N-1 X0N-1LUT+/-寄存器Z-1图1 移位加法DA结构对于式(4)括号中的每一个乘积项都代表了输入变量的某一位与常量的二进制“与”操作,加号代表了算术和操作,指数因子对括号中的值加权。如果事先构造一个查找表,该表储存了括号中所有可能的组合值,就可以通过所有输入变量相对应的组合向量(xbN-1, xbN-2, ,xb0)对该表进行寻址。该表结构如表1所示。表1 构造规则 在LUT实现分布式算法是,由于LUT的规模随着N的增加而呈指数增加,如果滤波器系数N过多,则查表的规模十分庞大。为了减小规模,
6、可以利用部分表计算。由于FIR滤波器是线性滤波器,因此低阶滤波器输出可以相加,由此定义一个高阶滤波器的输出。例如,可以把16输入的查找表分割成4个并行的查找表,如图2所示。依次类推,可以将更大的LUT分割成多个小LUT。如果加上流水线,这一结构的改变并不会降低速度,却可以大大减小设计规模。XB-10 X10 X00XB-13 X13 X03LUT+/-寄存器Z-1XB-10 X10 X00XB-13 X13 X03XB-10 X10 X00XB-13 X13 X03XB-10 X10 X00XB-13 X13 X03LUTLUTLUT+图2 简化规模的DA结构三、FIR滤波器的具体设计方法本设
7、计是使用Verilog实现一个8阶对称系数的FIR滤波器,其系数分别是41,132,341,510,341,132,41。该本滤波器的输入为12比特,先把相同系数对应的数据相加,输入到滤波器的数据经过符号位的扩展后变成13比特。这样可以看成是一个阶的FIR滤波器,减小了构造表的复杂度。 设计程序:module fir1(clk,reset,fir_in,fir_in_reg,fir_out,divfre_count_4b,divfre13_clk);parameter S0=1d0; /初始状态parameter S1=1d1; /处理状态input clk;input reset;input
8、11:0fir_in;output12:0fir_out;output11:0fir_in_reg;output3:0divfre_count_4b;output divfre13_clk;reg12:0fir_out;reg11:0fir_in_reg;reg12:0shift_buf7:0;reg12:0add_buf3:0;/reg12:0state_shift_buf4-1:0; reg12:0state_shift_buf0;reg12:0state_shift_buf1;reg12:0state_shift_buf2;reg12:0state_shift_buf3;wire3:0t
9、able_4b;wire11:0table_out_12b;reg12:0sum;reg STATE;reg3:0divfre_count_4b;reg divfre13_clk;integer i,j,k,l,m,n,p;always(posedge clk or negedge reset)begin if(!reset) begin divfre13_clk=1b0; divfre_count_4b=4b0000; /14分频 end else begin if(divfre_count_4b=13) begin divfre_count_4b=4b0000; divfre13_clk=
10、1b1; end else begin divfre_count_4b=divfre_count_4b+1b1; /计数 divfre13_clk=1b0; end endendalways (posedge clk or negedge reset) /数据输入begin if(!reset) fir_in_reg=12b0000_0000_0000; else if(divfre13_clk) fir_in_reg=fir_in;end always (posedge clk or negedge reset)begin if(!reset) for(i=0;i=7;i=i+1) shif
11、t_bufi=13b0000_0000_00000; else if(divfre13_clk) beginfor(j=0;j8-1;j=j+1)shift_bufj+1= shift_bufj;shift_buf0=fir_in_reg11,fir_in_reg; endendalways (posedge clk or negedge reset)begin if(!reset) for(k=0;k=4-1;k=k+1) add_bufk=13b0000_0000_00000; else if(divfre13_clk) for(l=0;l=3;l=l+1) add_bufl=shift_
12、bufl+shift_buf7-1;endalways (posedge clk or negedge reset) /有限状态机初始化,比特移位begin if(!reset) begin /for(m=0;m=4-1;m=m+1) /state_shift_bufm=13b0000_0000_00000;state_shift_buf0=13b0000_0000_00000;state_shift_buf1=13b0000_0000_00000;state_shift_buf2=13b0000_0000_00000;state_shift_buf3=13b0000_0000_00000;
13、STATE=S0; end else case(STATE) S0:begin /初始状态 / for(n=0;n=4-1;n=n+1) /state_shift_bufn= add_bufn;state_shift_buf0=add_buf0;state_shift_buf1=add_buf1;state_shift_buf2=add_buf2;state_shift_buf3=add_buf3; STATE=S1; end S1:begin /处理状态 if(divfre_count_4b=4b1101) STATE=S0; else begin for(p=0;p=11;p=p+1) b
14、egin state_shift_buf0p=state_shift_buf0p+1; state_shift_buf1p=state_shift_buf1p+1; state_shift_buf2p=state_shift_buf2p+1; state_shift_buf3p=state_shift_buf3p+1; end STATE=S1; end end endcaseend assign table_4b0=state_shift_buf00;assign table_4b1=state_shift_buf10;assign table_4b2=state_shift_buf20;a
15、ssign table_4b3=state_shift_buf30;DA_table U_DA( .table_in_4b(table_4b), .table_out_12b(table_out_12b) ); wire26:0sign_ex=table_out_12b11,table_out_12b11,table_out_12b11, table_out_12b11,table_out_12b11,table_out_12b11, table_out_12b11,table_out_12b11,table_out_12b11, table_out_12b11,table_out_12b11
16、,table_out_12b11, table_out_12b11,table_out_12b11,table_out_12b11, table_out_12b; always (posedge clk or negedge reset)begin if(!reset) sum=27b0; else if(divfre_count_4b=4b0000) sum=27b0; else if(divfre_count_4b=4b1101) sum=sum-delta(sign_ex,divfre_count_4b-4b0001); else sum=sum+delta(sign_ex,divfre
17、_count_4b-4b0001); endalways (posedge clk or negedge reset)begin if(!reset) fir_out=27b0; else if(divfre_count_4b=4b0000) fir_out=sum; /滤波器输出endfunction13-1:0delta; /定义移位寄存器左移 input13-1:0IQ; input3:0pipe; begin case(pipe) 4b0000:delta=IQ; 4b0001:delta=IQ13-2:0,1b0; 4b0010:delta=IQ13-3:0,2b00; 4b0011
18、:delta=IQ13-4:0,3b000; 4b0100:delta=IQ13-5:0,4b0000; 4b0101:delta=IQ13-6:0,5b00000; 4b0110:delta=IQ13-7:0,6b000000; 4b0111:delta=IQ13-8:0,7b0000000; 4b1000:delta=IQ13-9:0,8b00000000; 4b1001:delta=IQ13-10:0,9b000000000; 4b1010:delta=IQ13-11:0,10b0000000000; 4b1011:delta=IQ13-12:0,11b00000000000; 4b11
19、00:delta=IQ13-13:0,12b000000000000; /4b1101:delta=IQ13-14:0,13b0000000000000; /4b1110:delta=IQ13-15:0,14b00000000000000; /4b1111:delta=IQ13-16:0,15b000000000000000; default:delta=IQ; endcase endendfunctionendmodulemodule DA_table(table_in_4b,table_out_12b);input 3:0 table_in_4b;output 11:0 table_out
20、_12b;reg11:0 table_out_12b; always (table_in_4b) begin case(table_in_4b) 4b0000:table_out_12b=0; 4b0001:table_out_12b=41; 4b0010:table_out_12b=132; 4b0011:table_out_12b=173; 4b0100:table_out_12b=341; 4b0101:table_out_12b=382; 4b0110:table_out_12b=473; 4b0111:table_out_12b=514; 4b1000:table_out_12b=5
21、10; 4b1001:table_out_12b=551; 4b1010:table_out_12b=642; 4b0011:table_out_12b=683; 4b1100:table_out_12b=851; 4b1101:table_out_12b=892; 4b1110:table_out_12b=983; 4b1111:table_out_12b=1024; default:table_out_12b=0; endcaseendendmodule 为了可以方便的判断程序输出结果的正确性,我们在仿真时采用了几个简单的数据作为采样后的数据输入。分别采用:1,2,3作为输入,则经过三次计算对应的输出应为41,241,728,十六进制数为29h,D6h,28Dh。与乘累加方式FIR滤波算法得出的结果完全一致。输入后的波形如下图:本文来自网络,版权归原作者所有,请下载后,尽快删除。11