#135. 避免锁存器

    ID: 135 Type: Default 1000ms 256MiB

避免锁存器

题目描述

假设您正在构建一个电路来处理游戏中PS/2键盘上的扫描码。给定接收到的扫描码的最后两个字节,您需要指示是否按下了键盘上的一个箭头键。这涉及到一个相当简单的映射,它可以实现为一个case语句(或者if…else if…),包含四个case。

image

您的电路有一个16位输入和四个输出,该电路识别这四个扫描码并确认正确的输出。为避免产生锁存,必须在所有四种情况和默认(default)情况下,为所有四个输出指定一个值。这可能涉及许多不必要的输入。解决这个问题的一个简单方法是在case语句之前为输出分配一个“默认值”:

always @(*) begin

up = 1'b0; down = 1'b0; left = 1'b0; right = 1'b0;

case (scancode)

... // Set to 1 as necessary.

endcase

end

这种类型的代码确保在所有可能的情况下为输出赋值(0),除非case语句重写赋值。这也意味着default项变得不必要。

请试着将上述代码补充完整。

输入格式

16位宽扫描码scancode

输出格式

1位宽输出left,right,up,down

示例代码

module top (
    input [15:0] scancode,
    output reg left,
    output reg down,
    output reg right,
    output reg up  ); 

endmodule