0

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

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

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

2 回答 2

0

Verilog+运算符不是OR 运算符,它是加法运算符。Verilog 中有两个 OR 运算符:

|   bitwise OR 
||  logical OR

对于向量,按位运算分别处理向量操作数的各个位。相反,对于逻辑运算符,标量或向量在包含至少一个 1 时被认为是 TRUE,当每个位为 0 时被认为是 FALSE。Xs 和 Zs 被认为是未知的(既不是 TRUE 也不是 FALSE)。

您还可以将|运算符用作归约运算符

例如:

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当is1'b0和 both heaterand airconare时会失败1'b1,而这个不会:

assign blower_fan = fan_on | heater | aircon;
于 2017-06-07T14:51:46.697 回答
0

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;

就是如果两个输入为高电平(例如,heater = 1, aircon = 1, fan_on = 0),则 Blower_fan(假定为 1 位)已溢出,因此将为 0 (1'b1 + 1'b1 = 1'b0)。

于 2017-06-07T14:42:42.337 回答