热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

m基于FPGA的分布式FIR滤波器verilog设计,对比普通结构以及DA结构

目录1.算法描述2.仿真效果预览3.verilog核心程序4.完整FPGA1.算法描述DA算法的主要特点是,巧妙地利用查找表将固定系数的MAC运算转化为查表操

目录

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


推荐阅读
  • 不同优化算法的比较分析及实验验证
    本文介绍了神经网络优化中常用的优化方法,包括学习率调整和梯度估计修正,并通过实验验证了不同优化算法的效果。实验结果表明,Adam算法在综合考虑学习率调整和梯度估计修正方面表现较好。该研究对于优化神经网络的训练过程具有指导意义。 ... [详细]
  • 一、Hadoop来历Hadoop的思想来源于Google在做搜索引擎的时候出现一个很大的问题就是这么多网页我如何才能以最快的速度来搜索到,由于这个问题Google发明 ... [详细]
  • 本文介绍了闭包的定义和运转机制,重点解释了闭包如何能够接触外部函数的作用域中的变量。通过词法作用域的查找规则,闭包可以访问外部函数的作用域。同时还提到了闭包的作用和影响。 ... [详细]
  • 本文介绍了九度OnlineJudge中的1002题目“Grading”的解决方法。该题目要求设计一个公平的评分过程,将每个考题分配给3个独立的专家,如果他们的评分不一致,则需要请一位裁判做出最终决定。文章详细描述了评分规则,并给出了解决该问题的程序。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • 本文介绍了如何使用Python正则表达式匹配MATLAB的函数语法,包括多行匹配和跨行签名的处理方法。同时,作者还分享了自己遇到的问题和解决方案。 ... [详细]
  • 去掉空格的方法——Python工程师招聘标准与实践
    本文介绍了去掉空格的方法,并结合2019独角兽企业招聘Python工程师的标准与实践进行讨论。同时提供了一个转载链接,链接内容为更多相关信息。 ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
  • 3.223.28周学习总结中的贪心作业收获及困惑
    本文是对3.223.28周学习总结中的贪心作业进行总结,作者在解题过程中参考了他人的代码,但前提是要先理解题目并有解题思路。作者分享了自己在贪心作业中的收获,同时提到了一道让他困惑的题目,即input details部分引发的疑惑。 ... [详细]
  • 本文详细介绍了如何使用MySQL来显示SQL语句的执行时间,并通过MySQL Query Profiler获取CPU和内存使用量以及系统锁和表锁的时间。同时介绍了效能分析的三种方法:瓶颈分析、工作负载分析和基于比率的分析。 ... [详细]
  • Ihavethefollowingonhtml我在html上有以下内容<html><head><scriptsrc..3003_Tes ... [详细]
author-avatar
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有