逻辑代数,又称布尔代数,是分析和设计现代数字逻辑电路的数学工具。逻辑代数的定律、定理和规则,用于对表达式进行处理,以完成对逻辑电路的化简、变换、分析和设计
逻辑关系是事件产生的条件和结果之间的因果关系。在数字电路中,将事情的条件作为输入信号,结果作为输出信号。条件和结果中两种对立状态分别用逻辑 1 和 0 表示
注意,或运算分配律与普通代数运算不同!
证明:
通过逻辑代数运算得到等式相等
将等式两边分别用
任何含有某变量的等式,若等式中所有出现改变量的位置均代之以一个逻辑函数式,则此等式依然成立。
由此规则,可以扩大基本共识的应用范围,比如摩根律可以拓展到 n 个变量
对于任意一个逻辑函数式
例如
则其反函数可以表示为
任意逻辑函数式
若
任何逻辑函数都存在五种等价的形式
定义最简与或表达式:与项数最少,且各与项中变量数最少的与或表达式
由摩根律
任何表达式都可变换为上述五种形式的表达式
最简与或表达式:与项数最少,且各与项中变量数最少的与 - 或表达式
用 1 表示最小项中的原变量,用 0 表示反变量,由此得到一个二进制数。用
由若干最小项构成的与或表达式称为「最小项表达式」。
任何逻辑函数都可变换成唯一的最小项表达式。
将逻辑函数转换成一般与或式,再反复使用
如对于
再拓展成最小项
最小项表达式是若干最小项构成的,若某组变量值使表达式
用 1 表示最大项中的原变量,用 0 表示反变量,由此得到一个二进制数。用
由若干最大项构成的乘积表达式称为「最大项表达式」。
任何逻辑函数都可变换成唯一的最大项表达式。
代数法化简可以降低电路成本,以较少的门实现电路,或减少使用的门电路的种类
如果两个最小项只有一个变量互为反变量,那么称这两个最小项「在逻辑上相邻」。
将
相邻方格对应的最小项只有一个因子的差别,故其坐标按循环码排列,如
在卡诺图上,相邻方格的最小项,在逻辑上也是相邻的。卡诺图的几何相邻包括:
当逻辑函数为最小项表达式时,将表达式中出现的最小项对应的方格,在卡诺图中标为 1 ,其余方格标 0 (也可不标),便得到逻辑函数的卡诺图。
由最小项表达式的性质,任何逻辑函数都等于其卡诺图中标 1 方格所对应的最小项之和
卡诺图本质上是真值表的一种平面几何图形表示方法
若一组变量值使逻辑函数
卡诺图中相邻方格对应的最小项在逻辑上相邻,而逻辑相邻的最小项可合并。因此可以在卡诺图上画圈来合并最小项
如上图
任何逻辑函数都等于其卡诺图中为 1 的方格所对应的最小项之和,因此若将卡诺图中 1 方格所对应的最小项合并,则达到化简的目的
可以先列出真值表,再画出对应卡诺图,从而得到一个最简与或式。
硬件描述语言(Hardware Description Language)
逻辑仿真
逻辑综合
时序仿真(后仿真)
用于分隔文本,如:空格符(\b)、TAB 键(\t)、页符
用于改善可读性,不影响编译。
用字符串表示对象(如模块、输入/输出端口、变量),以英文字母或下划线开始,如 clk , counter8 , _net , bus_A
用来定义语言结构的特殊词汇。关键词都是小写,关键词不能作为标识符使用,如 module , endmodule , input , output , wire , reg , and 等
Verilog 语言规定了四种基本的逻辑值
可分为整数型常量和实数型常量
可采用十进制数的表示的方法,来表示有符号常量。例如:30,-2
也可采用带基数的形式的表示方法表示常量,格式为
例如:
其中下划线没有实际含义
Verilog 参数定义语句可定义标识符表示常量,称为符号常量,格式为
parameter 参数名 1 = 常量表达式 1, 参数名 2 = 常量表达式 2,
字符串是双撇号内的字符序列
用于表示连线,一般指电路中的物理连接。例如
常用的线网类型由关键词 wire 定义,格式如下
wire [n-1:0] 变量名 1, 变量名 2,
其中
用于行为描述时,暂存临时状态或中间结果。
寄存型变量只能在 initial 或 always 语句块内被赋值。行为级描述是电路功能行为的抽象描述,并不描述电路的具体结构。
寄存器类型的变量可以分为四种
例如
reg clock // 定义一个 1 位的寄存型变量
rege[3:0] counter; // 定义一个 4 位寄存器类型变量
将两个或多个信号的某些位拼接起来成为一个新的操作数
设 $A = 1'b1 , B = 2'b10 , C = 2'b00 $
而缩位运算是各个位之间做缩位运算
符号 | 意义 |
---|---|
{} {{}} | 拼接,复制 |
unary+, unary- | 单目正负 |
+ - * / ** | 算术 |
% | 模 |
> >= < <= | 关系 |
! | 逻辑非 |
&& | 逻辑与 |
|| | 逻辑或 |
== | 逻辑相等 |
!= | 逻辑不等 |
=== | 全等 |
!== | 不全等 |
~ | 位非 |
& | 位与 |
| | 位或 |
^ | 位异或 |
^~or~^ | 位同或 |
& | 单目位缩与 |
-& | 单目位缩与非 |
| | 单目位缩或 |
~| | 单目位缩或非 |
^ | 单目缩位异或 |
~^or^~ | 单目缩位同或 |
<< | 逻辑左移 |
>> | 逻辑右移 |
<<< | 算术左移 |
>>> | 算术右移 |
?: | 条件 |
门级建模:将逻辑电路图用 HDL 规定的文本语言表示出来
使用语法
and A1(out,in1,in2,...); // 多输入门
not N1(out1, out2, ..., in) // 多输出门
bufif1 B1(ctrl,in, out); // 三态门
只允许有一个输出,但可以有多个输入.
语句 | 门 |
---|---|
and | 与门 |
or | 或门 |
xor | 异或门 |
nand | 与非门 |
nor | 或非门 |
xnor | 异或非门 |
语句 | 门 |
---|---|
buf | 缓冲器 |
not | 反相器 |
语句 | 门 |
---|---|
bufif1 | 高电平有效控制三态缓冲器 |
bufif0 | 低电平有效控制三态缓冲器 |
notif1 | 高电平有效控制三态反相器 |
notif0 | 高电平有效控制三态反相器 |
module ABC(port1 , port2, ...); // 各模块通过端口相互连接
inout/input/output ... ; // 端口类型说明
reg/wire/ ... ; // 变量类型说明
parameter ... ;// 参数定义,逗号分割多个参数
and/or/ ... ; // 结构描述方式 , 逻辑门或底层模块
assign...; //数据流描述方式, 连续赋值语句
always/initial //行为描述方式, 过程块结构
begin // 多条语句组成的行为描述块
if ... else ... ;// 条件描述语句
case // 分支描述语句
...
endcase // 无实际语义的语句无分号
end
endmodule
例如对于图示门电路
建立其 Verilog 模型
module mux2to1(output Y, input[1:0], input S);
wire Snot, A, B;// 定义内部节点信号数据类型
not U1(Snot, S);
and U2(A,D[0], Snot);
and U3(B,D[1],S);
or U4(Y,A,B);
endmodule