hdlbits系列verilog解答(always块nolatch语句)-36


一、问题描述

假设您正在构建一个电路来处理来自游戏的 PS/2 键盘的扫描码。设定接收到的最后两个字节的扫描码,您需要指示是否按下了键盘上的一个箭头键。这涉及一个相当简单的映射,可以作为包含四个分支的 case 语句(或 if-elseif)来实现。
Scancode [15:0] Arrow key
16’he06b left arrow
16’he072 down arrow
16’he074 right arrow
16’he075 up arrow
Anything else none

您的电路有一个 16 位输入和四个输出。构建此电路,识别这四个扫描码并生成正确的输出。

为避免产生锁存器,必须在所有可能的条件下为所有输出分配一个值(另请参见always_if2)。仅仅有一个 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: 分支变得不必要。

提醒:逻辑合成器生成一个组合电路,其行为与代码描述的内容相同。硬件不会按顺序“执行”代码行。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值