在布尔代数中,项的加法对应于或门,而乘法对应于与门。
假设我想要一个恒温器的鼓风机,其工作原理如下:
如果加热器或空调打开,风扇应打开。或者,如果用户请求打开风扇(通过打开输入 fan_on ),即使加热器或空调关闭,风扇也应该打开。
基于这些要求,我在Verilog代码中将逻辑语句表达为:
assign blower_fan = fan_on + heater + aircon;
然而,在模拟时,这会产生不正确的解决方案。然而,这有效:
assign blower_fan = fan_on || (heater + aircon);
和
一样assign blower_fan = fan_on || (heater || aircon);
我的问题:
我对+运营商的误解是什么?此外,我在后两个解决方案之间感到困惑 - 这两个解决方案都有效 - 为什么它们都工作,并且是最后一个我只使用逻辑OR运算符更正确(或首选)的方式来做我想做的事情办?
编辑#1:这是我声明输入和输出的整个模块
module top_module (
input too_cold,
input too_hot,
input mode,
input fan_on,
output heater,
output aircon,
output fan
);
assign heater = (mode&&too_cold);
assign aircon = (!mode&&too_hot);
assign fan = (fan_on) || (heater || aircon);
endmodule
答案 0 :(得分:1)
OR和AND的布尔表达式分别为||
和&&
。
+
符号实际上是算术表达式
a = 2'b01 // 1
b = 2'b01 // 1
a + b = 2'b10 // 1 + 1 = 2
a || b = 2'b01 // 1 OR 1 = 1
来源:https://www.utdallas.edu/~akshay.sridharan/index_files/Page5212.htm
编辑:
以下两个陈述在逻辑上是等价的
assign fan = (fan_on) || (heater || aircon);
assign fan = fan_on || heater || aircon;
的问题
assign blower_fan = fan_on + heater + aircon;
是如果两个输入为高(例如加热器= 1,空调= 1,fan_on = 0),则blower_fan(假设为1位)溢出,因此将为0(1'b1 + 1) 'b1 = 1'b0)。
答案 1 :(得分:1)
Verilog +
运算符不是OR运算符,它是加法运算符。 Verilog中有两个OR运算符:
| bitwise OR
|| logical OR
对于向量,按位运算分别处理向量操作数的各个位。相反,对于逻辑运算符,标量或向量在包含至少一个1时被认为是TRUE,而在每个位为0时被认为是FALSE .Xs和Zs被认为是未知的(都不是TRUE也不是假的。
您还可以将|
运算符用作减少运算符。
例如:
Expression Result Comment
=========================================
1'b0 | 1'b0 1'b0 bitwise OR
1'b0 | 1'b1 1'b1 bitwise OR
1'b1 | 1'b0 1'b1 bitwise OR
1'b1 | 1'b1 1'b1 bitwise OR
4'b0101 | 4'b1100 4'b1101 bitwise OR
4'b0000 || 4'b0000 1'b0 logical OR
4'b0000 || 4'b1100 1'b1 logical OR
4'b0101 || 4'b0000 1'b1 logical OR
4'b0101 || 4'b1100 1'b1 logical OR
| 4'b0000 1'b0 reduction
| 4'b0101 1'b1 reduction
| 4'b1111 1'b1 reduction
如果使用+
运算符而不是|
运算符并分配给一位,则实际上使用异或而不是OR。比较这些真值表:
OR XOR +
A B F F F
==============================
1'b0 1'b0 1'b0 1'b0 1'b0
1'b0 1'b1 1'b1 1'b1 1'b1
1'b1 1'b0 1'b1 1'b1 1'b1
1'b1 1'b1 1'b1 1'b0 1'b0
这个表达式:
assign blower_fan = fan_on || (heater + aircon);
当fan_on
为1'b0
且heater
和aircon
均为1'b1
时,将会失败,而这一个不会:<\ n / p>
assign blower_fan = fan_on | heater | aircon;