欢迎光临散文网 会员登陆 & 注册

HDLBits (6) — 与门

2021-09-08 08:48 作者:僚机Wingplane  | 我要投稿

本题链接:

https://hdlbits.01xz.net/wiki/Andgate

创建一个能够实现与门的模块。

该电路现在有三根线网(a、b 和 out)。 线网 a 和 b 已经有了由输入端口驱动的值。 但目前线网输出不受任何驱动。 编写一个 assign 语句,用信号 a 和 b 相与来驱动。

请注意,该电路与非门非常相似,只是多了一个输入。 如果听起来不同,那是因为我已经开始将信号描述为受驱动(具有由附加到它的某些东西确定的已知值)或不受某些东西驱动。 输入线网由模块外部的内容驱动。  assign 语句将驱动逻辑电平到线路上。 正如您所料,一个线网不能有多个驱动(如果有,它的逻辑电平是什么?),而没有驱动的线网将有一个未定义的值(在综合硬件时通常被视为 0)。

预期的解决方案长度:大约 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 语言中类似。同类型操作符之间,除条件操作符从右往左关联,其余操作符都是自左向右关联。圆括号内表达式优先执行。

不同操作符之间,优先级是不同的。其中按位 & 优先度为第7(倒数第6),逻辑 && 优先度为第10(倒数第3)。当没有圆括号时,Verilog 会根据操作符优先级对表达式进行计算。为了避免由操作符优先级导致的计算混乱,在不确定优先级时,建议用圆括号将表达式区分开来。

在本题中,由于只操作一位数据,所以使用按位操作符( & )和逻辑操作符( && )在输出的结果上是一致的。

按位操作符对 2 个操作数的每 1bit 数据进行按位操作。

如果 2 个操作数位宽不相等,则用 0 向左扩展补充较短的操作数。

逻辑操作符、按位操作符和归约操作符都使用相同的符号表示,因此有时候容易混淆。区分这些操作符的关键是分清操作数的数目,和计算结果的规则。

逻辑操作符的计算结果是一个 1bit 的值,0 表示假,1 表示真,x 表示不确定。

如果一个操作数不为 0,它等价于逻辑 1;如果一个操作数等于 0,它等价于逻辑 0。如果它任意一位为 x 或 z,它等价于 x。

如果任意一个操作数包含 x,逻辑操作符运算结果不一定为 x。

逻辑操作符的操作数可以为变量,也可以为表达式。

参考内容:

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


HDLBits (6) — 与门的评论 (共 条)

分享到微博请遵守国家法律