数字IC手撕代码-边沿检测(上升沿、下降沿、双边沿)

2023-10-26

 前言:

        本专栏旨在记录高频笔面试手撕代码题,以备数字前端秋招,本专栏所有文章提供原理分析、代码及波形,所有代码均经过本人验证。

目录如下:

1.数字IC手撕代码-分频器(任意偶数分频)

2.数字IC手撕代码-分频器(任意奇数分频)

3.数字IC手撕代码-分频器(任意小数分频)

4.数字IC手撕代码-异步复位同步释放

5.数字IC手撕代码-边沿检测(上升沿、下降沿、双边沿)

6.数字IC手撕代码-序列检测(状态机写法)

7.数字IC手撕代码-序列检测(移位寄存器写法)

8.数字IC手撕代码-半加器、全加器

9.数字IC手撕代码-串转并、并转串

10.数字IC手撕代码-数据位宽转换器(宽-窄,窄-宽转换)

11.数字IC手撕代码-有限状态机FSM-饮料机

12.数字IC手撕代码-握手信号(READY-VALID)

13.数字IC手撕代码-流水握手(利用握手解决流水线断流、反压问题)

14.数字IC手撕代码-泰凌微笔试真题

15.数字IC手撕代码-平头哥技术终面手撕真题

16.数字IC手撕代码-兆易创新笔试真题

17.数字IC手撕代码-乐鑫科技笔试真题(4倍频)

18.数字IC手撕代码-双端口RAM(dual-port-RAM)

        ...持续更新

为了方便可以收藏导览博客: 数字IC手撕代码-导览目录


目录

边沿检测

原理

代码

testbench

上升边沿 边沿检测波形 

下降边沿 边沿检测波形

双边沿 边沿检测波形


边沿检测

        在使用FIFO进行数据读写的时候,我们会用到边沿检测,比如当FIFO内的数据被读空了,这样 empty 信号就会从0→1,产生一个上升沿,当这个上升沿到来的时候代表FIFO内孔,我们就可以对FIFO进行一个写操作(把写使能拉高,往FIFO写数据),所以边沿检测是十分常用的东西,下面我们来讲讲边沿检测的原理、代码以及对应仿真。 

原理

        比如我们要检测信号 signal 的上升沿,我们使用两个寄存器,级联记录 signal 的值,这样由于寄存器延迟一拍的特性,第二个寄存器永远会延迟第一个寄存器。

        当 signal 上升沿到来时,会有:第一个寄存器检测为高,第二个寄存器检测为低。 

        这样,我们只要把第二个寄存器取反,然后和第一个寄存器做与运算,这样当计算的数值为 1 时,就检测到了上升边沿。 

代码

module edge_det(
    input clk            ,
    input rstn           ,
    input signal         ,
    output signal_edge
);

reg reg1,reg2;

always @(posedge clk or negedge rstn)begin
    if(!rstn)begin
        reg1 <= 1'b0;
        reg2 <= 1'b0;
    end
    else begin
        reg1 <= signal;
        reg2 <= reg1;
    end
end

assign signal_edge = (~reg2) & reg1;

endmodule

testbench

module edge_det_tb();

reg clk,rstn;
reg signal;

wire signal_edge;

always #10 clk = ~clk;

initial begin
    clk     <= 1'b0;
    rstn    <= 1'b0;
    signal  <= 1'b0;
    #50
    rstn    <= 1'b1;
    #100
    signal  <= 1'b1;
end    

edge_det u_edge_det (
    .clk          (clk)    ,
    .rstn         (rstn)   ,
    .signal       (signal) ,
    .signal_edge  (signal_edge)

);

endmodule

上升边沿 边沿检测波形 

        从图中我们可以看到,跟我们预料的一样,当上升沿到来的时候,reg1和 reg2 信号错一拍,这样利用这个特性,让signal_edge = ~reg2 & reg1 就能检测到上升边沿。

        检测下降沿也是一个道理,代码完全一致,就是把最后边沿检测信号改为:

        assign signal_edge = ~reg1 & reg2;

下降边沿 边沿检测波形

双边沿 边沿检测波形

        双边沿检测,就是上升沿和下降沿,检测信号都要输出一次高电平。这我们可以用异或实现,同样是只需要在上升沿检测的代码里改最后一条赋值语句即可,改为:

        assign signal_edge = reg1 ^reg2 ; 

