题意整理
题目要求检测输入信号a的边沿,即当a信号的值从0跳变到1,视为出现上升沿,把指示信号rise拉高;当a信号的值从1跳变到0,视为出现下降沿,把指示信号down拉高。其余时刻两个指示信号因保持0。
题解主体
检测信号a的边沿需要缓存信号前一时刻的值,例如记为a_tem。当前一时刻为0,这一时刻为1,说明信号出现上升沿,即 a&&!a_tem = 1; 当前一时刻为1,这一时刻为0,说明信号出现上升沿,即 !a&&a_tem = 1;
输入信号:
系统时钟,复位信号:clk,rst_n;
待检测边沿的信号:a;
输出信号:
上升沿指示信号:rise
下降沿指示信号:down
缓存a的数值
always @(posedge clk or negedge rst_n)
if (!rst_n)
a_tem <= 1'b0;
else
a_tem <= a;
分别使用a&&!a_tem和!a&&a_tem作为判断条件,判断是否出现上升沿或者下降沿。
//检测边沿,给出相应的信号
always @(posedge clk or negedge rst_n)
if (!rst_n)
begin
rise <= 1'b0;
down <= 1'b0;
end
else if (!a_tem && a) //当前一时刻a=0,当前时刻a=1,表示a出现一次上升沿
begin
rise <= 1'b1;
down <= 1'b0;
end
else if (a_tem && !a)//当前一时刻a=1,当前时刻a=0,表示a出现一次下降沿
begin
down <= 1'b1;
rise <= 1'b0;
end
else
begin
down <= 1'b0;
rise <= 1'b0;
end
参考答案
`timescale 1ns/1ns module edge_detect( input clk, input rst_n, input a, output reg rise, output reg down ); reg a_tem; //缓存a的数值 always @(posedge clk or negedge rst_n) if (!rst_n) a_tem <= 1'b0; else a_tem <= a; //检测边沿,给出相应的信号 always @(posedge clk or negedge rst_n) if (!rst_n) begin rise <= 1'b0; down <= 1'b0; end else if (!a_tem && a) //当前一时刻a=0,当前时刻a=1,表示a出现一次上升沿 begin rise <= 1'b1; down <= 1'b0; end else if (a_tem && !a) //当前一时刻a=1,当前时刻a=0,表示a出现一次下降沿 begin down <= 1'b1; rise <= 1'b0; end else begin down <= 1'b0; rise <= 1'b0; end endmodule