题解 | #边沿检测#

边沿检测

http://www.nowcoder.com/practice/fed4247d5ef64ac68c20283ebace11f4

麻烦有看到的大佬给解答下,为啥红色的分支部分不添加,编译就无法通过,原本的想法是直接这么写
always @ (*)
begin
    if(!rst_n)
        begin
            rise = 1'b0;
            down = 1'b0; 
        end
    else 
        begin
            rise = (a_t0 && (~a_t1)) ? 1'b1 : 1'b0;
            down = ((~a_t0) && a_t1) ? 1'b1 : 1'b0;
        end
end



`timescale 1ns/1ns
module edge_detect(
input clk,
input rst_n,
input a,
output reg rise,
output reg down
);
//------------reg define----------//
reg a_t0;
reg a_t1;

//-----------wire define-----------//

//***********************************//
//        Main code
//***********************************//

// assign rise = a_t0 && (~a_t1);
// assign down = (~a_t0) && a_t1;

//边沿检测:双沿检测
always @ (posedge clk,negedge rst_n)
    begin
        if(!rst_n)
            begin
                a_t0 <= 1'b0;
                a_t1 <= 1'b0;
            end
        else
            begin
                a_t0 <= a;
                a_t1 <= a_t0;
            end
    end
//output
always @ (*)
begin
    if(!rst_n)
        begin
            rise = 1'b0;
            down = 1'b0; 
        end
    else if((a_t0 && (~a_t1)) || ((~a_t0) && a_t1))
        begin
            rise = (a_t0 && (~a_t1)) ? 1'b1 : 1'b0;
            down = ((~a_t0) && a_t1) ? 1'b1 : 1'b0;
        end
    else
        begin
            rise = 1'b0;    //这段代码不加就通过不了呗
            down = 1'b0; 
        end
end
endmodule
全部评论
如果不添加,当暂存的a有x时,输出为x,但题目中输出没有x
点赞 回复 分享
发布于 2023-03-03 23:13 上海
条件运算符表达式: cond_expr?expr1:expr2; 如果cond_expr为真(即为1),选择expr1; 如果cond_expr为假(即为0),选择expr2; 如果cond_expr为x或z,结果将按以下逻辑expr1和expr2按位操作的值:0与0得0,1与1得1,其余情况为x. 以上摘自CSND 因为题目还验证了当输入为未知态的情况。所以当输入a时未知态,就符合第三种情况,所以1和0相与,其值为x;所以需要加上你标红的那句话,将其他情况下rise和down都赋为0
点赞 回复 分享
发布于 2022-04-25 22:01

相关推荐

06-19 19:06
门头沟学院 Java
码农索隆:别去东软,真学不到东西,真事
点赞 评论 收藏
分享
昨天 14:17
门头沟学院 Java
点赞 评论 收藏
分享
评论
2
收藏
分享

创作者周榜

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