【Verilog】7.2.1 Verilog 并行 FIR 滤波器设计
FIR(Finite Impulse Response)滤波器是一种有限长单位冲激响应滤波器,又称为非递归型滤波器。
FIR 滤波器具有严格的线性相频特性,同时其单位响应是有限长的,因而是稳定的系统,在数字通信、图像处理等领域都有着广泛的应用。
FIR 滤波器原理
FIR 滤波器是有限长单位冲击响应滤波器。直接型结构如下:
FIR 滤波器本质上就是输入信号与单位冲击响应函数的卷积,表达式如下:
FIR 滤波器有如下几个特性:
(1) 响应是有限长序列。
(2) 系统函数在 |z| > 0 处收敛,极点全部在 z=0 处,属于因果系统。
(3) 结构上是非递归的,没有输出到输入的反馈。
(4) 输入信号相位响应是线性的,因为响应函数 h(n) 系数是对称的。
(5) 输入信号的各频率之间,相对相位差也是固定不变的。
(6) 时域卷积等于频域相乘,因此该卷积相当于筛选频谱中各频率分量的增益倍数。某些频率分量保留,某些频率分量衰减,从而实现滤波的效果。
并行 FIR 滤波器设计
设计说明
输入频率为 7.5 MHz 和 250 KHz 的正弦波混合信号,经过 FIR 滤波器后,高频信号 7.5MHz 被滤除,只保留 250KHz 的信号。设计参数如下:
输入频率: 7.5MHz 和 250KHz
采样频率: 50MHz
阻带: 1MHz ~ 6MHz
阶数: 15(N-1=15)
由 FIR 滤波器结构可知,阶数为 15 时,FIR 的实现需要 16 个乘法器,15 个加法器和 15 组延时寄存器。为了稳定第一拍的数据,可以再多用一组延时寄存器,即共用 16 组延时寄存器。由于 FIR 滤波器系数的对称性,乘法器可以少用一半,即共使用 8 个乘法器。
并行设计,就是在一个时钟周期内对 16 个延时数据同时进行乘法、加法运算,然后在时钟驱动下输出滤波值。这种方法的优点是滤波延时短,但是对时序要求比较高。
并行设计
设计中使用到的乘法器模块代码,可参考之前流水线式设计的乘法器。
为方便快速仿真,也可以直接使用乘号 * 完成乘法运算,设计中加入宏定义 SAFE_DESIGN 来选择使用哪种乘法器。
FIR 滤波器系数可由 matlab 生成,具体见附录。
/***********************************************************
>> V201001 : Fs:50Mhz, fstop:1Mhz-6Mhz, order: 15
************************************************************/
`define SAFE_DESIGNmodule fir_guide (input rstn, //复位,低有效input clk, //工作频率,即采样频率input en, //输入数据有效信号input [11:0] xin, //输入混合频率的信号数据output valid, //输出数据有效信号output [28:0] yout //输出数据,低频信号,即250KHz);//data en delay reg [3:0] en_r ;always @(posedge clk or negedge rstn) beginif (!rstn) beginen_r[3:0] <= 'b0 ;endelse beginen_r[3:0] <= {en_r[2:0], en} ;endend//(1) 16 组移位寄存器reg [11:0] xin_reg[15:0];reg [3:0] i, j ;always @(posedge clk or negedge rstn) beginif (!rstn) beginfor (i=0; i<15; i=i+1) beginxin_reg[i] <= 12'b0;endendelse if (en) beginxin_reg[0] <= xin ;for (j=0; j<15; j=j+1) beginxin_reg[j+1] <= xin_reg[j] ; //周期性移位操作endendend//Only 8 multipliers needed because of the symmetry of FIR filter coefficient//(2) 系数对称,16个移位寄存器数据进行首位相加reg [12:0] add_reg[7:0];always @(posedge clk or negedge rstn) beginif (!rstn) beginfor (i=0; i<8; i=i+1) beginadd_reg[i] <= 13'd0 ;endendelse if (en_r[0]) beginfor (i=0; i<8; i=i+1) beginadd_reg[i] <= xin_reg[i] + xin_reg[15-i] ;endendend//(3) 8个乘法器// 滤波器系数,已经过一定倍数的放大wire [11:0] coe[7:0] ;assign coe[0] = 12'd11 ;assign coe[1] = 12'd31 ;assign coe[2] = 12'd63 ;assign coe[3] = 12'd104 ;assign coe[4] = 12'd152 ;assign coe[5] = 12'd198 ;assign coe[6] = 12'd235 ;assign coe[7] = 12'd255 ;reg [24:0] mout[7:0]; `ifdef SAFE_DESIGN//流水线式乘法器wire [7:0] valid_mult ;genvar k ;generatefor (k=0; k<8; k=k+1) beginmult_man #(13, 12)u_mult_paral (.clk (clk),.rstn (rstn),.data_rdy (en_r[1]),.mult1 (add_reg[k]),.mult2 (coe[k]),.res_rdy (valid_mult[k]), //所有输出使能完全一致 .res (mout[k]));endendgeneratewire valid_mult7 = valid_mult[7] ;`else//如果对时序要求不高,可以直接用乘号always @(posedge clk or negedge rstn) beginif (!rstn) beginfor (i=0 ; i<8; i=i+1) beginmout[i] <= 25'b0 ;endendelse if (en_r[1]) beginfor (i=0 ; i<8; i=i+1) beginmout[i] <= coe[i] * add_reg[i] ;endendendwire valid_mult7 = en_r[2];
`endif//(4) 积分累加,8组25bit数据 -> 1组 29bit 数据//数据有效延时reg [3:0] valid_mult_r ;always @(posedge clk or negedge rstn) beginif (!rstn) beginvalid_mult_r[3:0] <= 'b0 ;endelse beginvalid_mult_r[3:0] <= {valid_mult_r[2:0], valid_mult7} ;endend`ifdef SAFE_DESIGN//加法运算时,分多个周期进行流水,优化时序reg [28:0] sum1 ;reg [28:0] sum2 ;reg [28:0] yout_t ;always @(posedge clk or negedge rstn) beginif (!rstn) beginsum1 <= 29'd0 ;sum2 <= 29'd0 ;yout_t <= 29'd0 ;endelse if(valid_mult7) beginsum1 <= mout[0] + mout[1] + mout[2] + mout[3] ;sum2 <= mout[4] + mout[5] + mout[6] + mout[7] ;yout_t <= sum1 + sum2 ;endend`else //一步计算累加结果,但是实际中时序非常危险reg signed [28:0] sum ;reg signed [28:0] yout_t ;always @(posedge clk or negedge rstn) beginif (!rstn) beginsum <= 29'd0 ;yout_t <= 29'd0 ;endelse if (valid_mult7) beginsum <= mout[0] + mout[1] + mout[2] + mout[3] + mout[4] + mout[5] + mout[6] + mout[7];yout_t <= sum ;endend
`endifassign yout = yout_t ;assign valid = valid_mult_r[0];endmodule
testbench
testbench 编写如下,主要功能就是不间断连续的输入 250KHz 与 7.5MHz 的正弦波混合信号数据。输入的混合信号数据也可由 matlab 生成,具体见附录。
`timescale 1ps/1psmodule test ;//inputreg clk ;reg rst_n ;reg en ;reg [11:0] xin ;//outputwire valid ;wire [28:0] yout ;parameter SIMU_CYCLE = 64'd2000 ; //50MHz 采样频率parameter SIN_DATA_NUM = 200 ; //仿真周期//=====================================
// 50MHz clk generatinglocalparam TCLK_HALF = 10_000;initial beginclk = 1'b0 ;forever begin# TCLK_HALF ;clk = ~clk ;endend//============================
// reset and finishinitial beginrst_n = 1'b0 ;# 30 rst_n = 1'b1 ;# (TCLK_HALF * 2 * SIMU_CYCLE) ;$finish ;end//=======================================
// read signal data into registerreg [11:0] stimulus [0: SIN_DATA_NUM-1] ;integer i ;initial begin$readmemh("../tb/cosx0p25m7p5m12bit.txt", stimulus) ;i = 0 ;en = 0 ;xin = 0 ;# 200 ;forever begin@(negedge clk) beginen = 1'b1 ;xin = stimulus[i] ;if (i == SIN_DATA_NUM-1) begin //周期送入数据控制i = 0 ;endelse begini = i + 1 ;endendend end fir_guide u_fir_paral (.xin (xin),.clk (clk),.en (en),.rstn (rst_n),.valid (valid),.yout (yout));endmodule
仿真结果
由下图仿真结果可知,经过 FIR 滤波器后的信号只有一种低频率信号(250KHz),高频信号(7.5MHz)被滤除了。而且输出波形是连续的,能够持续输出。
但是,如红圈所示,波形起始部分呈不规则状态,对此进行放大。
波形起始端放大后如下图所示,可见不规则波形的时间段,即两根竖线之间的时间间隔是 16 个时钟周期。
因为数据是串行输入,设计中使用了 16 组延时寄存器,所以滤波后的第一个正常点应该较第一个滤波数据输出时刻延迟 16 个时钟周期。即数据输出有效信号 valid 应该再延迟 16 个时钟周期,则会使输出波形更加完美。
附录:matlab 使用
生成 FIR 滤波器系数
打开 matlab,在命令窗口输入命令: fdatool。
然后会打开如下窗口,按照 FIR 滤波器参数进行设置。
这里选择的 FIR 实现方法是最小二乘法(Least-squares),不同的实现方式滤波效果也不同。
点击 File -> Export
将滤波器参数输出,存到变量 coef 中,如下图所示。
此时 coef 变量应该是浮点型数据。对其进行一定倍数的相乘扩大,然后取其近似的定点型数据作为设计中的 FIR 滤波器参数。这里取扩大倍数为 2048,结果如下所示。
生成输入的混合信号
利用 matlab 生成混合的输入信号参考代码如下。
信号为无符号定点型数据,位宽宽度为 12bit,存于文件 cosx0p25m7p5m12bit.txt。
clear all;close all;clc;
%=======================================================
% generating a cos wave data with txt hex format
%=======================================================fc = 0.25e6 ; % 中心频率
fn = 7.5e6 ; % 杂波频率
Fs = 50e6 ; % 采样频率
T = 1/fc ; % 信号周期
Num = Fs * T ; % 周期内信号采样点数
t = (0:Num-1)/Fs ; % 离散时间
cosx = cos(2*pi*fc*t) ; % 中心频率正弦信号
cosn = cos(2*pi*fn*t) ; % 杂波信号
cosy = mapminmax(cosx + cosn) ; %幅值扩展到(-1,1) 之间
cosy_dig = floor((2^11-1) * cosy + 2^11) ; %幅值扩展到 0~4095
fid = fopen('cosx0p25m7p5m12bit.txt', 'wt') ; %写数据文件
fprintf(fid, '%x\n', cosy_dig) ;
fclose(fid) ;%时域波形
figure(1);
subplot(121);plot(t,cosx);hold on ;
plot(t,cosn) ;
subplot(122);plot(t,cosy_dig) ;%频域波形
fft_cosy = fftshift(fft(cosy, Num)) ;
f_axis = (-Num/2 : Num/2 - 1) * (Fs/Num) ;
figure(5) ;
plot(f_axis, abs(fft_cosy)) ;
相关文章:

