无法识别 Verilog 代码中不安全的闩锁行为或案例陈述的完整性



嘿,我正试图创建一个小模块,读取哪个按钮按在DE2 4x4矩阵板上,然后显示哪个列和哪一行被按在LED上,但我有一些问题。

现在列可以工作,但行不行。我认为这与我用来显示行状态的led有"不安全的闩锁行为"这一事实有关,但我不太确定。

我还注意到,对于我的case语句只解析为默认语句,我不知道为什么,它说它不能检查完整性。

有人能帮我吗?如果有的话,非常感谢。

module MatrixInput(MInput, MOutput, LEDR);
input [16:10] MInput; //cols
output reg [24:18] MOutput; //rows
output reg [7:0] LEDR;
reg [31:0] counter; //just setting to max size for now
reg [31:0] i;
reg LEDFlag;
initial begin
    counter = 0;
    i = 7;
    LEDFlag = 0;
end

always@(*) begin
    case(counter)
        0: MOutput = 7'b0x1x1x1;
        1:  MOutput = 7'b1x0x1x1;
        2:  MOutput = 7'b1x1x0x1;
        3:  MOutput = 7'b1x1x1x0;
        default: MOutput = 7'b1x0x0x0;
    endcase
    LEDR[7] = MInput[10];
    LEDR[6] = MInput[12];
    LEDR[5] = MInput[14];
    LEDR[4] = MInput[16];

    repeat(4) begin //step through each col 
        if (LEDR[i] == 1) //set the LED flag on if any of the col LEDS on
            LEDFlag = 1;
        if (i != 3) //count down from 7 to 3
            i = i - 1;
        else
            i = 7;
    end
    LEDR[counter] = LEDFlag;
    LEDFlag = 0;
    if (counter != 4)
        counter = counter + 1;
    else
        counter = 0;
end
endmodule

这里有很多问题,我将给你一些提示来开始。第一,你需要某种时钟来让计数器以一种你可以观察到的方式计数。否则,它就会像软件中的无限循环一样快速移动(实际上,合成工具可能足够聪明,可以看到这一点,而根本不会合成任何逻辑)。其次,initial仅在模拟中工作,但它不是一个可合成的结构。当您启动逻辑时,counter将处于某个随机值,该值可能与您定义的0-3种情况中的任何一种都不匹配,这就是为什么它总是指向default case。您需要重置并指定重置值。

最新更新