fpga检测上升沿

转载 2015年11月18日 21:09:03

检测上升沿的原理:使用高频的时钟对信号进行采样,因此要实现上升沿检测,时钟频率至少要在信号最高频率的2倍以上,否则就可能出现漏检测。具体请参见下面代码。

module edge_check(clk, rst_n, signal, pos_edge, neg_edge, both_edge);

input clk;
input rst_n;
input signal;
output pos_edge;
output neg_edge;
output both_edge;


reg sig_r0, sig_r1;  // 状态寄存器
always @ (posedge clk or negedge rst_n)
    if (!rst_n) begin 
        sig_r0 <= 1'b0;
        sig_r1 <= 1'b0;
    end else begin 
        sig_r0 <= signal;
        sig_r1 <= sig_r0;
    end 

assign pos_edge = (~sig_r1) & (sig_r0);
assign neg_edge = sig_r1 & (~sig_r0);   
assign both_edge = sig_r1 ^ sig_r0;  // 双边沿检测,或pos_edge|neg_edge

endmodule 

使用Quartus II综合布线之后的RTL视图如下:

check_regs

从RTL视图中可以看出,电路是通过一个异步复位的D触发器实现的。

ModelSim的仿真视图如下,从中可看出已检测出上升和下降沿,但存在一个延时,这是因为使用了时钟同步的检测。

modelsim1

或者上面的Verilog代码还可以换一种写法,效率上差不了太多;

module edge_check(clk, rst_n, signal, pos_edge, neg_edge, both_edge);

input clk;
input rst_n;
input signal;
output pos_edge;
output neg_edge;
output both_edge;

reg [1:0]sig_fifo;
reg sig_r0, sig_r1;  // 状态寄存器
always @ (posedge clk or negedge rst_n)
    if (!rst_n) begin 
        sig_fifo <= 2'b0;
    end else begin 
        sig_fifo <= {sig_fifo[0], signal};
    end 

assign pos_edge = (sig_fifo == 2'b01);
assign neg_edge = (sig_fifo == 2'b10);  
assign both_edge = sig_fifo[0] ^ sig_fifo[1];  // 双边沿检测,或pos_edge|neg_edge

endmodule 

生成的RTL视图为

check_fifo

verilog入门经验(三)取某个信号的上升沿或下降沿信号

取一个信号的上升沿或下降沿信号,可以通过将信号delay后,然后将原信号和delay信号,通过不同的与非操作,获取上升沿信号或下降沿信号: reg delay;        // delay信号 a...

Verilog一种检测信号上升沿的方法

在always@()模块下,不能再使用always@来检测上升沿或者下降沿,但有一种小算法,分享一下。 假设要检测en的上升沿: always@(posedge clk)begin     en...

FPGA的边沿检测

以前我曾一度傻乎乎的使用 always @ (posedge signal) 这样的代码去检测signal的上升沿,闹出了很多问题。 当受实验室的一同学指教后,再也不会傻乎乎的这样干了。当然...

FPGA中对竞争冒险问题的研究(转)

FPGA中对竞争冒险问题的研究

通过RTL电路深入理解阻塞赋值和非阻塞赋值的区别

转载稍微接触过Verilog HDL的都对阻塞与非阻塞赋值略知一二,也是我们经常强调的重点之一,在课堂上还是有学员问什么不一样呢,为什么我用阻塞赋值也能得出正确的结果呢? 在编写可综合代码的时候,建...

TRIGGER的上升和下降的检测简单的仿真

下面是在MODELSIM进行的TRIGGER的上升和下降的检测仿真 `timescale 1ns/1ns // /* 测试门级描述输入1*/ // module BUF_G(A, F); // ...
  • USB_ABC
  • USB_ABC
  • 2016年10月06日 11:26
  • 149

FPGA基础之脉冲边沿检测原理verilog版本

最近一直忙着找工作。哎,希望保佑我通过二面吧。 verilog的脉冲检测方法一直在用,就那几句话,但一直没想他的原理,今天一个同学说笔试的遇到这个了,我一想,要我写还真写不出来,不懂原理,怎么写啊。死...
  • lg2lh
  • lg2lh
  • 2012年10月23日 21:56
  • 11041

边沿检测方法-FPGA入门教程

本节实验主要讲解FPGA开发中边沿检测方法,我们在设计中会经常用到。这个地方大家一定要理解。 1.1.1.原理介绍 学习HDL语言设计与其他语言不一样,HDL语言设计需要考虑更多的信号的电气特性,...
  • lg2lh
  • lg2lh
  • 2016年04月21日 22:06
  • 1328

FPGA边沿检测与按键消抖

边沿检测有上升沿检测、下降沿检测、双边沿检测。以按键控制LED灯为例,下面是按键原理图 从按键连接的原理图,可以看到,按键未按下时是低电平,当按键按下即为高电平,如果要实现按键按下一次led改...

FPGA模式识别之数字检测

这里简单的描述了,数字检测出来的方法。FPGA车牌识别的一部分。
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:fpga检测上升沿
举报原因:
原因补充:

(最多只允许输入30个字)