m基于FPGA的分布式FIR滤波器verilog设计,对比普通结构以及DA结构
创始人
2024-03-25 09:43:42
0

目录

1.算法描述

2.仿真效果预览

3.verilog核心程序

4.完整FPGA


1.算法描述

       DA算法的主要特点是,巧妙地利用查找表将固定系数的MAC运算转化为查表操作,其运算速度不随系数和输入数据位数的增加而降低,而且相对直接实现乘法器而言,在硬件规模上得到了极大的改善。

       对于FIR(有限长单位冲激响应)滤波器,其基本结构是一个分节的延时线,每一节的输出加权累加,得到滤波器的输出。其输出y就是输入x和系数h的内积:

将式(3)中的第二部分展开,重新分别求和,这也是“分布式算法”名称的由来,可以得到:

这样就可以将式(3)化简为

       计算h[n]xb[n],就是用查找表实现一个映射,然后再将此映射经过相应的二次幂加权,最后即可得到滤波器的输出。

分布式FIR的实现结构

        图1给出了分布式FIR滤波器最直接的实现结构,虚线为流水线寄存器。对于小位宽的数据来讲,Da算法不仅速度快,而且所占用的芯片资源也很少。

图1 移位加法DA结构

       对于式(4)括号中的每一个乘积项都代表了输入变量的某一位与常量的二进制“与”操作,加号代表了算术和操作,指数因子对括号中的值加权。如果事先构造一个查找表,该表储存了括号中所有可能的组合值,就可以通过所有输入变量相对应的组合向量(xb[N-1], xb[N-2], … ,xb[0])对该表进行寻址。该表结构如表1所示。

        在LUT实现分布式算法是,由于LUT的规模随着N的增加而呈指数增加,如果滤波器系数N过多,则查表的规模十分庞大。为了减小规模,可以利用部分表计算。由于FIR滤波器是线性滤波器,因此低阶滤波器输出可以相加,由此定义一个高阶滤波器的输出。例如,可以把16输入的查找表分割成4个并行的查找表,如图2所示。依次类推,可以将更大的LUT分割成多个小LUT。如果加上流水线,这一结构的改变并不会降低速度,却可以大大减小设计规模。

 下面开始在FPGA中进行设计与实现。

    考虑到,基于DA算的程序,其查找表的复杂度会随着输入的位宽和滤波器的阶数的增加而大大增加,这里,我们在满足设计指标的前提下,将滤波器的输入位宽改为12位,阶数为16阶。

2.仿真效果预览

版本vivado2019.2

滤波器系数结果如下所示:

 综合结果如下所示:

 其仿真结果如下所示:

3.verilog核心程序

 //输入信号寄存器	reg [7:0]		DIN_8b_0;reg [7:0]		DIN_8b_1;reg [7:0]		DIN_8b_2;reg [7:0]		DIN_8b_3;reg [7:0]		DIN_8b_4;reg	[7:0] 	DIN_8b_5;reg [7:0] 	DIN_8b_6;reg [7:0] 	DIN_8b_7;reg [7:0] 	DIN_8b_8;reg [7:0] 	DIN_8b_9;reg [7:0] 	DIN_8b_10;reg [7:0] 	DIN_8b_11;reg [7:0] 	DIN_8b_12;reg [7:0] 	DIN_8b_13;reg [7:0] 	DIN_8b_14;//加法结果暂存器	reg [25:0] temp_1_1,temp_1_2,temp_1_3,temp_1_4;reg [25:0] temp_2_1,temp_2_2;reg [25:0] temp_3;  assign	Dout = temp_3[25:10]; //查找表函数,将与A3,A2,A1,A0对应相乘的各个位进行查找	
