FPGA Verilog移位寄存器应用:边沿检测、信号同步、毛刺滤波

news2024/11/27 18:49:50

文章目录

      • 1. 端口定义
      • 2. 边沿检测
      • 3. 信号同步
      • 4. 信号滤波
      • 5. 源码
      • 6. 总结

输入信号的边沿检测、打拍同步、毛刺滤波处理,是FPGA开发的基础知识,本文介绍基于移位寄存器的方式,实现以上全部功能:上升沿、下降沿、双边沿检测、输入信号同步、信号滤波。

1. 端口定义

首先是信号定义,以下所有功能的实现都是基于此端口定义。

module get_edge(
    //Inputs
    input clk,
    input rst_n,
    input sig_in,
    
    //Outputs
    output sig_rise,
    output sig_fall,
    output sig_edge
);

2. 边沿检测

最常见的边沿检测设计:

reg sig_reg;

assign sig_rise = (sig_in && !sig_reg); //0->1,可读性差
assign sig_fall = (!sig_in && sig_reg); //1->0,可读性差

assign sig_edge = sig_fall | sig_rise;

always @ (posedge clk) begin
    if(!rst_n) begin
        sig_reg <= 0;
    end
    else begin
        sig_reg <= sig_in;
    end
end

仿真结果如下:

如果sig_in是FPGA管脚输入进来的信号,一般还需要进行打拍去除亚稳态,并同步到FPGA内部的时钟域。

使用移位寄存器如何实现呢?

reg [1:0] sig_in_sreg;

