FPGA的边沿检测

以前我曾一度傻乎乎的使用

always @ (posedge signal)

这样的代码去检测signal的上升沿,闹出了很多问题。

当受实验室的一同学指教后,再也不会傻乎乎的这样干了。当然,你看完下文也不会这样干了。

检测上升沿的原理:使用高频的时钟对信号进行采样,因此要实现上升沿检测,时钟频率至少要在信号最高频率的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

FPGA中,边沿检测电路主要用于检测信号的上升沿或下降沿,并给出相应的指示信号。边沿检测电路的实现方法有多种,其中一种方法是通过寄存器和逻辑门的组合来实现。具体步骤如下: 1. 首先,将需要检测边沿的信号延迟一拍,得到延迟后的信号。 2. 然后,将延迟后的信号与原始信号进行逻辑运算,以检测出上升沿或下降沿。例如,对于上升沿检测电路,可以使用逻辑与门将延迟后的信号与原始信号的取反进行逻辑与运算。 3. 最后,将逻辑与门的输出作为边沿检测电路的输出信号。 这样,当输入信号发生上升沿或下降沿时,边沿检测电路将给出相应的信号指示。 需要注意的是,在实际应用中,为了确保稳定性,可以采用多级寄存器来实现边沿检测电路。例如,使用两级或三级寄存器来锁存结果,以避免亚稳态的影响。通过多级寄存器的组合,可以提高电路的稳定性和可靠性。 总结起来,FPGA边沿检测电路可以通过延迟信号、逻辑运算和寄存器的组合来实现。这样的电路能够检测输入信号的上升沿或下降沿,并给出相应的指示信号。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [FPGA基础设计(—):边沿检测电路](https://blog.csdn.net/weixin_47421560/article/details/123011273)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值