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

文章目录

      • 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. 总结

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

个人使用:Windows下 OpenCV 的下载安装(2021.12.4详细)

一、下载OpenCV   到OpenCV官网Release(发布)板块下载OpenCV-4.5.4 Windows。 下载后是这样的 然后双击他&#xff0c;解压&#xff0c;就是大佬们说的安装&#xff0c;实质就是解压一下&#xff0c;解压完出来一个文件夹&#xff0c;其他什么也没发生。你把这个文件夹放在哪…

STM32(HAL库)驱动SHT30温湿度传感器通过串口进行打印

目录 1、简介 2、CubeMX初始化配置 2.1 基础配置 2.1.1 SYS配置 2.1.2 RCC配置 2.2 软件IIC引脚配置 2.3 串口外设配置 2.4 项目生成 3、KEIL端程序整合 3.1 串口重映射 3.2 SHT30驱动添加 3.3 主函数代 3.4 效果展示 1、简介 本文通过STM32F103C8T6单片机通过HAL库…

uniapp uni实人认证

uni实人认证依赖 目前仅支持App平台。 h5端活体人脸检测&#xff0c;使用的是百度云的h5人脸实名认证 使用要求 1、app端 在使用前&#xff0c;请确保您已注册DCloud账号&#xff0c;并已完成实名认证。 然后需要按文档开通服务 业务开通 | uni-app官网 2、h5端 在使用前…

STM32 ws2812b 最快点灯cubemx

文章目录 前言一、cubemx配置二、代码1.ws2812b.c/ws2812b.h2.主函数 前言 吐槽 想用stm32控制一下ws2812b的灯珠&#xff0c;结果发下没有一个好用的。 emmm&#xff01;&#xff01;&#xff01; 自己来吧&#xff01;&#xff01;&#xff01;&#xff01; 本篇基本不讲原理…

Unity DOTS如何优雅地实现ECS框架下的定时器Timer系统(无对象池,零GC)

实现定时器并不复杂&#xff0c;就是写个类存放回调&#xff0c;再写个类来统一管理这些回调类。但是ECS写代码的方式变了&#xff0c;所以还是有些区别的。 实现过程中需要注意的几点&#xff1a; 1、由于IComponentData不能存放managed类型的数据&#xff0c;所以无法用常规…

C#使用DataGridView模拟绘图

接到一个需求&#xff0c;绘制一个水管线的图片&#xff0c;这种管线可以有12种分段方法&#xff0c;最后将这12种分段方法合并后在一条水管线上展示&#xff0c;要求&#xff1a; ⒈支持分段的属性展示&#xff1b; ⒉要求每个分段都能清晰展示&#xff0c;分段数在0&#xff…

从CPU缓存结构到原子操作

文章目录 一、CPU缓存结构1.1 CPU的多级缓存1.2 Cache Line 二、写回策略三、缓存一致性问题及解决方案3.1 缓存一致性问题3.2 解决方案3.2.1 总线嗅探3.2.2 事务的串行化3.2.3 MESI 四、原子操作4.1 什么是原子操作4.2 c 标准库的原子类型4.2.1 atomic<T\>4.2.2 is_lock…

Python(四):Pycharm的安装配置

❤️ 专栏简介&#xff1a;本专栏记录了我个人从零开始学习Python编程的过程。在这个专栏中&#xff0c;我将分享我在学习Python的过程中的学习笔记、学习路线以及各个知识点。 ☀️ 专栏适用人群 &#xff1a;本专栏适用于希望学习Python编程的初学者和有一定编程基础的人。无…

【基于FPGA的芯片设计】32位RISC-V存储器

实验板卡&#xff1a;xc7a100tlc sg324-2L&#xff0c;共20个开关 实验要求

RabbitMQ常用工作模式+整合springboot

目录 1.MQ的相关概念 1.1 什么是MQ消息中间件 1.2 为什么使用MQ (1) 应用解耦 (2) 异步提速 (3)削峰填谷 1.3 使用MQ的劣势 1.4 常见的MQ组件​​​​​​​ 2. RabbitMQ的概述 2.1 RabbitMQ的概念 2.2 RabbitMQ的原理 2.3 安装RabbitMQ 3. RabbitMQ 的工作模式…

