Verilog 使摩尔机器中的输出LED闪烁

Verilog 使摩尔机器中的输出LED闪烁,verilog,vivado,Verilog,Vivado,我所设计的是一台摩尔机器,它为每个州赋予特定的颜色。 这是我代码的一部分 always @(*) begin case (state) S0 : led = 6'b111111; S1 : led = 6'b010100; // have to blink // S2 : led = 6'b100010; S3 : led = 6'b110110;

我所设计的是一台摩尔机器,它为每个州赋予特定的颜色。 这是我代码的一部分

    always @(*) begin            
        case (state)
            S0 : led = 6'b111111;
            S1 : led = 6'b010100;  // have to blink //
            S2 : led = 6'b100010;
            S3 : led = 6'b110110; 
            default : led_output = 6'b000000;
        endcase
    end
    
端模

在上面显示的代码之前,有一些关于分配与输入相对应的状态的代码

上面显示的代码用于确定摩尔机器的输出值。(因此条件为*)

我留下的是为每个状态分配led输出值

然而,S1的条件不仅是特定的颜色,而且必须“闪烁”1s

我已经在谷歌上搜索过“闪烁LED”的verilog代码,但它们和我的情况有点不同

我不知道编码块是必要的


你能给我一些建议或答案让S1闪烁吗?

要让它闪烁,你需要区分两种状态。因此,创建一个1位信号,例如
sel
,它在
S1
状态下切换,其切换速度和占空比在
“闪烁”1s期间满足您的要求。这基本上是在计数器的帮助下实现的

reg [3:0] cnt; // assume 4-bit long
reg sel;

// counter to determine the HIGH / LOW time of sel.
always@(posedge clk or negedge resetn)begin
    if(!resetn)begin
        cnt <= 4'h0;
    end
    // since you can exit S1 state at any time using push_button,
    // make sure cnt is always ZERO when entering S1 state next time.
    // also to save power when using clock gating, because this statement
    // is only active for 1 cycle.
    else if((state == S1) & ((push_button == 2'b01) | (push_button == 2'b10)))begin  // S1 exit condition
        cnt <= 4'h0;
    end
    else if(state == S1)begin
        // sel HIGH lasts <HIGH_MAX_VAL>+1 cycles
        // sel LOW lasts <LOW_MAX_VAL>+1 cycles
        if(cnt == (sel ? <HIGH_MAX_VAL> : <LOW_MAX_VAL>))begin
            cnt <= 4'h0;
        end
        else begin
            cnt <= cnt + 4'h1;
        end
    end
end

always@(posedge clk or negedge resetn)begin
    if(!resetn)begin
        sel <= 1'h0;
    end
    else if((state == S1) & ((push_button == 2'b01) | (push_button == 2'b10)))begin
        sel <= 1'h0;
    end
    else if(state == S1)begin
        if(cnt == (sel ? <HIGH_MAX_VAL> : <LOW_MAX_VAL>))begin
            sel <= ~sel;
        end
    end
end
always@(*)begin            
    case(state)
        ....
        S1 : led = sel ? 6'b010100 : <ANOTHER_VALUE>;
        ....
    endcase
end