当前位置: 首页 > news >正文

009---基于Verilog HDL的单比特信号边沿检测

文章目录

  • 摘要
  • 一、边沿检测
  • 二、时序逻辑实现
    • 2.1 rtl
    • 2.2 tb
  • 三、组合逻辑实现
    • 3.1 rtl
    • 3.2 tb


摘要

文章为学习记录。采用时序逻辑和组合逻辑实现边沿检测的核心逻辑。组合逻辑实现的上升沿和下降沿的脉冲比时序逻辑实现的上升沿和下降沿的脉冲提前一拍。


一、边沿检测

边沿检测主要作用是能够准确的识别出单比特信号的上升沿或下降沿。
边沿检测原理:利用寄存器对信号前一状态和后一状态进行寄存,若前后两个状态不同,则检测到了边沿。

二、时序逻辑实现

仿真波形如下图所示。
在这里插入图片描述

2.1 rtl

module edge_dect(
input  wire  clk,
input  wire  rst_n,
input  wire  data,output reg   pos_edge,
output reg   neg_edge);reg  data_reg1;
reg  data_reg2;
reg  data_reg3;always @(posedge clk or negedge rst_n)
beginif(!rst_n)begindata_reg1 <= 0;data_reg2 <= 0;data_reg3 <= 0;endelsebegindata_reg1 <= data;data_reg2 <= data_reg1;data_reg3 <= data_reg2;end
endalways @(posedge clk or negedge rst_n)
beginif(rst_n == 1'b0)pos_edge <= 1'b0;else if(data_reg2 && (~data_reg3)) pos_edge <= 1'b1;else pos_edge <= 1'b0;
endalways @(posedge clk or negedge rst_n)
beginif(rst_n == 1'b0)neg_edge <= 1'b0;else if((~data_reg2) && data_reg3) neg_edge <= 1'b1;else neg_edge <= 1'b0;
endendmodule

2.2 tb

module tb_edge_dect();

reg clk;
reg rst_n;
reg data;

wire pos_edge;
wire neg_edge;

initial
begin
rst_n = 0;
data = 0;
#101;
rst_n = 1;
#200;
data = 1;
#500;
data = 0;
#200;
$stop;
end

initial
begin
clk = 1;
end
always #10 clk = ~clk;

edge_dect edge_dect_inst1
(
. clk(clk),
. rst_n(rst_n),
. data(data),

. pos_edge(pos_edge),
. neg_edge(neg_edge)
);

endmodule

三、组合逻辑实现

仿真波形如下图所示。
在这里插入图片描述

3.1 rtl

module edge_dect(
input  wire  clk,
input  wire  rst_n,
input  wire  data,output wire   pos_edge,
output wire   neg_edge);reg  data_reg1;
reg  data_reg2;
reg  data_reg3;always @(posedge clk or negedge rst_n)
beginif(!rst_n)begindata_reg1 <= 0;data_reg2 <= 0;data_reg3 <= 0;endelsebegindata_reg1 <= data;data_reg2 <= data_reg1;data_reg3 <= data_reg2;end
endassign pos_edge = data_reg2 && (~data_reg3);
assign neg_edge = ~data_reg2 && data_reg3;
//always @(posedge clk or negedge rst_n)
//begin
//    if(rst_n == 1'b0)
//       pos_edge <= 1'b0;
//    else if(data_reg2 && (~data_reg3)) 
//       pos_edge <= 1'b1;
//   else 
//       pos_edge <= 1'b0;
//end//always @(posedge clk or negedge rst_n)
//begin
//    if(rst_n == 1'b0)
//       neg_edge <= 1'b0;
//    else if((~data_reg2) && data_reg3) 
//       neg_edge <= 1'b1;
//   else 
//       neg_edge <= 1'b0;
//endendmodule

3.2 tb

tb文件与时序逻辑实现的tb文件一样。

http://www.lryc.cn/news/546149.html

相关文章:

  • 2025全开源Java多语言跨境电商外贸商城/Tk/FB内嵌商城I商家入驻I批量下单I完美运行
  • iOS实现一个强大的本地状态记录容器
  • 【mysql】有索引和没有索引字段更新时锁的不同
  • 机器学习的三个基本要素
  • 神经机器翻译:联合学习对齐和翻译
  • [Web 安全] PHP 反序列化漏洞 —— PHP 魔术方法
  • 聆听PostgreSQL数据库的使用
  • 2025嵌入式软件开发工程师--音频方向
  • C#释放内存空间的方法
  • 《鸢尾花数学大系:从加减乘除到机器学习》开源资源
  • 如何将一台服务器的pip环境迁移到另一个机器?
  • Java 入门 (超级详细)
  • 计算机基础面试(数据结构)
  • DBGPT安装部署使用
  • 【蓝桥杯单片机】第十二届省赛
  • 开源嵌入式实时操作系统NuttX介绍
  • 阿里云服务器部署项目笔记 实操 centos7.9
  • Java-实现PDF合同模板填写内容并导出PDF文件
  • Docker安装Grafana数据可视化平台
  • MyBatis-Plus 自动填充功能
  • 解决redis lettuce连接池经常出现连接拒绝(Connection refused)问题
  • 武汉大学生命科学学院与谱度众合(武汉)生命科技有限公司举行校企联培座谈会
  • 4.网络技术与应用
  • Kafka 主题 retention.ms 配置修改及深度问题排查指南
  • React实现无缝滚动轮播图
  • deepseek+mermaid【自动生成流程图】
  • 分布式锁的简单实现
  • C语言(19)----------->函数(2)
  • 动态扩缩容引发的JVM堆内存震荡:从原理到实践的GC调优指南
  • 为何在用户注销时使用 location.href 而非 Vue Router 的 router.push