无法识别 Verilog 代码中不安全的锁存行为或 case 语句的完整性
Can't identify unsafe latch behaviour or completeness of case statement in Verilog code
嘿,我正在尝试创建一个小模块来读取在 DE2 4x4 矩阵板上按下了哪个按钮,然后显示在 LED 上按下了哪一列和哪一行,但我遇到了一些问题。
现在,列有效,但行无效。我认为这与我用来显示行状态的 LEDS 具有 "unsafe latch behaviour" 这一事实有关,但我不太确定。
我还注意到,对于我的 case 语句,只会解析为 default 语句,我不知道为什么,它说它无法检查完整性。
有人能帮帮我吗?如果可以,非常感谢。
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
。您需要重置并指定重置值。
嘿,我正在尝试创建一个小模块来读取在 DE2 4x4 矩阵板上按下了哪个按钮,然后显示在 LED 上按下了哪一列和哪一行,但我遇到了一些问题。
现在,列有效,但行无效。我认为这与我用来显示行状态的 LEDS 具有 "unsafe latch behaviour" 这一事实有关,但我不太确定。
我还注意到,对于我的 case 语句,只会解析为 default 语句,我不知道为什么,它说它无法检查完整性。
有人能帮帮我吗?如果可以,非常感谢。
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
。您需要重置并指定重置值。