失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > FPGA中关于上升沿和下降沿检测

FPGA中关于上升沿和下降沿检测

时间:2020-06-17 06:02:43

相关推荐

FPGA中关于上升沿和下降沿检测

FPGA中关于上升沿和下降沿检测

一 介绍

在学习FPGA的过程中,我们有时候会看到在所学例程上会有关于检测信号下降沿或者上升沿的代码,然后通过检测上升沿和下降沿触发使能信号从而进行接下来的操作。

比如下降沿检测:

assign flag = (~uart_txd_d0) && (uart_txd_d1);

但是可能却不知道为什么是这样写出来的,而选择去死记硬背,反正我是记不住了,最好还是搞明白,那么接下来我们就来分析一下。

二 分析

本次实验已下降沿为例,上升沿则是同理。

首先要明确的是,一般来说,只有当flag信号为高,即为1时,才表示检测到了下降沿,那么就意味着我们assign 后的语句逻辑与的结果要为1,也就是说uart_txd_d0为0,uart_txd_d1为1。

不过就算倒推到了这里,估计也不太清楚,那我们自己来写一个检测,方便观察。

代码:

源码部分:

module test(input sys_clk,input sys_rst_n,input uart_txd,output flag);reg uart_txd_d0;reg uart_txd_d1;assign flag = (~uart_txd_d0) && (uart_txd_d1);always@(posedge sys_clk or posedge sys_rst_n)beginif(!sys_rst_n)beginuart_txd_d0 <= 1'b1;uart_txd_d1 <= 1'b1;endelse beginuart_txd_d0 <= uart_txd;uart_txd_d1 <= uart_txd_d0;endend endmodule

tb文件:

module tb_test();reg sys_clk;reg sys_rst_n;reg uart_txd;wire flag;always #10 sys_clk = ~sys_clk;initial beginsys_clk = 1'b0;sys_rst_n = 1'b0;uart_txd = 1'b1;#200 sys_rst_n = 1'b1;#200 uart_txd = 1'b0;endtest u_test(.sys_clk (sys_clk),.sys_rst_n (sys_rst_n),.uart_txd (uart_txd),.flag(flag));endmodule

我们制造了信号uart_txd,并且造出了在uart_txd基础上延迟了一拍和两拍的信号uart_txd_d0和uart_txd_d1。将他们的初值设置为1,因为只有具有从1到0 的过程,我们才能检测到下降沿。

那我们仿真一下,波形如图:

从这个图里我们得出了一个非常重要的结论,即虽然我们最开始设置的信号是uart_txd,但是我们最终检测的却是uart_txd_d0信号的下降沿(如图所示,flag信号拉高的瞬间对应的是uart_txd_d0的下降沿而非uart_txd的下降沿),所以大家要明白,我们的代码:

assign flag = (~uart_txd_d0) && (uart_txd_d1);

检测的是uart_txd_d0的下降沿。

那么再看这幅图,就不难理解为什么代码要这样写了,我们看着flag拉高的时刻对应的uart_txd_d0和uart_txd_d1,由图得出uart_txd_d0在那一时刻是为0的,而uart_txd_d1则为1,因此,若要拉高flag信号,则flag = (~uart_txd_d0) && (uart_txd_d1);

这就是下降沿判断代码的由来,可以以此原理得出上升沿检测的代码。

以上就是全部内容,如有不对,欢迎指正。

如果觉得《FPGA中关于上升沿和下降沿检测》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。