【Verilog】7.2.1 Verilog 并行 FIR 滤波器设计
FIR(Finite Impulse Response)滤波器是一种有限长单位冲激响应滤波器,又称为非递归型滤波器。 FIR 滤波器具有严格的线性相频特性,同时其单位响应是有限长的,因而是稳定的系统,在数字通信、图像处理等领域…...

【音视频 | wav】wav音频文件格式详解——包含RIFF规范、完整的各个块解析、PCM转wav代码
😁博客主页😁:🚀https://blog.csdn.net/wkd_007🚀 🤑博客内容🤑:🍭嵌入式开发、Linux、C语言、C、数据结构、音视频🍭 🤣本文内容🤣&a…...

人工智能基础_机器学习012_手写梯度下降代码演示_手动写代码完成梯度下降_并实现梯度下降可视化---人工智能工作笔记0052
可以看到上面我们那个公式,现在我们用梯度下降实现一下,比如我们有一堆数据,但是没有方程的情况下,我们来看一下如果计算,对应的w值也就是seta值对吧,没有方程我们可以使用梯度下降 这里首先我们可以设置一个0.0001.我们知道梯度下降的公式, 梯度下降刚开始的时候,下降会快,然…...

Docker安装部署[8.x]版本Elasticsearch+Kibana+IK分词器
文章目录 Docker安装部署elasticsearch拉取镜像创建数据卷创建网络elasticsearch容器,启动!踩坑:虚拟机磁盘扩容 Docker安装部署Kibana拉取镜像Kibana容器,启动! 安装IK分词器安装方式一:直接从github上下载…...

