如何在verilog的always块中分配闪烁LED的状态?

时间:2014-04-27 10:38:51

标签: verilog

我有这段代码:

module(
// Set inputs and outputs
    output [7:0]ledg
);

reg state;

assign ledg[0] = state;

always @ (posedge clock)
begin
    // Increment a counter and set state <= to the counter
end

always @ (posedge clock)
if (sw[9:5] == 5'b00010)
begin
    hex3 <= 7'b1000000;
    hex2 <= 7'b1000000;
    hex1 <= 7'b1000000;
    hex0 <= 7'b1000000;
end

endmodule

我让LED闪烁,但我想要的是当其中一个sw [9:5]打开时LED会闪烁。但是,无论开关是打开还是关闭,LED的编码方式都会闪烁。

但是我遇到了代码行的问题:

assign ledg[0] = state;

我认为问题是你不能在always块中使用assign关键字。它必须在一个总是块之外分配。

这就是我的问题所在。如何指定闪烁LED的状态,使其在进入IF条件块时“开始”闪烁,但在开关关闭时停止闪烁?

由于

1 个答案:

答案 0 :(得分:0)

您可以设置一个标志来创建条件语句:

assign ledg[0] = (flag  == 1'b1) ? state : '0;

您需要将总是阻止更改为:

always @ (posedge clock)
if (sw[9:5] == 5'b00010)
begin
    flag <= 1'b1;
    hex3 <= 7'b1000000;
    hex2 <= 7'b1000000;
    hex1 <= 7'b1000000;
    hex0 <= 7'b1000000;
end
else begin
    flag <= 1'b0;
end

仅供参考,您可以使用hex0到hex3的值,但是当开关未打开时,您不能为它们分配任何值。结果他们将合成到锁存器。

或者,您可以将ledg [0]定义为reg,只需在always块中为其分配,而不使用assign关键字:

module(
// Set inputs and outputs
    output reg [7:0]ledg // <----- 'output' to 'output reg'
);

reg state;

//assign ledg[0] = state; <-------Remove this line

always @ (posedge clock)
begin
    // Increment a counter and set state <= to the counter
end

always @ (posedge clock)
if (sw[9:5] == 5'b00010)
begin
    hex3 <= 7'b1000000;
    hex2 <= 7'b1000000;
    hex1 <= 7'b1000000;
    hex0 <= 7'b1000000;
    ledg[0] <= state;
end
else 
    ledg[0] <= '0;
endmodule