function[15:0] look_A3_A0;input [3:0] DIN;begincase(DIN)4'b0000: look_A3_A0=16'h0;4'b0001: look_A3_A0=16'h0;4'b0010: look_A3_A0=16'h65;4'b0011: look_A3_A0=16'h65;4'b0100: look_A3_A0=16'h18f;4'b0101: look_A3_A0=16'h18f;4'b0110: look_A3_A0=16'h1f4;4'b0111: look_A3_A0=16'h1f4;4'b1000: look_A3_A0=16'h35a;4'b1001: look_A3_A0=16'h35a;4'b1010: look_A3_A0=16'h3bf;4'b1011: look_A3_A0=16'h3bf;4'b1100: look_A3_A0=16'h4e9;4'b1101: look_A3_A0=16'h4e9;4'b1110: look_A3_A0=16'h54e;4'b1111: look_A3_A0=16'h54e;endcaseendendfunction//利用查找表对输入的信号进行结果的查找,等到七个结果
always @(posedge CLK or posedge Reset)
beginif(Reset)begin//0lookup0_1 <= 0;lookup0_2 <= 0;lookup0_3 <= 0;lookup0_4 <= 0;sum0_1 <= 0;sum0_2 <= 0;sum0     <= 0;//1lookup1_1 <= 0;lookup1_2 <= 0;lookup1_3 <= 0;lookup1_4 <= 0;sum1_1 <= 0;sum1_2 <= 0;sum1     <= 0;//2lookup2_1 <= 0;lookup2_2 <= 0;lookup2_3 <= 0;lookup2_4 <= 0;sum2_1 <= 0;sum2_2 <= 0;sum2     <= 0;//3lookup3_1 <= 0;lookup3_2 <= 0;lookup3_3 <= 0;lookup3_4 <= 0;sum3_1 <= 0;sum3_2 <= 0;sum3     <= 0;//4lookup4_1 <= 0;lookup4_2 <= 0;lookup4_3 <= 0;lookup4_4 <= 0;sum4_1 <= 0;sum4_2 <= 0;sum4     <= 0;//5lookup5_1 <= 0;lookup5_2 <= 0;lookup5_3 <= 0;lookup5_4 <= 0;sum5_1 <= 0;sum5_2 <= 0;sum5     <= 0;//6lookup6_1 <= 0;lookup6_2 <= 0;lookup6_3 <= 0;lookup6_4 <= 0;sum6_1 <= 0;sum6_2 <= 0;sum6     <= 0;//7lookup7_1 <= 0;lookup7_2 <= 0;lookup7_3 <= 0;lookup7_4 <= 0;sum7_1 <= 0;sum7_2 <= 0;sum7     <= 0;endelseif(count_4b==15)begin
....................................//4lookup4_1 <= look_A3_A0({DIN_8b_12[4],DIN_8b_13[4],DIN_8b_14[4],DIN[4]});lookup4_2 <= look_A7_A4({DIN_8b_8[4],DIN_8b_9[4],DIN_8b_10[4],DIN_8b_11[4]});lookup4_3 <= look_A7_A4({DIN_8b_7[4],DIN_8b_6[4],DIN_8b_5[4],DIN_8b_4[4]});lookup4_4 <= look_A3_A0({DIN_8b_3[4],DIN_8b_2[4],DIN_8b_1[4],DIN_8b_0[4]});sum4_1 <= lookup4_1 + lookup4_2;sum4_2 <= lookup4_3 + lookup4_4;sum4     <= sum4_1 + sum4_2;//5lookup5_1 <= look_A3_A0({DIN_8b_12[5],DIN_8b_13[5],DIN_8b_14[5],DIN[5]});lookup5_2 <= look_A7_A4({DIN_8b_8[5],DIN_8b_9[5],DIN_8b_10[5],DIN_8b_11[5]});lookup5_3 <= look_A7_A4({DIN_8b_7[5],DIN_8b_6[5],DIN_8b_5[5],DIN_8b_4[5]});lookup5_4 <= look_A3_A0({DIN_8b_3[5],DIN_8b_2[5],DIN_8b_1[5],DIN_8b_0[5]});sum5_1 <= lookup5_1 + lookup5_2;sum5_2 <= lookup5_3 + lookup5_4;sum5     <= sum5_1 + sum5_2;//6lookup6_1 <= look_A3_A0({DIN_8b_12[6],DIN_8b_13[6],DIN_8b_14[6],DIN[6]});lookup6_2 <= look_A7_A4({DIN_8b_8[6],DIN_8b_9[6],DIN_8b_10[6],DIN_8b_11[6]});lookup6_3 <= look_A7_A4({DIN_8b_7[6],DIN_8b_6[6],DIN_8b_5[6],DIN_8b_4[6]});lookup6_4 <= look_A3_A0({DIN_8b_3[6],DIN_8b_2[6],DIN_8b_1[6],DIN_8b_0[6]});sum6_1 <= lookup6_1 + lookup6_2;sum6_2 <= lookup6_3 + lookup6_4;sum6     <= sum6_1 + sum6_2;//7lookup7_1 <= look_A3_A0({DIN_8b_12[7],DIN_8b_13[7],DIN_8b_14[7],DIN[7]});lookup7_2 <= look_A7_A4({DIN_8b_8[7],DIN_8b_9[7],DIN_8b_10[7],DIN_8b_11[7]});lookup7_3 <= look_A7_A4({DIN_8b_7[7],DIN_8b_6[7],DIN_8b_5[7],DIN_8b_4[7]});lookup7_4 <= look_A3_A0({DIN_8b_3[7],DIN_8b_2[7],DIN_8b_1[7],DIN_8b_0[7]});sum7_1 <= lookup7_1 + lookup7_2;sum7_2 <= lookup7_3 + lookup7_4;sum7     <= sum7_1 + sum7_2;endelse;
end
01_115m

4.完整FPGA

V

相关内容

热门资讯

AWSECS:访问外部网络时出... 如果您在AWS ECS中部署了应用程序,并且该应用程序需要访问外部网络,但是无法正常访问,可能是因为...
银河麒麟V10SP1高级服务器... 银河麒麟高级服务器操作系统简介: 银河麒麟高级服务器操作系统V10是针对企业级关键业务...
【NI Multisim 14...   目录 序言 一、工具栏 🍊1.“标准”工具栏 🍊 2.视图工具...
不能访问光猫的的管理页面 光猫是现代家庭宽带网络的重要组成部分,它可以提供高速稳定的网络连接。但是,有时候我们会遇到不能访问光...
AWSElasticBeans... 在Dockerfile中手动配置nginx反向代理。例如,在Dockerfile中添加以下代码:FR...
月入8000+的steam搬砖... 大家好,我是阿阳 今天要给大家介绍的是 steam 游戏搬砖项目,目前...
​ToDesk 远程工具安装及... 目录 前言 ToDesk 优势 ToDesk 下载安装 ToDesk 功能展示 文件传输 设备链接 ...
北信源内网安全管理卸载 北信源内网安全管理是一款网络安全管理软件,主要用于保护内网安全。在日常使用过程中,卸载该软件是一种常...
AWS管理控制台菜单和权限 要在AWS管理控制台中创建菜单和权限,您可以使用AWS Identity and Access Ma...
AWR报告解读 WORKLOAD REPOSITORY PDB report (PDB snapshots) AW...