折纸达珠峰高度(forwhile循环)
对折0.1mm厚度的纸张多少次,高度可达珠峰高度8848180mm。 (本笔记适合熟悉循环和列表的 coder 翻阅) 【学习的细节是欢悦的历程】 Python 官网:https://www.python.org/ Free:大咖免费“圣经”教程《 python 完全自学教程》,不仅…...
探索网络攻防技术:自学之道
在当今数字化时代,网络攻防技术的重要性日益凸显。无论是个人用户还是企业组织,都需要具备一定的网络安全意识和基本技能来应对日益复杂的网络威胁。自学网络攻防技术成为许多人的选择,今天我们将探讨如何高效、有序地自学网络攻防技术。 如果…...

图像二值化阈值调整——cv2.threshold方法
二值化阈值调整:调整是指在进行图像二值化处理时,调整阈值的过程。阈值决定了将图像中的像素分为黑色和白色的界限,大于阈值的像素被设置为白色,小于等于阈值的像素被设置为黑色。 方法一: 取阈值为 127,…...
【C++代码】背包问题,完全背包,多重背包,打家劫舍,动态规划--代码随想录
爬楼梯(plus) 一步一个台阶,两个台阶,三个台阶,…,直到 m个台阶。问有多少种不同的方法可以爬到楼顶呢? 1阶,2阶,… m阶就是物品,楼顶就是背包。每一阶可以重复使用,例如…...
阿里云创始人王坚:云计算和GPT的关系,就是电和电机的关系
10月31日,在2023云栖大会,中国工程院院士、阿里云创始人王坚以《云计算的第三次浪潮》为主题发表演讲,他认为人工智能和云计算的结合,带来云计算的第三次浪潮,它不会在一年、两年完成,它可能会给我们十年、…...

