购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

第一讲

科学思维三段推理
数字电路逻辑运算逻辑运算

人类潜意识的深处存在一个压倒一切的需求,即追求一个符合逻辑、凡事有理可据的宇宙。

——《沙丘》

有句歌词唱得好:“想你就乱乱乱头绪,不想又伤伤伤自己,情深就不必问是合不合逻辑。”

如果这个里面的“你”指的是人,男女勿问,老衲不参与意见。“数年只看黄卷书,今世不问人间情”,出家人六根清净,不可能做“爱情顾问”。再说了,我也不会宝岛腔,装不得“恋爱咨询师”,还得是台湾来的。但是,引申到本书的内容,“他”如果是数字电路系统,则这个歌词就大错特错了。上升到科学思维角度,自古希腊以降,所有科学都是建立在形式逻辑、三段论推导的基础上的。鄙人可不敢说,数字电路逻辑设计不是科学,这是找打的言论。具体到数字电子技术,前文书说了其数学基础是布尔逻辑,更无法逃离“逻辑”的魔掌了。

总结一下,数字电路里,所有组合单元都可以用与非门做出来。这不是在下的结论,是《布尔代数》里的结论。因此,上课时老师们总喜欢“圈圈圆圆圈圈”地化简“卡诺图”。数学基础在哪里呢,他们不讲,不晓得为什么。“黑板上老师的粉笔,还在拼命唧唧喳喳写个不停……”以小人之心度之,也不是好事,显得老衲也不那么光明伟岸了,吾有权保持沉默!

另外声明一下,这儿是说书的地方,不是《中国好声音》。

一、基本运算真值表

俗话说:“木分花梨紫檀,信分标量向量,”标量和向量的区别前面已经聊过,主要是信号比特宽度。无疑,1比特的标量相对向量信号简单,也是进军向量的必经之地。对于标量信号的逻辑运算有以下几种。

· 逻辑取反(!):对1个操作数进行逻辑取反,如果这个操作数为0,则结果为1;如果这个操作数不为0,则结果为0。

· 逻辑与(&&):对2个操作数进行逻辑与,如果两者同为1或同不为0,则结果为1,否则为0。

· 逻辑或(||):对2个操作数进行逻辑或,如果两者其中至少有一个不为0,则结果为1,否则为0。

这些运算在Verilog语言里也称为“逻辑操作”,对应在电路里是非门、与门和或门。表3.1中给出了它们对应的电路符号和真值表(一般只在条件判断中使用,因此真值表中无x和z值的定义)。

表3.1 逻辑运算操作符、真值表与对应电路符号

对于向量,存在按照比特操作(一般语法书里叫作“按位操作”)和信号各个比特一起操作(一般语法书里叫作“缩减操作”)两个类型。

按位操作包含如下几种。

· 按位取反(~):1个多位操作数按位取反。例如,a=4'b1011,则~a的结果为4'b0100。

· 按位与(&):2个多位操作数按位进行与运算,各位的结果按顺序组成一个新的多位数。例如,a=2'b10,b=2'b11,则a&b的结果为2'b10。

· 按位或(|):2个多位操作数按位进行或运算,各位的结果按顺序组成一个新的多位数。例如,a=2'b10,b=2'b11,则a|b的结果为2'b11。

· 按位异或(^):2个多位操作数按位进行异或运算,各位的结果按顺序组成一个新的多位数。例如,a=2'b10,b=2'b11,则a^b的结果为2'b01。

· 按位同或(~^或^~):2个多位操作数按位进行同或运算,各位的结果按顺序组成一个新的多位数。例如,a=2'b10,b=2'b11,则a~^b的结果为2'b10。

显然,如果把标量视为一种特殊的向量,则对标量的按位取反(~)和前面逻辑操作的反操作(!)是一样的操作,类似的还有与操作和非操作。按位操作一般用于一般信号之间的逻辑操作,因此也要对x和z值进行定义。表3.2中给出了它们对应的电路符号和真值表。

表3.2 按位运算操作符、真值表与对应电路符号

缩减操作都是对于一个向量,或者说多比特信号进行操作的,包括以下几种。

