HDLBits (56) — 响铃还是震动?
本题链接:
https://hdlbits.01xz.net/wiki/Ringer
假设你正在设计一个电路来控制手机的振铃器和振动马达。无论何时,只要电话需要从来电中响起(输入ring),电路必须接通振铃器(输出ringer=1)或电机(输出motor=1),但不是两者都有。如果手机处于振动模式(输入vibrate_mode =1),请打开电机。否则,打开振铃器。
尝试只使用 assign 语句,以查看是否可以将问题描述转换为逻辑门集合。
设计提示: 在设计电路时,人们经常会想到“向后”的问题,从输出开始,然后向后工作到输入。这通常与人们对(顺序的、命令式的)编程问题的看法相反,在这个问题中,人们首先看到输入,然后决定一个动作(或输出)。对于顺序程序,人们通常认为“如果(输入是 _ _) ,那么(输出应该是 _ _)”。另一方面,硬件设计师经常认为“当(输入是 _ _)时(输出应该是 _ _)”。
上面的问题描述是以一种适合软件编程的命令形式编写的(如果是 ring,那么就这样做) ,因此你必须将其转换为一种更加适合硬件实现的声明形式(assign ringer = ___)。能够思考和转换这两种风格,是硬件设计所需的最重要的技能之一。

预期解决方案长度:大约2行。

题目
提示:
对于这个特殊的问题,我们应该考虑“motor 在___时打开”,而不是“如果(vibrate mode)那么___”。

答案

输出波形


按位操作符包括:取反(~),与(&),或(|),异或(^),同或(~^)。
按位操作符对 2 个操作数的每 1bit 数据进行按位操作。
如果 2 个操作数位宽不相等,则用 0 向左扩展补充较短的操作数。
取反操作符只有一个操作数,它对操作数的每 1bit 数据进行取反操作。
下图给出了按位操作符的逻辑规则。

参考内容:
2.4 Verilog 表达式 | 菜鸟教程:
https://www.runoob.com/w3cnote/verilog-expression.html