python爬取豆瓣电影Top250数据
本次爬虫案例使用Python语言编写,使用了requests库进行网页请求,使用了BeautifulSoup库进行网页解析,使用了openpyxl库进行数据的保存。 案例中的爬虫目标是豆瓣电影Top250,通过循环访问不同页面进行数据的爬取。在每个页面上&am…...

关键路径及关键路径算法[C/C++]
文章目录 关键路径引例AOE网关键路径与关键活动关键路径算法引例与原理关键路径算法的实现边的存储结构代码实现运行示例 关键路径 关于拓扑排序的内容见拓扑排序详解 引例 通过拓扑排序我们可以解决一个工程是否可以顺序进行的问题,拓扑排序把一个工程分成了若干…...
nginx http 跳转到https
改 Nginx 配置文件 在您安装了 SSL 证书之后,您需要修改 Nginx 的配置文件以启用 HTTPS 和 HTTP 自动跳转 HTTPS。 打开 Nginx 配置文件(通常位于 /etc/nginx/nginx.conf),找到您的网站配置块。在该配置块中添加以下内容&#x…...

可靠的互联网兼职平台,平常可以做副业充实生活
在互联网时代,越来越多的人开始通过网络来寻找兼职副业的机会,能够更灵活地安排自己的时间,实现自己的收入增值。那么找到一个正规可靠的线上兼职平台就是一个比较重要的事情,这里分享几个正规靠谱的线上兼职副业平台,…...

云安全—K8s APi Server 6443 攻击面
0x00 前言 在未授权的一文中,详细描述了k8s api中的8080端口未授权的问题,那么本篇主要来说6443端口的利用。 0x01 API连接攻击面 1.匿名用户访问 匿名开放方式:kubectl create clusterrolebinding cluster-system-anonymous --clusterro…...

【案例实战】NodeJS+Vue3+MySQL实现列表查询功能
这篇文章,给大家带来一个列表查询的功能,从前端到后端的一个综合案例实战。 采用vue3作为前端开发,nodejs作为后端开发。 首先我们先来看一下完成的页面效果。点击分页,可以切换到上一页、下一页。搜索框可以进行模糊查询。 后端…...

Google play开发者账号被封的几种常见原因及相关解决思路
在Google paly上,每天都有大量的应用被成功发布,同时也有很多开发者账号被封禁。特别是在今年的十月份之前,谷歌的"封号潮"给很多开发者带来了沉重的打击。不过,令人欣慰的是,自十月份之后,情况逐…...

深入理解计算机系统CS213学习笔记
Lecture 01 1. 计算机表示数字 int 整数运算可能会出现错误,超过32位时会出现溢出。 float 浮点数不适用结合律,因为浮点数表示的精度有限。 根其原因,是用有限的位数表示无限的数字空间。 2.利用分层的存储系统,使程序运行更…...

