题解 | #可置位计数器#

可置位计数器

https://www.nowcoder.com/practice/b96def986e29475e8100c213178b73a8

我一开始还纳闷以为自己学的有问题,直到我写完全一样的TB文件,用他们代码跑了一下明显不对,只能说牛客的verilog在线仿真程序做的有BUG,不如Mosim.

这个代码num本来就是reg型,上升沿跳变后需要一个周期0才能更新为1,按他们要求再打一拍0又被延迟一个周期了,最明显的错误就是他们打拍,set=1,从代码中能明显看出num更新需要一个周期,number也需要一个周期,因此共两个周期,完全不符合题意啊。

    always@((487950916)posedge clk or negedge rst_n) begin

        if(~rst_n)

            num <= 0;

        else

            num <= set? set_num: num+1;

    end

正确解答:

module count_module(

    input clk,

    input rst_n,

    input set,

    input [3:0] set_num,

    output reg [3:0]number,

    output reg zero

    );

   

    always@((487950916)posedge clk or negedge rst_n) begin

        if(~rst_n)

            number <= 4'd0;

        else

            number <= set? set_num: number+1'd1;

    end

   

    always@((487950916)*) begin

        if(~rst_n)

            zero <= 0;

        else

            zero <= number==4'd0;

    end

endmodule

`timescale 1ns/1ps

module tb;

reg clk,rst_n,set;

reg [3:0]   set_num;

wire [3:0] number;

wire zero;

initial begin

    clk = 1'b1;

    forever #5 clk = ~clk;

end

initial begin

    rst_n <= 1'b0;

    set_num <= 4'd0;

    set <= 1'b0;

    #10 rst_n <= 1'b1;

    #200 set <= 1'b1;set_num <= 4'd10;

    #10 set <= 1'b0;

    #200;

    $stop;

end

count_module U1(

    .clk(clk),

    .rst_n(rst_n),

    .set(set),

    .set_num(set_num),

    .number(number),

    .zero(zero)

    );

endmodule

全部评论

相关推荐

10-09 00:50
已编辑
长江大学 算法工程师
不期而遇的夏天:1.同学你面试评价不错,概率很大,请耐心等待;2.你的排名比较靠前,不要担心,耐心等待;3.问题不大,正在审批,不要着急签其他公司,等等我们!4.预计9月中下旬,安心过节;5.下周会有结果,请耐心等待下;6.可能国庆节前后,一有结果我马上通知你;7.预计10月中旬,再坚持一下;8.正在走流程,就这两天了;9.同学,结果我也不知道,你如果查到了也告诉我一声;10.同学你出线不明朗,建议签其他公司保底!11.同学你找了哪些公司,我也在找工作。
点赞 评论 收藏
分享
牛客410815733号:这是什么电影查看图片
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务