关闭

fpga检测上升沿

692人阅读 评论(0) 收藏 举报
分类:

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

0
0

猜你在找
【直播】机器学习&数据挖掘7周实训--韦玮
【套餐】系统集成项目管理工程师顺利通关--徐朋
【直播】3小时掌握Docker最佳实战-徐西宁
【套餐】机器学习系列套餐(算法+实战)--唐宇迪
【直播】计算机视觉原理及实战--屈教授
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
【直播】机器学习之矩阵--黄博士
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
【直播】机器学习之凸优化--马博士
【套餐】Javascript 设计模式实战--曾亮
查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:31450次
    • 积分:543
    • 等级:
    • 排名:千里之外
    • 原创:4篇
    • 转载:105篇
    • 译文:3篇
    • 评论:1条
    文章分类
    最新评论