FPGA学习笔记(二):上升沿、下降沿和双边沿检测电路(时序逻辑)

目录

一、逻辑设计

1.端口设计

2.波形图绘制

二、程序设计

1.边沿检测电路代码

2.仿真代码

3.仿真结果

总结


设计一个时序逻辑电路的边沿检测电路


一、逻辑设计

1.端口设计

模块的输入端口包含系统时钟sys_clk、复位信号sys_rst_n、检测输入信号signal;输出端口包含上升沿指示信号signal_posedge、下降沿指示信号signal_negedge、双边沿指示信号signal_edge。

2.波形图绘制

  • 使用寄存器 signal_reg1 存储上一时刻的信号值,以便与当前信号值比较以检测边沿。

  • 在时钟的上升沿或复位时,更新 signal_reg1 的值。

  • 使用组合逻辑块计算信号的上升沿和下降沿,并使用异或操作计算信号的边沿。

  • signal_posedge 在信号上升沿时为1,signal_negedge 在信号下降沿时为1,signal_edge 在信号发生边沿时为1。

具体原理参见https://blog.csdn.net/qq_45910789/article/details/139033118?spm=1001.2014.3001.5501

二、程序设计

根据波形图使用Verilog编写计数器(edge_test_1.v)代码

1.边沿检测电路代码

代码如下:

module edge_test_1(
    input sys_clk,          // 系统时钟信号
    input sys_rst_n,        // 系统复位信号
    input signal,           // 待检测的信号
    
    output reg signal_posedge,  // 信号上升沿指示
    output reg signal_negedge,  // 信号下降沿指示
    output reg signal_edge      // 信号边沿指示
);

reg signal_reg1;  // 存储上一时刻的信号值

// 存储上一时刻的信号值,并在时钟的上升沿或复位时更新
always @(posedge sys_clk or negedge sys_rst_n) begin
    if (!sys_rst_n)
        signal_reg1 <= 1'b0;   // 复位时信号寄存器清零
    else
        signal_reg1 <= signal;  // 存储当前信号值
end

// 计算信号的上升沿
always @(*) begin
    if (signal && !signal_reg1)
        signal_posedge <= 1'b1; // 当信号为高且上一时刻信号为低时,表示上升沿
    else
        signal_posedge <= 1'b0; // 否则,信号上升沿为0
end

// 计算信号的下降沿
always @(*) begin
    if (!signal && signal_reg1)
        signal_negedge <= 1'b1; // 当信号为低且上一时刻信号为高时,表示下降沿
    else
        signal_negedge <= 1'b0; // 否则,信号下降沿为0
end

// 计算信号的边沿(包括上升沿和下降沿)
always @(*) begin
    signal_edge <= signal ^ signal_reg1; // 通过异或操作计算信号的边沿
end

endmodule

2.仿真代码

代码如下:

`timescale 1ns / 1ns

module tb_edge_test_1();
reg sys_clk       ;
reg sys_rst_n     ;
reg signal        ;

wire signal_posedge;
wire signal_negedge;
wire signal_edge   ;

// 初始化
initial begin
    sys_clk = 1'b1;      // 初始化系统时钟为高电平
    sys_rst_n <= 1'b0;   // 复位信号
    signal <= 1'b0;      // 初始化待检测信号为低电平
    #201;                
    sys_rst_n <= 1'b1;   
    #20                  
    signal <= 1'b1;      // 改变待检测信号为高电平
    #60                  // 假设3个周期的高电平信号
    signal <= 1'b0;      
end

// 时钟周期性翻转
always #10 sys_clk = ~sys_clk;
 
// 实例化边沿检测模块  
edge_test_1 edge_test_1_inst(
    .sys_clk       (sys_clk       ),                
    .sys_rst_n     (sys_rst_n     ),                
    .signal        (signal        ),                

    .signal_posedge(signal_posedge),                
    .signal_negedge(signal_negedge),                
    .signal_edge   (signal_edge   )                 
);
    
endmodule

3.仿真结果

仿真波形与我们绘制的波形图一致


总结

        在复杂的逻辑设计中,很多情况我们都需要检测信号的跳变。如果一个信号发生跳变,则逻辑给出一个指示,这个指示用来控制其他信号的动作,这种情况就需要有一个边沿检测电路,本文主要采用时序逻辑设计思想来设计边沿检测电路。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值