带LED输出的6位二进制计数器

时间:2014-11-07 13:10:09

标签: verilog

我对verilog世界很陌生,我无法理解为什么我的程序什么都不返回。我试图制作一个简单的6位向上计数器,按下按钮。代码是

module top (CLK, BTN_RST, LED, BTN_C);
    input CLK, BTN_RST, BTN_C; //
    output [5:0]LED;
    reg [5:0]LED;
    always @(posedge CLK or posedge BTN_RST) begin
         if (BTN_RST) begin
              LED <= 6'b000000;
           end
         else begin: COUNT           
              while (BTN_C) begin
                    LED <= LED + 1'b1;
                    disable COUNT;
              end
            end
    end
endmodule

测试台是

module top_test;
    reg CLK;
    reg BTN_RST;
    reg BTN_C;
    reg [5:0]LED;

    initial begin
        CLK = 0;
        BTN_RST = 0;
        BTN_C = 0;
        #1 BTN_RST = 1;
        #5 BTN_RST = 0;
        #10 BTN_C = 1;
        #50;
    end

    always
    begin
    #5 CLK=~CLK;
    end

此代码编译并运行(我可以在iSim上看到),但LED输出给了我XXXXXX。我认为我不仅在这里遇到了一些错误,而且还无法理解测试平台的工作原理以及如何在输入和输出上做出正确的分配。有人可以帮帮我吗?

1 个答案:

答案 0 :(得分:3)

您需要在测试平台中添加设计实例。现在,LED不再是X;我看到它从0开始计数。

module top_test;
    reg CLK;
    reg BTN_RST;
    reg BTN_C;
    wire [5:0]LED;

    initial begin
        CLK = 0;
        BTN_RST = 0;
        BTN_C = 0;
        #1 BTN_RST = 1;
        #5 BTN_RST = 0;
        #10 BTN_C = 1;
        #50;
    end

    always
    begin
    #5 CLK=~CLK;
    end

top dut (
        // Inputs:
    .BTN_C    (BTN_C),
    .BTN_RST  (BTN_RST),
    .CLK      (CLK),
        // Outputs:
    .LED      (LED)
);

endmodule

更新:我在top_test中将reg更改为连线LED。当我使用VCS作为模拟器时,我看到LED从0增加。但是,当我切换到Incisive时,LED保持在0。

我认为您的while / disable代码导致了问题。我把它重新编码看起来更标准:

module top (CLK, BTN_RST, LED, BTN_C);
    input CLK, BTN_RST, BTN_C; //
    output [5:0]LED;
    reg [5:0]LED;
    always @(posedge CLK or posedge BTN_RST) begin
        if (BTN_RST) begin
            LED <= 6'b000000;
        end else if (BTN_C) begin           
            LED <= LED + 1'b1;
        end
    end
endmodule