我不明白为什么此代码中的计时器计数器不起作用。在每个时钟周期结束时,该值将重置为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
答案 0 :(得分:1)
您已将计时器声明为:
reg timer;
这是一个单比特寄存器。因此,它只假设模拟中的值为0和1。
您可以将其声明为多位寄存器,或将其声明为整数变量(假设此代码仅用于模拟目的,而不是用于合成)。
请注意,您的代码中还有其他问题。例如,您将EWColor声明为单个位,但仍尝试将其指定为2,并将其与2进行比较。