这个是我在做HDLBits中遇到的一道题,然后我查了相关资料,就总结了一下
(https://hdlbits.01xz.net/wiki/Edgedetect)所有的波形均符合题目中的要求
仿真的波形如下:
这个是单bit信号的边沿检测,其实如果懂了单bit信号的,多bit信号也自然就会了
上面最近的这幅图是每个bit位展开之后波形图,每个检测信号均占据一个时钟周期。虽然和题目中检测信号相比输入信号未延时一个周期,后期如果需要再加寄存器延迟即可。
这个是代码
module edgeDetect(
input clk,
input insig, // 单bit输入
output reg pos_edge, // 检测单bit数据上升沿
output reg neg_edge, // 检测单bit数据下降沿
output reg both_edge, // 检测单bit数据双边沿
input [7:0] insigbits, // 多bit输入
output reg [7:0] outsigbits_pos, // 检测多bit数据上升沿
output reg [7:0] outsigbits_neg, // 检测多bit数据下降沿
output reg [7:0] outsigbits_both // 检测多bit数据双边沿
);
reg d_last; //状态寄存器
always @(posedge clk) begin
d_last <= insig;
pos_edge <= insig & ~d_last;
neg_edge <= ~insig & d_last;
both_edge <= insig ^ d_last;
end
reg [7:0] signalbitsOld;
always @(posedge clk) begin
signalbitsOld <= insigbits;
outsigbits_pos <= insigbits & ~signalbitsOld;
outsigbits_neg <= ~insigbits & signalbitsOld;
outsigbits_both <= insigbits ^ signalbitsOld;
end
endmodule
测试程序:
module edgeDetect_tb;
reg clk;
reg insig;
reg [7:0] insigbits;
wire pos_edge, neg_edge, both_edge;
wire [7:0] outsigbits_pos;
wire [7:0] outsigbits_neg;
wire [7:0] outsigbits_both;
initial begin
clk = 0;
insig = 0;
insigbits = 8'h00;
#100 insig = 1;
#50 insig = 0;
#20 insig = 1;
#60 insig = 0;
#40 insig = 1;
#40 insig = 0;
#100 insigbits = 8'h02;
#30 insigbits = 8'h0e;
#30 insigbits = 8'h00;
#10 insigbits = 8'h0e;
#40 insigbits = 8'h19;
#1000 $stop;
end
always #10 clk = ~clk;
edgeDetect ut(
.clk(clk),
.insig(insig), // 单bit输入
.pos_edge(pos_edge), // 检测单bit数据上升沿
.neg_edge(neg_edge), // 检测单bit数据下降沿
.both_edge(both_edge), // 检测单bit数据双边沿
.insigbits(insigbits), // 多bit输入
.outsigbits_pos(outsigbits_pos), // 检测多bit数据上升沿
.outsigbits_neg(outsigbits_neg), // 检测多bit数据下降沿
.outsigbits_both(outsigbits_both) // 检测多bit数据双边沿
);
endmodule