题解 | #边沿检测#

边沿检测

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

简析

对输入信号a打一拍得到a0,然后根据aa0的值就可以判断出边沿类型。
我最开始写的代码如下:

    reg a0;
    always@(posedge clk or negedge rst_n) begin
        if(~rst_n) begin
            rise <= 1'b0;
            down <= 1'b0;
        end
        else begin
            rise <=  a & ~a0;  // !!!
            down <= ~a &  a0;  // !!!
        end
    end
    always@(posedge clk or negedge rst_n) begin
        if(~rst_n)
            a0 <= 0;
        else
            a0 <= a;
    end

然而会报错。分析了波形后发现Testbench的a长时间都是不确定状态,如下图。这会使得risedown也成为不确定值。if-else方法则可以避免这种错误。
alt

代码

`timescale 1ns/1ns
module edge_detect(
	input clk,
	input rst_n,
	input a,
	
	output reg rise,
	output reg down
);
	reg a0;
    always@(posedge clk or negedge rst_n) begin
        if(~rst_n) begin
            rise <= 1'b0;
            down <= 1'b0;
        end 
        else begin
            if(a & ~a0) begin
                rise <= 1;
                down <= 0;
            end 
            else if (~a & a0) begin
                rise <= 0;
                down <= 1;
            end else begin
                rise <= 0;
                down <= 0;
            end
        end
    end
    
    always@(posedge clk or negedge rst_n) begin
        if(~rst_n) 
            a0 <= 0;
        else 
            a0 <= a;
    end
endmodule
Verilog篇题解 文章被收录于专栏

本人对牛客网verilog篇题目一些理解

全部评论
if-else语句中0,x,z按照‘假’处理,所以避免了不确定状态,学习到了
3 回复 分享
发布于 2023-02-12 20:54 四川
请问为什么会出现不确定呢状态呢
点赞 回复 分享
发布于 2022-06-20 10:50
激励有问题
点赞 回复 分享
发布于 2023-01-08 15:15 广东
好像没有考虑到一种情况:在一个时钟周期内,a的状态发生了两次翻转。
点赞 回复 分享
发布于 2023-04-16 17:55 广东
我一上手就写了第一个错误答案
点赞 回复 分享
发布于 2023-07-31 23:37 湖南
从verilog语法上讲,if-else可以避免x态传播,但是真实工作中,仿真器也会让if()中的x传播下去。所以还是得确保a进入这段逻辑前先初始化。
点赞 回复 分享
发布于 2023-09-17 16:15 上海

相关推荐

09-04 21:05
已编辑
西南科技大学 Java
点赞 评论 收藏
分享
45 3 评论
分享
牛客网
牛客企业服务