寄存器中的值在每个时钟周期保持复位为0

时间:2016-11-30 01:59:29

标签: verilog counter

我不明白为什么此代码中的计时器计数器不起作用。在每个时钟周期结束时,该值将重置为0,因此输出将如下所示:

clock: 0  timer: 0
clock: 1  timer: 1
clock: 0  timer: 0
clock: 1  timer: 1

代码:

module controller(clock, reset, enable, lightN, lightS, lightE, lightW, NScolor, EWcolor);

input clock, reset, enable, lightN, lightS, lightE, lightW;
output NScolor, EWcolor;

wire clock, reset, enable, lightN, lightS, lightE, lightW;
reg NScolor, EWcolor;
reg timer;


always @ (posedge clock)
begin: COUNT
    $display("TIMER = %d", timer); 
    if (reset == 1) begin
    $display("Resetting!");
        NScolor<= 1;
        EWcolor<= 0;
        timer <= 0;
    end
    else if (enable == 1) begin
        timer <= timer + 1;
        if (timer == 7) begin
            switchLights;
        end
        else if (timer >= 10) begin
            timer <= 0;
            switchLights;
        end
    end
end

task switchLights;
begin
    if (NScolor == 0 && EWcolor == 2) begin
        NScolor<= 1;
        EWcolor<= 0;
    end
    else if (NScolor == 1) begin
        NScolor<= 2;
        EWcolor<= 0;
    end
    else if (NScolor == 2) begin
        NScolor<= 0;
        EWcolor<= 1;
    end

    if (EWcolor == 0 && NScolor == 2) begin
        EWcolor<= 1;
        NScolor<= 0;
    end
    else if (EWcolor == 1) begin
        EWcolor<= 2;
        NScolor<= 0;
    end
    else if (EWcolor == 2) begin
        EWcolor<= 0;
        NScolor<= 1;
    end
end
endtask

endmodule

1 个答案:

答案 0 :(得分:1)

您已将计时器声明为:

reg timer;

这是一个单比特寄存器。因此,它只假设模拟中的值为0和1。

您可以将其声明为多位寄存器,或将其声明为整数变量(假设此代码仅用于模拟目的,而不是用于合成)。

请注意,您的代码中还有其他问题。例如,您将EWColor声明为单个位,但仍尝试将其指定为2,并将其与2进行比较。