结果和我们设计的一致。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数字IC手撕代码-边沿检测(上升沿、下降沿、双边沿) 的相关文章

  • envi5.3处理高分二号影像数据详细过程记录

    目录 一 多光谱影像处理 1 辐射定标 2 大气校正 1 需要准备一些数据 2 大气校正过程 3 正射校正 二 全色影像处理 1 辐射定标 2 正射校正 三 图像融合 1 几何配准 2 图像融合 高分二号处理流程 envi5 3的安装教程
  • C3P0的详细配置说明(com.mchange.v2.c3p0.ComboPooledDataSource)

    C3P0是一个开放源代码的JDBC连接池 它在lib目录中与Hibernate一起发布 包括了实现jdbc3和jdbc2扩展规范说明的Connection 和Statement 池的DataSources 对象 c3p0 config gt
  • 使用Pytorch进行多卡训练

    当一块GPU不够用时 我们就需要使用多卡进行并行训练 其中多卡并行可分为数据并行和模型并行 具体区别如下图所示 由于模型并行比较少用 这里只对数据并行进行记录 对于pytorch 有两种方式可以进行数据并行 数据并行 DataParalle
  • 数据库课程设计:图书信息管理系统(Java+MySQL)(附程序)

    期末数据库课程设计做了个图书信息管理系统 由于老师给的选题给得早 所以我在开学后的几周就开学搞了 删删改改整了好多 在此整理分享一下 项目简介 随着社会的发展 人们对知识的需求也在不断增长 书籍作为人们获取并增长知识的只要途径 使得书城 书
  • 如何通过远程桌面重启计算机?

    使用远程桌面连接远程计算机后 在开始菜单中只有 注销 和 关机 选项 无法直接重启现场终端 可以使用命令行重启现场终端 使用运行命令 Windows R键 输入命令行shutdown r t 0 Shutdown r t 5 关闭 重启 延

