FPGA设计心得(2)边沿检测的问题进一步说明(仿真中一定能得到上升沿的设计)
文章目录
- 背景
- 新检测方法
- 旧检测方法
- 改进旧检测方法
- 设计介绍
- 设计代码
- 仿真情况
- 仿真图
- 最后想提出的问题
- 同行邀请
- 工程分享
背景
关于边沿检测,写过的博文也很多,不下于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)边沿检测的问题进一步说明(仿真中一定能得到上升沿的设计)相关推荐
- FPGA图像处理HLS实现sobel边沿检测,提供HLS工程和vivado工程源码
目录 一.sobel边沿检测原理 二.HLS方案实现sobel边沿检测 三.HLS在线仿真并导出IP 四.Kintex7开发板vivado工程验证 五.zynq7100开发板vivado工程验证 六. ...
- c语言sobel边缘检测,Sobel图像边沿检测算法的优化设计与实现
0 引言 图像边沿是图像的基本特征,是图像分割.特征提取等图像分析的重要依据,目前已广泛应用于目标识别.机器视觉和运动目标跟踪等领域.现今已有多种边沿检测算法以及一些改进方式,但各种算法都有各自的优缺 ...
- Verilog 边沿检测电路
边沿检测电路是 Verilog 数字电路设计中较为常用的电路,主要作用是在 clk 的驱使下,检测另一个信号的上升/下降沿电路: 检测的原理是记录指定信号前一个时钟和当前时钟的信号,并做对比,看看是否 ...
- c语言关键词中英翻译机编程,课程设计--C语言关键字中英翻译机
<课程设计--C语言关键字中英翻译机>由会员分享,可在线阅读,更多相关<课程设计--C语言关键字中英翻译机(21页珍藏版)>请在人人文库网上搜索. 1.课课 程程 设设 计计 ...
- (98)FPGA边沿检测(下降沿检测)
(98)FPGA边沿检测(下降沿检测) 1 文章目录 1)文章目录 2)FPGA入门与提升课程介绍 3)FPGA简介 4)FPGA边沿检测(下降沿检测) 5)技术交流 6)参考资料 2 FPGA入门与 ...
- (97)FPGA边沿检测(上升沿检测)
(97)FPGA边沿检测(上升沿检测) 1 文章目录 1)文章目录 2)FPGA入门与提升课程介绍 3)FPGA简介 4)FPGA边沿检测(上升沿检测) 5)技术交流 6)参考资料 2 FPGA入门与 ...
- 基于Sobel算法的边沿检测设计与实现
基于Sobel算法的边沿检测设计与实现 1. 边缘检测 2. 实战演练 2.1. matlab进行灰度图像生成 2.2. sobel_ctrl控制模块 2.3. vga显示模块 2.4. 顶层模块实例 ...
- FPGA实现边沿检测电路(上升沿、下降沿)
1.什么是边沿检测 边沿检测用于检测信号的上升沿或下降沿,通常用于使能信号的捕捉等场景. 2.采用1级触发器的边沿检测电路设计(以下降沿为例) 2.1.设计方法 设计波形图如下所示: 各信号说明如下: ...
- FPGA设计心得(10)关于行为仿真的一点观点
文章目录 前言 实践分析 推荐的仿真设计 总结 前言 提前给出一些观点: 仿真是为了仿真,所以不要设置极限情况,例如在时钟上升沿通过阻塞赋值给数据,应该避免这种情况: 各种不同的仿真软件对时钟上升沿通 ...
最新文章
- 区块链+5G=智慧城市?
- C#中如何将将数据导出到word excel 中
- array,vector对象 数组越界检测
- java wait 线程安全吗_Java多线程中的wait与notify
- python测试开发自学教程-2019第一期《python测试开发》课程,10月13号开学
- 安卓 静态文件读取 staticFile
- 升级python3后yum出现异常解决办法
- 时间触发以太网TTEthernet技术
- PaperNotes(17)-图卷积神经网络GCN-笔记
- Xilinx zynq-7000系列FPGA移植Linux操作系统详细教程
- java企业人事管理系统源码_企业人事管理系统完美版源代码 - 源码下载|行业应用软件|企业管理(财务/ERP/EIP等)|源代码 - 源码中国...
- Docker的一些理解(二)
- php dom手册,DOM 元素 - JavaScript中文参考手册 - php中文网手册
- 【数据库原理】滨江学院姜青山 期末试卷知识点笔记整理 南京信息工程大学
- MySql 使用规范推荐(转)
- android多媒体stagefright框架,Android多媒体框架下Stagefright的功能扩展.PDF
- pat乙级1083C语言
- 企业网络及应用层安全防护技术精要
- 为什么必须要数据清理?
- 自动控制之PID原理
热门文章
- .net数据控件的冒泡事件
- HG522-C 刷Openwrt记录
- 对现有代码的分析方法随想
- python网络开发框架_greenev首页、文档和下载 - Python网络服务框架 - OSCHINA - 中文开源技术交流社区...
- 我的世界基岩版json_我的世界基岩版合集
- 华为p4支持鸿蒙功能吗_吹过的牛都一步一步给实现了!明年华为手机支持升级鸿蒙系统!...
- linux从i2c读取变量,I2C子系统之__I2C_first_dynamic_bus_num变量的相关分析
- suse安装MySQL-python_python2.7.9安装mysql-python模块
- k2677场效应管参数引脚_场效应管参数大全2.doc
- access vba 常量数组赋值_VBA数组是什么?有何作用?别担心,你只需用1分钟就明白它是什么...