文章目录

  • 背景
    • 新检测方法
    • 旧检测方法
    • 改进旧检测方法
  • 设计介绍
    • 设计代码
    • 仿真情况
    • 仿真图
  • 最后想提出的问题
  • 同行邀请
  • 工程分享

背景

关于边沿检测,写过的博文也很多,不下于4篇了,当然都是学习过程中边学边记的,过了那么久设计的沉淀,又过了一个疫情的荒诞时光,安静下来,还谈一下这个问题,并给出一种新的写法(其实都是一个原理)。也许你觉得不值一提,但总会有点意义。

新检测方法

这种写法在Vivado中进行行为仿真时,tb文件中,即使在上升沿给0变1数据,也能检测到边沿。如下:

initial begin//sys_rst = 1;vio_txen = 0;#7 //sys_rst = 0;@(posedge sys_clk) vio_txen = 1;# 64 vio_txen = 0;// #26// @(posedge sys_clk) vio_txen = 1;// # 20 vio_txen = 0;end // initial

真正实现了边沿的检测。
对于tb文件中不在0到1时给输入数据,更不在话下:

  initial begin//sys_rst = 1;vio_txen = 0;#7 //sys_rst = 0;@(negedge sys_clk) vio_txen = 1;# 64 vio_txen = 0;#26@(posedge sys_clk) vio_txen = 1;# 20 vio_txen = 0;end // initial

总之,检测能力一流!

旧检测方法

我们最常用的边沿检测方式,以上升沿检测为例,大概就是对输入数据寄存一拍,然后用寄存后的数据取反,逻辑与上输入数据:

//____________________code start___________________module rise_detect_traditionnal(input sys_clk,input sys_rst,input vio_txen,output vio_txen_rise);reg                          vio_txen_r      ;//------------------Code Start Here-----------------//always @ (posedge sys_clk or posedge sys_rst)beginif(sys_rst)vio_txen_r <= 1'b0 ;elsevio_txen_r <= vio_txen ;endassign vio_txen_rise = ~ vio_txen_r & vio_txen;endmodule

这种方法诚然没有问题,但存在让人迷惑的地方,在vivado仿真时候,如果输入数据是在时钟上升沿从0到1的一个数据,那么就看不到检测的上升沿:
测试文件同上!
仿真图如下:
可见,后一个上升沿没有检测到。
当然这种问题的解释也在上一篇博客的最后讲到了。

改进旧检测方法

当然对于上一种旧检测方案的改进是,首先将待检测数据同步到时钟域内,之后再寄存一拍,最后用同步数据和寄存数据取上升沿检测逻辑。也就是打两拍,保证没有问题。这也是最最标准且常见的。
如下:

module rise_detect_improved(input sys_clk,input sys_rst,input vio_txen,output vio_txen_rise);reg vio_txen_r1;reg vio_txen_r2;always @(posedge sys_clk) beginif (sys_rst) begin    vio_txen_r1 <= 0;vio_txen_r2 <= 0;end else beginvio_txen_r1 <= vio_txen;vio_txen_r2 <= vio_txen_r1;end end //alwaysassign vio_txen_rise = (~vio_txen_r2)& vio_txen_r1;
endmodule

仿真图如下:
可见,没有任何问题,这种也是我最喜欢用的方式。

设计介绍

背景已经把所有的基本上都讲了,这里主要提的还是今天博客的主题,就是一种新写法。可能在你眼里不是新写法,但请考虑下萌新哈。

设计代码

module rising_detect(input sys_clk,input sys_rst,input vio_txen,output reg vio_txen_rise);wire                       vio_txen            ;reg                            vio_txen_r      ;//------------------Code Start Here-----------------//always @ (posedge sys_clk or posedge sys_rst)beginif(sys_rst)vio_txen_r <= 1'b0 ;elsevio_txen_r <= vio_txen ;endalways @ (posedge sys_clk or posedge sys_rst)beginif(sys_rst)vio_txen_rise <= 1'b0 ;else if((~vio_txen_r) & vio_txen)vio_txen_rise <= 1'b1 ;elsevio_txen_rise <= 1'b0 ;endendmodule

仿真情况

module rise_detect_tb();//______________ wire and reg definition ___________________________________reg sys_clk;reg sys_rst;reg vio_txen;wire vio_txen_rise;//____________________ simulation code start _______________________________//____________________generate system clock ________________________________initial beginsys_clk  = 0;forever begin# 5 sys_clk = ~sys_clk;end // forever end // initial//______________________ generate input data ________________________________initial beginsys_rst = 1;vio_txen = 0;#7 sys_rst = 0;@(negedge sys_clk) vio_txen = 1;# 64 vio_txen = 0;#26@(posedge sys_clk) vio_txen = 1;# 20 vio_txen = 0;end // initial//_____________________ instantiation the design under test ___________________rising_detect inst_rising_detect(.sys_clk       (sys_clk),.sys_rst       (sys_rst),.vio_txen      (vio_txen),.vio_txen_rise (vio_txen_rise));endmodule

仿真图

最后想提出的问题

各位有没有注意到这个仿真图:
延迟一拍的数据和原数据一致,但是为什么还可以产生正常的上升沿检测结果?
放大看看:

评论区留言,提出你的见解呗?

同行邀请

FPGA/IC技术交流2020

工程分享


链接
提取码:48ka

