无法在Verilog代码中识别不安全的锁存行为或case语句的完整性

时间:2015-10-04 23:59:54

标签: verilog calculator quartus

嘿我正在尝试创建一个小模块,读取在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

1 个答案:

答案 0 :(得分:1)

这里有很多问题,我会给你一些提示来开始。第一,你需要某种时钟来使计数器实际上以你能观察到的方式计数。否则它只是像软件中的无限循环一样扭曲(实际上,综合工具可能足够聪明,看不到任何逻辑)。其次,initial仅适用于模拟,但它不是可综合的结构。当您启动逻辑时,counter将处于某个随机值,这可能与您定义的0-3个案例中的任何一个都不匹配,这就是它始终转到default case的原因。您需要重置并指定重置值。