assign sig_rise = (sig_in_sreg == 2'b01);
assign sig_fall = (sig_in_sreg == 2'b10);

always @ (posedge clk) begin
    if(!rst_n) begin
        sig_in_sreg <= 'h0;
    end
    else begin
        sig_in_sreg <= (sig_in_sreg << 1) | sig_in;
        // sig_in_sreg <= {sig_in_sreg[1], sig_in};
    end
end

综合出的电路,和上面的方式是一样的,但是可读性会好很多。

3. 信号同步

如果我要先同步,再检测边沿呢?
常规写法:

reg sig_reg1;
reg sig_reg2;
reg sig_reg3;
reg sig_reg4;

assign sig_rise = (sig_reg3 && !sig_reg4); //0->1
assign sig_fall = (!sig_reg3 && sig_reg4); //1->0

assign sig_edge = sig_fall | sig_rise;

always @ (posedge clk) begin
    if(!rst_n) begin
        sig_reg1 <= 0;
        sig_reg2 <= 0;
        sig_reg3 <= 0;
        sig_reg4 <= 0;
    end
    else begin
        sig_reg1 <= sig_in;
        sig_reg2 <= sig_reg1;
        sig_reg3 <= sig_reg2;
        sig_reg4 <= sig_reg3;
    end
end

移位寄存器写法:

reg [3:0] sig_in_sreg;

assign sig_rise = (sig_in_sreg[3:2] == 2'b01);
assign sig_fall = (sig_in_sreg[3:2] == 2'b10);

always @ (posedge clk) begin
    if(!rst_n) begin
        sig_in_sreg <= 'h0;
    end
    else begin
        sig_in_sreg <= (sig_in_sreg << 1) | sig_in;
        // sig_in_sreg <= {sig_in_sreg[3:1], sig_in};
    end
end

效果一样:

4. 信号滤波

同理,基于移位寄存器,还可以实现对输入信号的毛刺滤波,比如滤除1至N个时钟周期的高脉冲或低脉冲毛刺干扰。


reg [4:0] sig_in_sreg;

assign sig_rise = (sig_in_sreg[4:1] == 4'b0011);    //过滤掉1个clk宽度的毛刺
assign sig_fall = (sig_in_sreg[4:1] == 4'b1100);    //过滤掉1个clk宽度的毛刺

assign sig_edge = sig_fall | sig_rise;

always @ (posedge clk) begin
    if(!rst_n) begin
        sig_in_sreg <= 'h0;
    end
    else begin
        sig_in_sreg <= (sig_in_sreg << 1) | sig_in;
        // sig_in_sreg <= {sig_in_sreg[3:1], sig_in};
    end
end


针对连续的宽度为1个clk的高脉冲、低脉冲连续出现,还可以使用以下方式来判断稳定的边沿:

assign sig_rise = (sig_in_sreg[4:1] == 4'b0111);    
assign sig_fall = (sig_in_sreg[4:1] == 4'b1110);    

5. 源码

/***************************************************************
 * Copyright(C), 2010-2023, CSDN @ whik1194
 * ModuleName : get_edge.v 
 * Date       : 2023年7月16日
 * Time       : 14:36:48
 * Author     : https://blog.csdn.net/whik1194
 * Function   : Edge detection of signals 
 * Version    : v1.0
 *      Version | Modify
 *      ----------------------------------
 *       v1.0    .....
 ***************************************************************/

module get_edge(
    //Inputs
    input clk,
    input rst_n,
    input sig_in,
    
    //Outputs
    output sig_rise,
    output sig_fall,
    output sig_edge
);

reg [4:0] sig_in_sreg;

assign sig_rise = (sig_in_sreg[4:1] == 4'b0011);
assign sig_fall = (sig_in_sreg[4:1] == 4'b1100);

assign sig_edge = sig_fall | sig_rise;

always @ (posedge clk) begin
    if(!rst_n) begin
        sig_in_sreg <= 'h0;
    end
    else begin
        sig_in_sreg <= (sig_in_sreg << 1) | sig_in;
    end
end

/*
// signal filter

reg sig_o;
reg [4:0] sig_in_sreg;
reg [1:0] sig_o_sreg;

wire sig_o_rise = (sig_o_sreg == 2'b01);
wire sig_o_fall = (sig_o_sreg == 2'b10);

// 1.Filter of signals 
always @ (posedge clk) begin
    if(!rst_n) begin
        sig_o <= 0;
    end
    else begin
        if(sreg[4:1] == 4'b1111)
            sig_o <= 1;
        else if(sreg[4:1] == 4'b0000)
            sig_o <= 0;
    end
end

// 2.Edge detection of signals  
always @ (posedge clk) begin
    if(!rst_n) begin
        sreg <= 'h0;
        sig_o_sreg <= 'h0;
    end
    else begin
        sreg <= (sreg << 1) | sig_in;
        sig_o_sreg <= (sig_o_sreg << 1) | sig_o;
    end
end
*/

endmodule   //get_edge end

6. 总结

灵活运用移位寄存器,可以使我们的设计更简洁、可读性更好,模块化程度更高。

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

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

相关文章

21.基于注解的自动装配

基于注解的自动装配 通过Autowired注解即可完成自动装配 Autowired注解标识的位置 成员变量上&#xff1a;直接标记Autowired注解即可完成自动装配&#xff0c;不需要提供setXxx()方法成员变量set方法上&#xff1a;直接标记Autowired注解即可完成自动装配成员变量赋值的有参…

C++函数对象与函数指针在sort上的性能测试

最近在比较函数对象和函数指针的性能&#xff0c;看了一些文章&#xff0c;国内的如&#xff1a; https://zhuanlan.zhihu.com/p/579128724 上面这篇文章是在GoogleTest当中进行测试的&#xff0c;其测试结果仅展示了一次&#xff0c;因此我认为不具备说服力&#xff0c;因为我…

风雨中茁壮成长的程序树-深入浅出2023-迟来的总结

起点所在&#xff1b; 反观2021年的时候&#xff0c;入行半年多的当时还是艰难万分啊。真的犹如创业艰难百战多&#xff0c;无数的风雨和重大压力的遭遇&#xff0c;甚至于当时第一家company的时候产生过放弃的念头。 Yes,当时时有产生放弃的念头的。 because当时入行时候的收…

【人工智能】从零开始的口罩识别系统

文章目录 前言第零章 环境准备Python环境安装安装labelimgAI StudioYOLO2COCOPaddleYOLOnumpy 猫狗分类数据集实战数据上传新建项目 前言 本文是从零开始搭建口罩识别系统的学习过程总结&#xff0c;涉及到的软件环境、硬件环境、代码、操作都会一一给出。 第零章 环境准备 …

Python实现PSO粒子群优化算法优化XGBoost分类模型(XGBClassifier算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 PSO是粒子群优化算法&#xff08;Particle Swarm Optimization&#xff09;的英文缩写&#xff0c;是一…

iconfont渐变色实现方案总结

iconfont是前端技术中重要的一环——它能够方便地沉淀大量设计资产&#xff0c;并通过组件化的方式高效地在各种场景复用。而单纯应用iconfont&#xff0c;只能支持到纯色渲染图标&#xff0c;越来越难以满足高品质视觉效果的诉求。本文结合实际工作业务场景&#xff0c;调研了…

大数据面试题:Kafka的消费者和消费者组有什么区别?为什么需要消费者组?

面试题来源&#xff1a; 《大数据面试题 V4.0》 大数据面试题V3.0&#xff0c;523道题&#xff0c;679页&#xff0c;46w字 可回答&#xff1a;1&#xff09;说下Kafka的消费者和消费者组&#xff0c;以及它们的作用是什么&#xff1f; 参考答案&#xff1a; 1、什么是消费…

C++ 测试框架 GoogleTest 初学者入门篇

开发者虽然主要负责工程里的开发任务&#xff0c;但是每个开发完毕的功能都是需要开发者自测通过的&#xff0c;所以经常会听到开发者提起单元测试的话题。那么今天我就带大伙一起来看看大名鼎鼎的谷歌 C 测试框架 GoogleTest. 简单介绍 来看看谷歌官方是怎么介绍这个框架的&am…

数据结构(王卓版)——线性表

数据的存储结构之线性表 1、线性表的定义和特点 线性表的顺序存储结构 总结&#xff1a;

免费音频转文字的软件有哪些?分享这几个给大家!

在今天的数字化时代&#xff0c;音频转文字变得越来越常见和重要。无论是为了记录会议内容、制作字幕&#xff0c;还是为了更方便地查找和检索音频信息&#xff0c;免费的音频转文字软件可以帮助你实现这一目标。以下是几个方法&#xff0c;可以帮助你将音频转换为文字。 方法…

23年进阶高级测试,性能测试超细详解(附面试题+答案)一篇打通

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 用户视角&#xf…

从2050回顾2020,职业规划与技术路径(节选)补充

很多朋友问了其中一段&#xff1a; 文明的提升&#xff0c;源于机械/能源/信息/智能四大模式的转变。机械将自然力或人力更高效利用&#xff0c;如风车&#xff0c;能源以蒸汽机为代表开启工业革命&#xff0c;信息启动了互联网时代&#xff0c;智能将实现虚拟社区的主导模式。…

CS 144 Lab One

CS 144 Lab One 实验结构环境配置如何调试StreamReassembler 实现 对应课程视频: 【计算机网络】 斯坦福大学CS144课程 Lab 1 对应的PDF: Lab Checkpoint 1: stitching substrings into a byte stream 实验结构 这幅图完整的说明了CS144 这门实验的结构&#xff1a; 其中&am…

【C++】多线程编程三(std::mutexstd::mutex、std::lock_guard、std::unique_lock详解)

目录 一、线程间共享数据 1.数据共享和条件竞争 2.避免恶性条件竞争 二、用互斥量来保护共享数据 1. 互斥量机制 2.mutex头文件介绍 三、C中使用互斥量mutex 1. 互斥量mutex使用 2.mutex类成员函数 ① 构造函数 ② lock() ③ unlock() ④ try_lock() 四、使用std::…

本地服务器localhost:3000一直连接不上

1.检查使用端口3000的进程: 在Windows上,运行 netstat -ano | findstr :3000在Mac/Linux上,运行lsof -i :3000 这将列出当前使用端口3000的任何进程。您要终止这些进程以释放该端口。 2.检查防火墙规则: 确保您的防火墙允许连接到localhost:3000。在MacOS和Windows上,通常不…

vue2已有项目迁移vue3踩坑记录

升级部分所需package.json版本&#xff0c;如vue及相关ui 参考vue3项目升级 解决运行报错 configureWebpack: {// webpack pluginsplugins: [// Ignore all locale files of moment.js// new webpack.IgnorePlugin(/^\.\/locale$/, /moment$/), 修改为new webpack.IgnorePlug…

azkaban

访问地址 https://xxx.xxx.xxx.xx:8443/index启动azkaban cd /data/servers/azkaban/executor ./bin/start-exec.sh cd /data/servers/azkaban/server ./bin/start-web.sh修改访问数据库密码 cd /data/servers/azkaban/executor/confvim azkaban.propertiescd /data/servers…

电脑桌面远程连接?外网远程桌面连接内网服务器穿透设置

自己个人电脑远程桌面连接另台服务器时&#xff0c;就可以使用到远程连接的功能&#xff0c;如在公司网络管理员远程连接ERP服务器管理操作。 远程连接就是在远程连接另外一台计算机。当某台计算机开启了远程桌面连接功能后我们就可以在网络的另一端控制这台计算机了&#xff…

人工智能大语言模型微调技术:SFT 监督微调、LoRA 微调方法、P-tuning v2 微调方法、Freeze 监督微调方法

人工智能大语言模型微调技术&#xff1a;SFT 监督微调、LoRA 微调方法、P-tuning v2 微调方法、Freeze 监督微调方法 1.SFT 监督微调 1.1 SFT 监督微调基本概念 SFT&#xff08;Supervised Fine-Tuning&#xff09;监督微调是指在源数据集上预训练一个神经网络模型&#xff…

ORCA优化器浅析——ORCA core流程

DXL query messages is parsed and transformed to an in-memory logical expression tree that is copied-in to the MemoExploration 触发生成逻辑等价表达式的转换规则。探索阶段将新的群组表达式添加到现有组中&#xff0c;并可能创建新的组。Exploration results in addin…