FPGA设计心得(2)边沿检测的问题进一步说明(仿真中一定能得到上升沿的设计)相关推荐

  1. FPGA图像处理HLS实现sobel边沿检测,提供HLS工程和vivado工程源码

    目录 一.sobel边沿检测原理 二.HLS方案实现sobel边沿检测 三.HLS在线仿真并导出IP 四.Kintex7开发板vivado工程验证 五.zynq7100开发板vivado工程验证 六. ...

  2. c语言sobel边缘检测,Sobel图像边沿检测算法的优化设计与实现

    0 引言 图像边沿是图像的基本特征,是图像分割.特征提取等图像分析的重要依据,目前已广泛应用于目标识别.机器视觉和运动目标跟踪等领域.现今已有多种边沿检测算法以及一些改进方式,但各种算法都有各自的优缺 ...

  3. Verilog 边沿检测电路

    边沿检测电路是 Verilog 数字电路设计中较为常用的电路,主要作用是在 clk 的驱使下,检测另一个信号的上升/下降沿电路: 检测的原理是记录指定信号前一个时钟和当前时钟的信号,并做对比,看看是否 ...

  4. c语言关键词中英翻译机编程,课程设计--C语言关键字中英翻译机

    <课程设计--C语言关键字中英翻译机>由会员分享,可在线阅读,更多相关<课程设计--C语言关键字中英翻译机(21页珍藏版)>请在人人文库网上搜索. 1.课课 程程 设设 计计 ...

  5. (98)FPGA边沿检测(下降沿检测)

    (98)FPGA边沿检测(下降沿检测) 1 文章目录 1)文章目录 2)FPGA入门与提升课程介绍 3)FPGA简介 4)FPGA边沿检测(下降沿检测) 5)技术交流 6)参考资料 2 FPGA入门与 ...

  6. (97)FPGA边沿检测(上升沿检测)

    (97)FPGA边沿检测(上升沿检测) 1 文章目录 1)文章目录 2)FPGA入门与提升课程介绍 3)FPGA简介 4)FPGA边沿检测(上升沿检测) 5)技术交流 6)参考资料 2 FPGA入门与 ...

  7. 基于Sobel算法的边沿检测设计与实现

    基于Sobel算法的边沿检测设计与实现 1. 边缘检测 2. 实战演练 2.1. matlab进行灰度图像生成 2.2. sobel_ctrl控制模块 2.3. vga显示模块 2.4. 顶层模块实例 ...

  8. FPGA实现边沿检测电路(上升沿、下降沿)

    1.什么是边沿检测 边沿检测用于检测信号的上升沿或下降沿,通常用于使能信号的捕捉等场景. 2.采用1级触发器的边沿检测电路设计(以下降沿为例) 2.1.设计方法 设计波形图如下所示: 各信号说明如下: ...

  9. FPGA设计心得(10)关于行为仿真的一点观点

    文章目录 前言 实践分析 推荐的仿真设计 总结 前言 提前给出一些观点: 仿真是为了仿真,所以不要设置极限情况,例如在时钟上升沿通过阻塞赋值给数据,应该避免这种情况: 各种不同的仿真软件对时钟上升沿通 ...

最新文章

  1. 区块链+5G=智慧城市?
  2. C#中如何将将数据导出到word excel 中
  3. array,vector对象 数组越界检测
  4. java wait 线程安全吗_Java多线程中的wait与notify
  5. python测试开发自学教程-2019第一期《python测试开发》课程,10月13号开学
  6. 安卓 静态文件读取 staticFile
  7. 升级python3后yum出现异常解决办法
  8. 时间触发以太网TTEthernet技术
  9. PaperNotes(17)-图卷积神经网络GCN-笔记
  10. Xilinx zynq-7000系列FPGA移植Linux操作系统详细教程
  11. java企业人事管理系统源码_企业人事管理系统完美版源代码 - 源码下载|行业应用软件|企业管理(财务/ERP/EIP等)|源代码 - 源码中国...
  12. Docker的一些理解(二)
  13. php dom手册,DOM 元素 - JavaScript中文参考手册 - php中文网手册
  14. 【数据库原理】滨江学院姜青山 期末试卷知识点笔记整理 南京信息工程大学
  15. MySql 使用规范推荐(转)
  16. android多媒体stagefright框架,Android多媒体框架下Stagefright的功能扩展.PDF
  17. pat乙级1083C语言
  18. 企业网络及应用层安全防护技术精要
  19. 为什么必须要数据清理?
  20. 自动控制之PID原理

热门文章

  1. .net数据控件的冒泡事件
  2. HG522-C 刷Openwrt记录
  3. 对现有代码的分析方法随想
  4. python网络开发框架_greenev首页、文档和下载 - Python网络服务框架 - OSCHINA - 中文开源技术交流社区...
  5. 我的世界基岩版json_我的世界基岩版合集
  6. 华为p4支持鸿蒙功能吗_吹过的牛都一步一步给实现了!明年华为手机支持升级鸿蒙系统!...
  7. linux从i2c读取变量,I2C子系统之__I2C_first_dynamic_bus_num变量的相关分析
  8. suse安装MySQL-python_python2.7.9安装mysql-python模块
  9. k2677场效应管参数引脚_场效应管参数大全2.doc
  10. access vba 常量数组赋值_VBA数组是什么?有何作用?别担心,你只需用1分钟就明白它是什么...