【NLP】Word2Vec原理和认识

一、介绍 Word2Vec是NLP领域的最新突破。Tomas Mikolov是捷克计算机科学家&#xff0c;目前是CIIRC&#xff08;捷克信息学&#xff0c;机器人和控制论研究所&#xff09;的研究员&#xff0c;是word2vec研究和实施的主要贡献者之一。词嵌入是解决NLP中许多问题不可或缺的一部分…

基于B/S架构SaaS服务的实验室信息系统(LIS)

实验室信息系统LIS源码 实验室信息系统&#xff08;Laboratory Information System&#xff09;&#xff0c;简称LIS&#xff0c;是一个全面基于网络化应用&#xff0c;能够帮助用户按照规范内容和规范流程进行多角色、多层次检验信息及资源管理的系统。通过条码管理系统从HIS…

云计算的学习(三)

三、云计算中的网络基础知识 1.虚拟化中网络的架构 1.1虚拟化中网络的架构 二层交换机作为接入交换机使用&#xff0c;三层交换机可以作为汇聚交换机或核心交换机&#xff0c;在抛开网络安全设备时&#xff0c;路由器直接连接在互联网上。 1.2广播和单播 物理服务器内部主要…

Iceberg从入门到精通系列之十七:Apache InLong往Iceberg同步数据

Iceberg从入门到精通系列之十七&#xff1a;Apache InLong往Iceberg同步数据 一、概览二、版本支持三、依赖项四、SQL API 用法五、多表写入六、动态表名映射七、动态建库、建表八、动态schema变更九、Iceberg Load 节点参数十、数据类型映射 一、概览 Apache Iceberg是一种用…

Flutter系列文章-Flutter环境搭建和Dart基础

Flutter是Google推出的一个开源的、高性能的移动应用开发框架&#xff0c;可以用一套代码库开发Android和iOS应用。Dart则是Flutter所使用的编程语言。让我们来看看如何搭建Flutter开发环境&#xff0c;并了解Dart语言的基础知识。 一、Flutter环境搭建 1. 安装Flutter SDK …

springboot+ElasticSearch+Logstash+Kibana实现日志采集ELK

ElasticSearchLogstashKibana日志管理 一、什么是ELK? ELK是Elasticsearch、Logstash、Kibana的简称&#xff0c;这三者是核心套件&#xff0c;但并非全部。一般情况下我们可以把日志保存在日志文件当中&#xff0c;也可以把日志存入数据库当中。但随着业务量的增加&#xf…

搭建 Java 部署环境,部署 Web 项目到 Linux

为了进行部署&#xff0c;把写好的 java web 程序放到 Linux 上&#xff0c;需要先把对应的依赖的软件 (环境) 搭建好&#xff0c;安装一些必要的软件程序 JDKTomcatMySqL jdk 直接使用包管理器进行安装(基于yum安装) 一、yum 1、认识 yum yum (Yellow dog Updater, Modified…

6. Java + Selenium 环境搭建

前提&#xff1a;Java 版本最低要求为 8&#xff1b;推荐使用 chrome 浏览器 chrome Java 1. 下载 chrome 浏览器&#xff08;推荐&#xff09; 2. 查看 chrome 浏览器版本 重点记住前两位即可。 3. 下载 chrome 浏览器驱动 下载链接&#xff1a; https://chromedriver.…

我爱学QT-仿写智能家居界面 上 中 下

学习链接&#xff1a; 仿写一个智能家居界面&#xff08;上&#xff09;_哔哩哔哩_bilibili 上 给QT工程添加资源文件 在这里 然后选这个&#xff0c;choose后会有起名&#xff0c;之一千万不能是中文&#xff0c;要不就等报错吧 然后把你要添加的图片托到文件夹下&#xf…

云计算基础教程(第2版)笔记——基础篇与技术篇介绍

文章目录 前言 第一篇 基础篇 一 绪论 1.1 云计算的概念以及特征 1.1.1云计算的基本概念 1.1.2云计算的基本特征 1.2 云计算发展简史 1.3 三种业务模式介绍 1. 基础设施即服务&#xff08;IaaS&#xff09; 2. 平台即服务&#xff08;PaaS&#xff09; 3. 软…