HDLBits (7) — 或非门
本题链接:
https://hdlbits.01xz.net/wiki/Norgate
创建一个能够实现 NOR 门的模块。 或非门是输出反相的或门。 使用 Verilog 编写 NOR 函数时需要两个运算符。
赋值( assign )语句用一个值驱动一条线(或“网”,更正式地称为“网”)。该值可以是您想要的复杂函数,只要它是一个组合函数(即,无记忆,没有隐藏状态)。赋值语句是一个连续的赋值语句,因为只要它的输入有任何改变,就会永远会“重新计算”输出,就像一个简单的逻辑门。

预期的解决方案长度:大约 1 行。
模块声明:
module top_module(
input a,
input b,
output out );
提示
Verilog 和 C 语言一样有单独的按位或 ( | ) 和逻辑或 ( || ) 运算符。因为我们在这里我们只用对其中一位进行操作,所以我们选择哪个并不重要。

题目
module top_module(
input a,
input b,
output out );
endmodule

答案
module top_module(
input a,
input b,
output out );
assign out = ~(a | b);
endmodule

输出波形


Verilog 中提供了大约 9 种操作符,分别是算术、关系、等价、逻辑、按位、归约、移位、拼接、条件操作符。
大部分操作符与 C 语言中类似。同类型操作符之间,除条件操作符从右往左关联,其余操作符都是自左向右关联。圆括号内表达式优先执行。
不同操作符之间,优先级是不同的。其中单目运算( + - ~ ! )优先度最高,按位 | 优先度为第9(倒数第4),逻辑 || 优先度为第11(倒数第2)。当没有圆括号时,Verilog 会根据操作符优先级对表达式进行计算。为了避免由操作符优先级导致的计算混乱,在不确定优先级时,建议用圆括号将表达式区分开来。
在本题中,由于只操作一位数据,所以使用按位操作符( | )和逻辑操作符( || )在输出的结果上是一致的。
按位操作符对 2 个操作数的每 1bit 数据进行按位操作。
如果 2 个操作数位宽不相等,则用 0 向左扩展补充较短的操作数。
逻辑操作符、按位操作符和归约操作符都使用相同的符号表示,因此有时候容易混淆。区分这些操作符的关键是分清操作数的数目,和计算结果的规则。
逻辑操作符的计算结果是一个 1bit 的值,0 表示假,1 表示真,x 表示不确定。
如果一个操作数不为 0,它等价于逻辑 1;如果一个操作数等于 0,它等价于逻辑 0。如果它任意一位为 x 或 z,它等价于 x。
如果任意一个操作数包含 x,逻辑操作符运算结果不一定为 x。
逻辑操作符的操作数可以为变量,也可以为表达式。
取反操作符只有一个操作数,它对操作数的每 1bit 数据进行取反操作。
参考内容:
2.4 Verilog 表达式 | 菜鸟教程:https://www.runoob.com/w3cnote/verilog-expression.html