题解 | #边沿检测#

边沿检测

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

全部评论
这里为啥要用组合逻辑,不能用时序上升沿触发呢
点赞 回复 分享
发布于 2023-08-08 01:07 湖北

相关推荐

06-19 12:33
安徽大学 Java
点赞 评论 收藏
分享
05-01 22:41
中南大学 Java
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务