题解 | #边沿检测#
边沿检测
https://www.nowcoder.com/practice/fed4247d5ef64ac68c20283ebace11f4
`timescale 1ns/1ns module edge_detect( input clk, input rst_n, input a, output reg rise, output reg down ); reg a_1; //按照本题的解法,只需打一拍就可,然后用时序的方式进行输出,我们之前都是打两拍,而后组合逻辑输出 reg a_2;//打两拍也可以,采用组合逻辑,题解中有人写出了 always@(posedge clk or negedge rst_n) begin if(!rst_n) begin a_1 <= 1'b0; a_2 <= 1'b0; end else begin a_1 <= a; a_2 <= a_1; end end always@(*) begin if(!rst_n) begin rise <= 1'b0; down <= 1'b0; end else if(!a_2 && a_1) //以后这里判断时最好加上,因为要防止输入是x和z态的情况,以前没有判断直接写等于这个表达式,那样会出现输入x输出也是x'的情况 begin rise <= 1'b1; down <= 1'b0; end else if(!a_1 && a_2) //这里不能使用rise和down直接等于这个判断表达式,因为输入的x态会使得输出也会有这个值,如果取判断,则x不会进行输出 begin rise <= 1'b0; down <= 1'b1; end else begin rise <= 1'b0; down <= 1'b0; end end endmodule