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

news2024/11/17 17:22:41

目录

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;
	  begin
	  	case(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;
			endcase
		end
	endfunction
	  	  
 
 
//利用查找表对输入的信号进行结果的查找,等到七个结果
always @(posedge CLK or posedge Reset)
begin
		if(Reset)
			begin
						//0
						lookup0_1 <= 0;
            lookup0_2 <= 0;
            lookup0_3 <= 0;
            lookup0_4 <= 0;
            sum0_1 <= 0;
            sum0_2 <= 0;
            sum0     <= 0;
            //1
            lookup1_1 <= 0;
            lookup1_2 <= 0;
            lookup1_3 <= 0;
            lookup1_4 <= 0;
            sum1_1 <= 0;
            sum1_2 <= 0;
            sum1     <= 0;
            //2
            lookup2_1 <= 0;
            lookup2_2 <= 0;
            lookup2_3 <= 0;
            lookup2_4 <= 0;
            sum2_1 <= 0;
            sum2_2 <= 0;
            sum2     <= 0;
            //3
            lookup3_1 <= 0;
            lookup3_2 <= 0;
            lookup3_3 <= 0;
            lookup3_4 <= 0;
            sum3_1 <= 0;
            sum3_2 <= 0;
            sum3     <= 0;
            //4
            lookup4_1 <= 0;
            lookup4_2 <= 0;
            lookup4_3 <= 0;
            lookup4_4 <= 0;
            sum4_1 <= 0;
            sum4_2 <= 0;
            sum4     <= 0;
            //5
            lookup5_1 <= 0;
            lookup5_2 <= 0;
            lookup5_3 <= 0;
            lookup5_4 <= 0;
            sum5_1 <= 0;
            sum5_2 <= 0;
            sum5     <= 0;
            //6
            lookup6_1 <= 0;
            lookup6_2 <= 0;
            lookup6_3 <= 0;
            lookup6_4 <= 0;
            sum6_1 <= 0;
            sum6_2 <= 0;
            sum6     <= 0;
            //7
            lookup7_1 <= 0;
            lookup7_2 <= 0;
            lookup7_3 <= 0;
            lookup7_4 <= 0;
            sum7_1 <= 0;
            sum7_2 <= 0;
            sum7     <= 0;
          end
		else
			if(count_4b==15)
			begin
....................................
          	//4
          	lookup4_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;
          	//5
          	lookup5_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;
          	//6
          	lookup6_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;
          	//7
          	lookup7_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;
          end
         else;
end
01_115m

4.完整FPGA

V

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/70534.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

软件测试面试技巧有哪些?这几点你得知道,不然后悔都来不及

新手测试技术不过硬&#xff0c;最害怕hr在面试时&#xff0c;问到技术方面的问题&#xff0c;那么在进行软件测试面试时&#xff0c;有哪些软件测试面试技巧可以帮助测试人&#xff0c;提高面试通过率呢&#xff1f; 接下来我就给大家总结了几个方面的面试技巧&#xff0c;希望…

【车载开发系列】UDS诊断---写入数据($0x2E)

【车载开发系列】UDS诊断—写入数据&#xff08;$0x2E&#xff09; UDS诊断---写入数据&#xff08;$0x2E&#xff09;【车载开发系列】UDS诊断---写入数据&#xff08;$0x2E&#xff09;一.概念定义二.应用场景三.报文格式1&#xff09;请求报文2&#xff09;肯定响应3&#x…

技术合集 | 【MySQL技术专题】「数据库锁技术」深入浅出透析MySQL数据库的锁基础概念和原理(上下全)

上篇 前提介绍 在计算机科学中&#xff0c;锁是在执行多线程时用于强行限制资源访问的同步机制&#xff0c;即用于在并发控制中保证对互斥要求的满足。 本文内容 本文主要介绍&#xff1a;行级锁、表级锁、页级锁的相关概念以及原理介绍 本文主要介绍&#xff1a;共享锁、排它…

论文速读系列二:YOLO3D、PIXOR、HDNET、Voxel-FPN、Fast Point RCNN

如有错误&#xff0c;恳请指出。 参考网上资料&#xff0c;对一些经典论文进行快速思路整理 文章目录1. YOLO3D2. PIXOR3. HDNET&#xff08;PIXOR&#xff09;4. Voxel-FPN5. Fast Point RCNN1. YOLO3D paper&#xff1a;《YOLO3D: End-to-end real-time 3D OrientedObject B…

领英怎么用多个账号一起开发客户?进阶知识

1.如何注册账号&#xff1f; LinkedIn经历调整 2021年12月14日起&#xff0c;领英(LinkedIn)正式被改版为领英职-场。在改版后的领英职-场上&#xff0c;我们既无法进行主动搜-索客户&#xff0c;添-加好友&#xff0c;也无法查看和发布动态内容&#xff0c;完完全全的变成了一…

ChatGPT 常见错误原因及解决方案:报错、回答不完整等

最近&#xff0c;由人工智能实验室 OpenAI 发布的对话式大型语言模型 ChatGPT 火得一塌糊涂。它可以与人类轻松地对话&#xff0c;无论是多么奇葩的问题 ChatGPT 都不在话下。在体验 ChatGPT 的同时我们也会遇到各种各样的问题&#xff0c;这里我总结了其对话过程中可能会发生的…

springboot中如何实现跨域请求

Springboot中如何处理跨域请求 一.什么是跨域? 我们知道Url的一般格式&#xff1a;协议 域名&#xff08;子域名 主域名&#xff09; 端口号 资源地址 比如&#xff1a; https://www.itquanmingxing.cn:8080/users 是由https www itquanmingxing.cn 8080 users组成…

普通程序员可以怎么做搞钱程序?

最近海洋问题实在是很严重&#xff0c;人类活动带来的垃圾污染等问题使海洋生物得到了很大的压力。 每年鱼类等海洋生物体内的塑料海量越来越多&#xff0c;不仅仅是由于日常人类日常使用的垃圾袋引起的。 还有很多方面的原因&#xff0c;最直接的因素就是去看海的游客遗留下…

云计算自学笔记(不定期更新)

管道命令使用 linux管道相关命令__小笼包_的博客-CSDN博客_linux管道命令 [cut ]&#xff1a;命令的功能是用于按列提取文件内容 按照字符提取命令&#xff1a;head -2 2.txt | cut -c 5 查看前两行&#xff0c;并按照字符提取第五个字符 -c 按照字符提取 截取出…

剑指Offer40——最小的k个数

摘要 剑指 Offer 40. 最小的k个数 一、排序方法 1.1 排序的方法分析 对原数组从小到大排序后取出前 k 个数即可。 1.2 复杂度分析 时间复杂度&#xff1a;O(nlog⁡n)O&#xff0c;其中 n 是数组 arr 的长度。算法的时间复杂度即排序的时间复杂度。 空间复杂度&#xff1a;…

MQ高级(四)MQ集群

一、集群分类 RabbitMQ的是基于Erlang语言编写&#xff0c;而Erlang又是一个面向并发的语言&#xff0c;天然支持集群模式。 RabbitMQ的集群有两种模式&#xff1a; &#xff08;1&#xff09;普通集群&#xff1a;是一种分布式集群&#xff0c;将队列分散到集群的各个节点&…

【Flink】复杂事件处理CEP底层实现(有限状态机)和应用

文章目录一 Flink CEP简介1 什么是复杂事件处理CEP2 Flink CEP&#xff08;1&#xff09;导入依赖&#xff08;2&#xff09;代码编写&#xff08;3&#xff09;优化模板3 实现CEP底层 -- 有限状态机4 使用CEP处理超时事件一 Flink CEP简介 1 什么是复杂事件处理CEP 一个或多…

239页11万字新型智慧城市运营中心IOC大数据平台建设方案

目录 1 概述 1.1 建设目标 1.2 建设内容 1.3 建设步骤 2 项目建设方案 2.1 总体设计方案 2.2 支撑平台方案 2.2.1 数据治理平台 2.2.2 可视化平台 2.2.3 城市感知平台 2.3 应用系统方案 2.3.1 综合监测系统 2.3.2 事件管理系统 2.3.3 联动指挥系统 2.3.4 辅助决策…

自定义镜像上传阿里云

目录标题一、Docker制作jdk镜像1.jdkv.1.0的制作1.1创建文件夹上传jdk的安装包,和在同级目录下编写Dockerfile文件1.2.编写 Dockerfile 文件1.3.执行Dockerfile文件&#xff0c;初次依赖镜像的时候会下载相应镜像2.jdk2.0的制作3.jdk3.0的制作二、Docker镜像上传至阿里云前期准…

19.5 迭代器的概念和分类

一&#xff1a;迭代器基本概念&#xff1a;第十三章第九节 迭代器&#xff1a;是一个“可遍历STL容器全部或者部分元素”的对象&#xff08;行为类似于指针的对象&#xff09;&#xff1b; 迭代器用来表现容器中的某一位置&#xff1b;迭代器紧密依赖于容器&#xff0c;迭代器…

2023年天津仁爱学院专升本动画、化学工程与工艺专业介绍

2023年天津仁爱学院专升本专业课动画专业、化学工程与工艺专业介绍 &#xff08;一&#xff09;动画专业 动画专业以行业发展对应用型人才需求为导向&#xff0c;不断提高学生就业质量为目标&#xff0c;针对学生特点&#xff0c;积极拓展动画应用领域&#xff0c;设有影视后期…

JSP SSH超市管理统myeclipse开发mysql数据库MVC模式java编程计算机网页设计

一、源码特点 JSP 超市管理统是一套完善的web设计系统&#xff08;系统采用ssh框架进行设计开发&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发 JSP SSH超市管理统myeclipse开发…

【Leetcode每日一题】子序列宽度之和,匹配子序列的单词数,最大平均值和的分组

891. 子序列宽度之和 计算的是【贡献】。 首先观察发现&#xff0c;顺序不影响结果。然后比如1&#xff0c;作为最大元素贡献为0&#xff0c;而作为最小元素贡献为每个子序列的【最大-1】&#xff0c;一共有多少个作为最小元素的子序列&#xff0c;对答案的贡献就是-1*(个数)。…

【✨十五天搞定电工基础】正弦交流电路的分析(下)

目录 五、复杂正弦交流电路的分析&#xff08;下&#xff09; 六、功率因数的提高 七、谐振电路 1、串联谐振 2、并联谐振 八、课后习题 1、正弦量三要素&#xff0c;相位 2、RLC串联问题 3、复杂正弦交流电路问题 4、谐振问题 五、复杂正弦交流电路的分析&#x…

Metabase学习教程:权限-4

高级数据沙盒&#xff1a;限制对列的访问 了解如何使用已保存的SQL查询对表进行沙盒处理&#xff0c;并根据用户属性限制用户可以查看的列。 我们的文章行权限涵盖了沙盒&#xff08;商业版本). 我们将沙盒定义为一种根据用户身份指定用户可以访问哪些数据的方法&#xff0c;…