组合逻辑概述

电子说

1.4w人已加入

描述

组合逻辑概述

由MOS获得基本逻辑门之后,再由门级电路形成组合逻辑电路。组合逻辑电路有三种表示方法:

(a)真值表

(b)结构化(即门级)原理图

(c)布尔方程

示例:例如一个单bit全加器,实现的是两个输入信号 a,b以及进位位 c_in的相加。输出一个相加的结果sum和一个进位位c_out。

其真值表如下:

逻辑电路

根据真值表可以直接写出其布尔方程式。

获得某个输出的积之和(多项做与然后再做或)的布尔表达式方法如下:

1. 找到输出为1的对应的输入,如果此输入为0则取反。将输入做与。

2. 将上面所有的与项再做或操作。

以上面的全加器为例。使得输出sum为1的有:

逻辑电路

故对应sum的积之和布尔表达式如下(*表示与操作,+表示或操作, ' 表示取反):

sum = a' * b' * c_in+a' * b * c_in'+a * b' * c_in' + a * b * c_in 

同样分析可以得出 c_out的积之和布尔表达式如下:

c_out = a' * b * c_in+a * b' * c_in+a * b * c_in' + a * b * c_in 

根据积之和表达式就可以得出相应的积之和对应的门级电路。以与或门构成。下面是sum的积之和电路,这里由三个2输入或门实现一个四输入或门逻辑。

相应的c_out的积之和门级电路如下。

可以看到这样获得积之和布尔表达式与对应的电路都是两级的,前面一级为与门逻辑,后面一级为或门逻辑。

当然不止只有积之和这一种表达方式,还可以利用狄摩根定律去转化成和之积的表达方式。

狄摩根定律如下( " ' " 表示取反," * " 表示与, " + "表示或):

(a + b + c + ...) ' = a'  *  b'  * c'  * ...

(a * b * c * ...) ' = a' + b' + c' + ...

根据狄摩根定律第二条,就可以将积之和布尔表达式转化成和之积形式;根据狄摩根定律第一条,就可以将和之积布尔表达式转化成积之和形式。

这里以将sum的积之和布尔表达式转化成和之积形式为例。

sum = ( (a' * b' * c_in+a' * b * c_in'+a * b' * c_in' + a * b * c_in)' )'

= ( (a' * b' * c_in)' * (a' * b * c_in')' * (a * b' * c_in')' * (a * b * c_in) ') '

= ( ( a+b+c_in' )*( a+b'+c_in )*( a'+b+c_in )*(a' + b' + c_in') )'

从布尔表达式可以看到,和之积表达式的的前级为或门逻辑,后一级为与门逻辑。

Verilog对组合逻辑电路的描述,可以分为结构级描述,数据流级描述,行为级描述三种方式。

以上面对sum这个电路描述为例,将sum这个电路作为一个完整的module描述,给这个电路取个名字为get_sum。

结构级描述方式如下(其中not是表示非门,and表示与门,or表示或门):

module get_sum(

input a,

input b,

input c_in,

output sum

);

wire  a_n,b_n,c_in_n;

not (a_n,a);

not (b_n,b);

not (c_in_n,c_in);

wire and_o1,and_o2,and_o3,and_o4;

and (and_o1,a_n,b_n,c_in) ;

and (and_o2,a_n,b,c_in_n) ;

and (and_o3,a,b_n,c_in_n) ;

and (and_o4,a,b,c_in) ;

wire or_o1,or_o2;

or (or_o1,and_o1,and_o2);

or (or_o2,and_o3,and_o4);

or (sum,or_o1,or_o2);

endmodule

数据流级描述方式(& 与,| 或 ,~ 非):

module get_sum(

input a,

input b,

input c_in,

output sum

);

wire  a_n,b_n,c_in_n;

assign a_n = ~a;

assign b_n = ~b;

assign c_in_n = ~c_in;

wire and_o1,and_o2,and_o3,and_o4;

assign and_o1 = a_n&b_n&c_in;

assign and_o2 = a_n&b&c_in_n;

assign and_o3 = a&b_n&c_in_n;

assign and_o4 = a&b&c_in;

wire or_o1,or_o2;

assign or_o1 = and_o1 | and_o2;

assign or_o2 = and_o3 | and_o4;

assign sum = or_o1 | or_o2;

endmodule

行为级描述方式(这里采用了case语句,也可以采用if else语句;{ }是位拼接符,如 {a,b,c_in}就是将a,b,c_in拼成一个三位的数据,a为最高位,b为次高位,c_in为最低位):

module get_sum(

input a,

input b,

input c_in,

output reg sum

);

always @( * )   begin

case( {a,b,c_in} )

3'b001: sum = 1'b1;

3'b010: sum = 1'b1;

3'b100: sum = 1'b1;

3'b111: sum = 1'b1;

default: sum = 1'b0;

endcase

end

endmodule

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分