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