【设计模式】第8节:结构型模式之“适配器模式”
一、简介 适配器模式是用来做适配的,它将不兼容的接口转换为可兼容的接口,让原本由于接口不兼容而不能一起工作的类可以一起工作。 适配器模式角色: 请求者client:调用服务的角色目标Target:定义了Client要使用的功…...

Stable Diffusion WebUI扩展openpose-editor如何使用
先上地址: GitHub - fkunn1326/openpose-editor: Openpose Editor for AUTOMATIC1111s stable-diffusion-webuiOpenpose Editor for AUTOMATIC1111s stable-diffusion-webui - GitHub - fkunn1326/openpose-editor: Openpose Editor for AUTOMATIC1111s stable-diffusion-webu…...

企业网络带宽使用情况检查技巧
想要提高网络性能的企业通常会考虑限制对占用带宽的应用程序(如社交媒体和视频流应用程序)的访问,但对于那些真正需要获得高效网络的人来说,这还不够,您需要定期跟踪带宽使用情况。 虽然有许多工具可以帮助您检查网络…...
JVM暂停(Stop-The-World,STW)的原因分类及对应排查方案
JVM暂停(Stop-The-World,STW)的完整原因分类及对应排查方案,结合JVM运行机制和常见故障场景整理而成: 一、GC相关暂停 1. 安全点(Safepoint)阻塞 现象:JVM暂停但无GC日志,日志显示No GCs detected。原因:JVM等待所有线程进入安全点(如…...
稳定币的深度剖析与展望
一、引言 在当今数字化浪潮席卷全球的时代,加密货币作为一种新兴的金融现象,正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而,加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下,稳定…...

九天毕昇深度学习平台 | 如何安装库?
pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子: 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...

CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)
漏洞概览 漏洞名称:Apache Flink REST API 任意文件读取漏洞CVE编号:CVE-2020-17519CVSS评分:7.5影响版本:Apache Flink 1.11.0、1.11.1、1.11.2修复版本:≥ 1.11.3 或 ≥ 1.12.0漏洞类型:路径遍历&#x…...

【网络安全】开源系统getshell漏洞挖掘
审计过程: 在入口文件admin/index.php中: 用户可以通过m,c,a等参数控制加载的文件和方法,在app/system/entrance.php中存在重点代码: 当M_TYPE system并且M_MODULE include时,会设置常量PATH_OWN_FILE为PATH_APP.M_T…...

密码学基础——SM4算法
博客主页:christine-rr-CSDN博客 专栏主页:密码学 📌 【今日更新】📌 对称密码算法——SM4 目录 一、国密SM系列算法概述 二、SM4算法 2.1算法背景 2.2算法特点 2.3 基本部件 2.3.1 S盒 2.3.2 非线性变换 编辑…...

Python环境安装与虚拟环境配置详解
本文档旨在为Python开发者提供一站式的环境安装与虚拟环境配置指南,适用于Windows、macOS和Linux系统。无论你是初学者还是有经验的开发者,都能在此找到适合自己的环境搭建方法和常见问题的解决方案。 快速开始 一分钟快速安装与虚拟环境配置 # macOS/…...

内窥镜检查中基于提示的息肉分割|文献速递-深度学习医疗AI最新文献
Title 题目 Prompt-based polyp segmentation during endoscopy 内窥镜检查中基于提示的息肉分割 01 文献速递介绍 以下是对这段英文内容的中文翻译: ### 胃肠道癌症的发病率呈上升趋势,且有年轻化倾向(Bray等人,2018&#x…...

深入解析光敏传感技术:嵌入式仿真平台如何重塑电子工程教学
一、光敏传感技术的物理本质与系统级实现挑战 光敏电阻作为经典的光电传感器件,其工作原理根植于半导体材料的光电导效应。当入射光子能量超过材料带隙宽度时,价带电子受激发跃迁至导带,形成电子-空穴对,导致材料电导率显著提升。…...

【技巧】dify前端源代码修改第一弹-增加tab页
回到目录 【技巧】dify前端源代码修改第一弹-增加tab页 尝试修改dify的前端源代码,在知识库增加一个tab页"HELLO WORLD",完成后的效果如下 [gif01] 1. 前端代码进入调试模式 参考 【部署】win10的wsl环境下启动dify的web前端服务 启动调试…...