HDLBits (14) — 按位运算符
2021-09-16 00:51 作者:僚机Wingplane | 我要投稿
本题链接:
https://hdlbits.01xz.net/wiki/Vectorgates
构建一个具有两个 3 位输入的电路,用于计算两个向量的按位或、两个向量的逻辑或以及两个向量各自的逻辑非 (NOT)。 将 b 取非 作为上半部分(即bits [5:3])将 a 取非作为下半部分拼接为 out_not 。
按位运算 vs. 逻辑运算
在此之前,我们有提到有各种布尔运算符(例如非门)的按位和逻辑版本。在 使用向量时,两种运算符类型之间的区别十分重要。 按位运算会将两个 N 位向量之中的每一位按位运算并产生 N 位输出,而逻辑运算则会将整个向量视为布尔值(真 = 非零,假 = 零)并产生 1 位输出。
可以通过模拟波形,了解按位或和逻辑或的不同之处。
模块声明:
module top_module(
input [2:0] a,
input [2:0] b,
output [2:0] out_or_bitwise,
output out_or_logical,
output [5:0] out_not
);
提示
在一次分配中部分选择左侧,然后通过多次重复操作分配给线网。而不需要在一条语句中为整个向量赋值。

题目
module top_module(
input [2:0] a,
input [2:0] b,
output [2:0] out_or_bitwise,
output out_or_logical,
output [5:0] out_not
);
endmodule

答案
module top_module(
input [2:0] a,
input [2:0] b,
output [2:0] out_or_bitwise,
output out_or_logical,
output [5:0] out_not
);
assign out_or_bitwise[2:0] = a[2:0] | b[2:0];
assign out_or_logical = a[2:0] || b[2:0];
assign out_not[2:0] = ~a[2:0];
assign out_not[5:3] = ~b[2:0];
endmodule

输出波形


按位操作符包括:取反(~),与(&),或(|),异或(^),同或(~^)。
按位操作符对 2 个操作数的每 1bit 数据进行按位操作。
如果 2 个操作数位宽不相等,则用 0 向左扩展补充较短的操作数。
取反操作符只有一个操作数,它对操作数的每 1bit 数据进行取反操作。
参考内容:
2.4 Verilog 表达式 | 菜鸟教程:https://www.runoob.com/w3cnote/verilog-expression.html