目录
设计一个时序逻辑电路的边沿检测电路
一、逻辑设计
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.仿真结果
仿真波形与我们绘制的波形图一致
总结
在复杂的逻辑设计中,很多情况我们都需要检测信号的跳变。如果一个信号发生跳变,则逻辑给出一个指示,这个指示用来控制其他信号的动作,这种情况就需要有一个边沿检测电路,本文主要采用时序逻辑设计思想来设计边沿检测电路。