· 缩减与(&):对一个多位操作数进行缩减与操作,先将它的最高位与次高位进行与操作,其结果再与第二次高位进行与操作,直到最低位。例如,&(4'b1011)的结果为0。

· 缩减与非(~&):对一个多位操作数进行缩减与非操作,先将它的最高位与次高位进行与非操作,其结果再与第二次高位进行与非操作,直到最低位。例如,~&(4'b1011)的结果为1。

· 缩减或(|):对一个多位操作数进行缩减或操作,先将它的最高位与次高位进行或操作,其结果再与第二次高位进行或操作,直到最低位。例如,|(4'b1011)的结果为1。

· 缩减或非(~|):对一个多位操作数进行缩减或非操作,先将它的最高位与次高位进行或非操作,其结果再与第二次高位进行或非操作,直到最低位。例如,~|(4'b1011)的结果为0。

· 缩减异或(^):对一个多位操作数进行缩减异或操作,先将它的最高位与次高位进行异或操作,其结果再与第二次高位进行异或操作,直到最低位。例如,^(4'b1011)的结果为1。

· 缩减同或(~^or^~):对一个多位操作数进行缩减同或操作,先将它的最高位与次高位进行同或操作,其结果再与第二次高位进行同或操作,直到最低位。

例如,~^(4'b1011)的结果为0。

对于1比特的标量情况,请自行分析,算是思考题。与按位操作类似,缩减一般用于一般信号之间的逻辑操作,因此也要对x和z值进行定义。表3.3中给出了缩位与、缩位或和缩位异或对于1比特信号,对应的电路符号和真值表。

表3.3 缩减运算操作符、真值表与对应电路符号

(续表)

老衲说得累,也看到了不少扁桃体(打哈欠露出来的)。没办法,有时候,也不得不老和尚念经。

二、逻辑操作巧运算

前面说了,数字逻辑里的所有运算实质上都是逻辑操作。下面鄙人就来个管中窥豹,在设计系统的百花园里采几朵狗尾巴花,让大家瞧瞧。

我们先瞧瞧最简单的一个比特位宽的加法器:半/全加器。全加器的输入为三个1比特的信号a0、a1,还有低位的进位c0;输出也是两个1比特的信号:结果s和进位位c1。单元的真值表如表3.4所示。好了,数字电路到此复习结束。做数字逻辑的一个好处,就是组合逻辑不用化简,自然有软件帮你完成。因此,你完全不必写s和c的公式。如果固定c0=0,就可以省略c0这个信号,就是所谓的半加器。全加器和半加器的符号如图3.2所示。

表3.4 全加器的真值表

图3.2 全加器与半加器的符号

例3.3给出了一个全加器模块的代码,大家赏光看看。对于半加器,只要把输入端c0接到低电平“0”上(如例3.4所示),综合软件自会优化,因此此处不啰唆了。

顺道说明一下,本书里的代码会省略说明等很占用版面的地方,以帮诸位施主节约一些钞票。

【例3.3】全加器模块(关键部分)

module full_adder

input a0,a1,

input c0,

output s,

output c1

);

//Defination for Variables in the module

wire t1,t2,t3;

//Logicals

//Sum:

assign s=(a0 ^ a1)^ c0;

//Carry bit: ?eparate the equation into

//3 indepedennt parts in order to read

assign t1=a0 & c0;

assign t2=a1 & c0;

assign t3=a0 & a1;

assign c1=(t1 | t2)| t3;

endmodule

【例3.4】利用全加器实现半加器

module half_adder

input a0,a1,

output s,

output c1

);

//Load other module(s)

full_adder F1(.a0(a0),.a1(a1),.c0(1'b0),

.s(s),.c1(c1));

//Defination for Variables in the module

//Logicals

endmodule

下面的例3.5给出了一些逻辑操作计算的例子,计算不是重点,重点在于可以利用逻辑操作完成部分后面关系操作的功能。这个在 ASIC 设计中会节约电路成本。再多说一句,如果代码中真的采用了这样的描述,请一定、千万和务必写一写注释,要不然别人很难读懂贵代码了。

【例3.5】部分关系操作的逻辑运算实现

这一回的例子比较少,望您老谅解。饭馆刚刚开张,食材货品不全,这菜难炒啊!

这正是:

“学习思想为基础,数电布尔为舟度。标量与或反为主,按位缩减多位顾。真值表中零一数,也要认准符号图。加法本是逻辑步,关系亦有门电路。” 26OxruFU3uSnByJCgmWLc/+C2hgBfAq72gYHSHZ1J2c8A4G+PPWL7qYaBrDvjnbv

点击中间区域
呼出菜单
上一章
目录
下一章
×