Verilog - ||之间的混淆和+运算符

时间:2017-06-07 14:38:29

标签: verilog boolean-algebra

在布尔代数中,项的加法对应于或门,而乘法对应于与门。

假设我想要一个恒温器的鼓风机,其工作原理如下:

  

如果加热器或空调打开,风扇应打开。或者,如果用户请求打开风扇(通过打开输入 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

2 个答案:

答案 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_on1'b0heateraircon均为1'b1时,

将会失败,而这一个不会:<\ n / p>

assign blower_fan = fan_on | heater | aircon;