随机推荐

  • 看尚电视adb安装当贝桌面,并开机自启

    1 链接 可以电脑下奇兔刷机 实用工具里有adb 点开直接用 ADB 链接好后输入命令验证 c adb gt adb devices 如显示 192 168 5555 device字样表示链接成功 不同的adb前面几个字母也许不一样 2 开
  • 每个初级程序员都希望有一天能成为一名高级开发工程师。

    当程序员想要转向更高需求以及更高层次的角色时 他们的能力也必须随之提升 但也正因如此 很多人都会在这种转变中失败 程序员们通常认为 成为一名高级开发工程师必定要积累一定年限的经验以及十分擅长编程 虽然这些的确是必要因素 但想要成为一名高级开
  • 多线程创建的方式

    多线程的创建方式有以下几种 1 继承Thread类创建多线程 继承java lang Thread类 重写Thread类的run 方法 在run 方法中实现运行在线程上的代码 调用start 方法开启线程 Thread 类本质上是实现了 R
  • 【Ubuntu换源教程】不同Ubuntu系统版本换清华源

    今天在新电脑上装了虚拟机VMware Workstation Pro 16 在虚拟机上安装了Ubuntu20 04系统 在做Ubuntu20 04系统换源的时候 发现源要和Ubuntu的版本匹配 之前一直不知道 一直都是盲目换源 版本如果不
  • unity给localRotation赋值

    transform localPosition和transform localScale都是直接赋值三元数 给旋转赋值需要用 方法一 xxx transform localEulerAngles new Vector3 0 0f 0 0f
  • JS面试中常见的算法题

    1 验证一个数是否是素数 1 如果这个数是 2 或 3 一定是素数 2 如果是偶数 一定不是素数 3 如果这个数不能被3至它的平方根中的任一数整除 num必定是素数 而且除数可以每次递增 排除偶数 function isPrime num
  • 优秀logo设计解析_优秀Logo设计!具象表现手法!

    文 王新华 具象标志以客观物象的自然形态为造型基础 经过提炼 概括 抓住客观对象的精神内涵 强化其主要特征 忽略与舍弃次要因素 达到直观 感性的视觉效果 人物形 人是万物之灵 是社会的主宰 以人物为题材是标志设计的重要表现内容 人体的各种动
  • C++中memset函数详解

    memset函数定义于
  • Django中分页功能的实现及封装与调用(超详细)

    在django开发过程中 实现前端页面的分页是一个基本且常用的功能 下面就同小编一起完成分页功能的实现及封装与调用 一 在pycharm中创建django项目 小编默认看客朋友们都会创建 故不在赘述 若不熟悉 猛戳这里 二 在mysql中创
  • React事件处理、事件的特点、事件语法、React事件处理函数里的this、事件对象、阻止浏览器的默认行为

    React事件的特点 1 React 事件绑定属性的命名采用驼峰式写法 而不是小写 如 onClick 2 如果采用 JSX 的语法你需要传入一个函数作为事件处理函数 而不是一个字符串 DOM 元素的写法 函数不写小圆括号 3 在 Reac
  • CSAPP malloclab实验

    书本配套实验地址 构造一个分配器是一件富有挑战的任务 设计空间很大 有多种块格式 空闲链表格式 以及放置 分割和合并策略可供选择 另一个挑战就是我们经常被迫在类型系统的安全和熟悉的限定之外编程 依赖于容易出错的指针强制类型转换和指针运算 这
  • FreeRTOS记录(五、FreeRTOS任务通知)

    在前面几篇文章我们已经对FreeRTOS任务API和任务调度原理进行了相对深入的分析 这篇文章主要针对任务与任务之间的交互 信息传递相关的API组件进行分析 目录 一 任务通知基本介绍 1 FreeRTOS 任务通知函数 2 CMSIS封装
  • Android调用打印机

    打印机其实和Android没有什么大的关系 和linux内核关联才是比较强的 最终的结果是要在Android实现驱动打印机 但是一般调试一个新的驱动的流程是这样的 1 先在linux PC上进行测试 2 在标准嵌入式linux上进行调试 3
  • MFC原理与方法(二)

    MFC原理与方法 二 一 前言 二 类向导的使用 三 MFC消息管理 1 MFC消息映射机制 2 消息处理 四 结语 一 前言 时间过得好快啊 又是一个星期过去了 我又回来啦 每个星期保持写博客的习惯 及时消化上课的知识 不仅仅对我有帮助和
  • MySQL进阶篇之存储过程(procedure)

    04 视图 存储过程 触发器 4 1 视图 view 4 2 存储过程 procedure 4 2 1 介绍 1 介绍 存储过程是事先经过编译并存储在数据库中的一段SQL语句的集合 调用存储过程可以简化应用开发人员的很多工作 减少数据在数据
  • 异常处理的返回

    异常处理的返回 异常可以分为四类 中断 interrupt 陷阱 trap 故障 fault 和终止 abort 这几种异常处理之后又有不同的返回方式 总的来讲 类别 原因 异步 同步 返回行为 中断 来自I O设备的信号 异步 总是返回到
  • 面试3个月拿下多家大厂的P7技术专家Offer,来看我面试复盘!

    一 概述 之前写过两篇文章 工作10年我面试过上百个程序员 真想对他们说 在公司里写代码天天摸鱼偷懒 出去面试又该怎么写简历 通过这两篇文章 我们给大家聊了聊国内中大型互联网公司 在Java面试时一些高频的技术问题 本文我们通过一篇真实的一
  • 【状态估计】用于非标量系统估计的最优卡尔曼滤波(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码实现 1 概述 考虑了最优卡尔曼滤波的例子 假设一些非标量
  • vscode运行命令是报错:标记“&&”不是此版本中的有效语句分隔符。

    问题截图 问题原因 这个问题的原因和你运行的什么脚本语言没关系 即与 py c cpp无关 和你在那个终端运行的有关 解决方法 第一步 点击向下箭头 并选择 选择默认配置文件 第二步 选择 Windows PowerShell 第三步 关闭
  • 数字IC手撕代码-边沿检测(上升沿、下降沿、双边沿)

    前言 本专栏旨在记录高频笔面试手撕代码题 以备数字前端秋招 本专栏所有文章提供原理分析 代码及波形 所有代码均经过本人验证 目录如下 1 数字IC手撕代码 分频器 任意偶数分频 2 数字IC手撕代码 分频器 任意奇数分频 3 数字IC手撕代