典型组合逻辑电路设计

目录

行为级描述方式基本运算电路

[一、半加器(Half Adder)](#一、半加器(Half Adder))

[二、全加器(Full Adder)](#二、全加器(Full Adder))

1、逻辑门构成加法器

2、集成全加器

3、串行加法器

4、超前进位加法器

[三、全减器(Full Deductor)](#三、全减器(Full Deductor))

数值比较电路

一、一位比较器

二、四位比较器

三、集成比较器

编码器

[4 线 -2 线编码器](#4 线 -2 线编码器)

[8 线-3 线编码器](#8 线-3 线编码器)

译码器

一、二进制译码器

2线-4线译码器

[3 线- 8 线译码器](#3 线- 8 线译码器)

[二、 二-十进制译码器](#二、 二-十进制译码器)

三、数字显示译码器

数据选择器

[一、2 选 1 数据选择器](#一、2 选 1 数据选择器)

[二、4 选 1 数据选择器](#二、4 选 1 数据选择器)

[三、4 位 2 选 1 多路选择器](#三、4 位 2 选 1 多路选择器)

总结


行为级描述方式基本运算电路

一、半加器(Half Adder)

半加器:不考虑低位的进位输入,将两位数相加得到本位和进位。

AB为输入,本位,进位C=AB。

所以使用verilog的数据流级描述如下

module halfadd (a, b, c, s);
    input wire a, b;
    output wire c, s
    assign s=a^b;
    assign c=a&b;
endmodule 

二、全加器(Full Adder)

全机器与半加器相比考虑低位的进位输入,本位是否为1要看加数、被加数和低位进位中一的个数,奇数个1本位就是1,而1的个数为奇数个,异或结果为1,

所以

是否进位,要么AB都是1,或者AB有一个1且低位进位是1,所以

至于形式,因为ABC同为加数的一份子,地位等价,所以格式可以变化不唯一。

1、逻辑门构成加法器

AB为加数和被加数,为低位进位,列出真值表

由真值表得到卡诺图,根据卡诺图得出化简公式,与上面理解的一致

(ABC等价,所以公式与上面的是等价的)

根据化简表达式画出逻辑电路图

用verilog数据流级描述

module adder (a, b, cl, ch, s);
    input wire a, b, cl;//cl为低位进位
    output wire ch, s;//ch为产生的进位
    assign ch = (a&b) | ((a|b)&cl); 
    assign s = a^b^cl; 
endmodule
2、集成全加器

双全加器具有独立的全加和与进位输出,这 样每个全加器既可单独使用也可级连起来使用 ,即二位进制器加法 。下图是集成全加器 74183

3、串行加法器

使用 4 个全加器实现一个 4 位串行进位加法器,产生的进位C与高位进行运算

ab和结果s都为4位,所以线宽为[4:0]

module adder4 (a, b, s, cf, ovf);
    input wire[3:0] a, b;
    output wire [3:0] s;
    output wire cf, ovf;//ovf为溢出标记
    wire [4:0] c;
    assign c[0]=0;//最低位还没有进位,置0
    assign s= a^b^c[3:0];
    assign c[4:1]=a&b | (a|b)&c[3:0];
    assign cf=c[4];
    assign ovf= c[4]^c[3];
endmodule

以下两句体现了串行的思想

assign s= a^b^c[3:0];

assign c[4:1]=a&b | (a|b)&c[3:0];//ab要与低位的进位进行运算才得到本位的进位

ovf是溢出标记,对一个N位二进制补码,其可以表达的范围是~之间。如果超出这个范围就称为溢出了。

例如计算-2-6,带上符号位就是1010+1110=11000,超出一位。而我们能表示的最小为-7,比范围的最小值还要小,这个叫做负溢出。同理如果想要的结果比最大值还要大,那么就叫做正溢出。

4、超前进位加法器

为了提高运算速度,必须减小或消除由于进位逐级传递(串行加法器)所浪费的时间。超前进位加法器就是根据 这样的思路而设计的。

因此,只要 A3A2A1A0 、 B3B2B1B0 和 C 给出, 就直接可求出 C3 、 C2 、 C1 、 C0 ,进而得到 4 位加法器的结果 S3S2S1S0 。

三、全减器(Full Deductor)

考虑低位借位进行减法运算。

如果被减数为1,那么最后本位为1就是减数和借位同为0或1;如果被减数为0,那么最后本位为1就是减数和借位有一个为1。所以这里又是奇数个1的规律,若D本位,G低位借位

由此

对于借位,B和G都为1肯定产生借位,B和G有一个为1,要产生借位A就是0

所以

可以验证一下公式:

1.先画真值表

2.利用卡诺图化简

得到

得到

3.画出电路图

数值比较电路

一、一位比较器

列真值表

得到

电路图如下

二、四位比较器

比较大小就是从高位依次向低位比较,本位不同出结果,本位相同继续比

若A>B,

若A=B,

若A<B,

下图为典型的集成比较器 7485 的引脚图

用verilog行为级描述方式

module comp4bita (A, B, gt, eq, lt);
    input wire [3:0] A,B;
    output reg gt, eq, lt;
    always @(A, B)//A或B一旦有点电平变化,就进行比较
    begin
    if (A>B) begin gt = 1; eq = 0; lt = 0; end
    if (A=B) begin gt = 0; eq = 1; lt = 0; end
    if (A<B) begin gt = 0; eq = 0; lt = 1; end
    end
endmodule

三、集成比较器

八位比较器就是将四位比较器7485串联,低四位比较结果传给高位进行最后的判断,(低四位比较器如果再无更低位时,将A=B赋值为0)

编码器

编码:是指用文字、符号和数码来表示 某种信息的过程

编码器:实现编码的数字电路,把输入 的每个高低电平信号编成一组对应的二 进制代码

二进制编码器:输入信号可以是低电平有效或高电平 有效的形式 ;编码器的输出码可以是原码形式也可以是反码形式

比如输入0010,输出01,输入信号为某一位为1,输出指示哪一位为1

4 线 -2 线编码器

真值表如下:

verilog数据流级描述

module ENC4_2a (i, y);
    input wire [3:0] i;
    output wire [1:0] y;
    assign y[1] = i[3] | i[2]; 
    assign y[0] = i[3] | i[1]; 
endmodule

行为级描述方式

module ENC4_2b (i, y);
    input wire [3:0] i;
    output reg [1:0] y;
always @(i)
    4'b0001: y = 2'b00; 
    4'b0010: y = 2'b01; 
    4'b0100: y = 2'b10; 
    4'b1000: y = 2'b11;
endmodule
8 线-3 线编码器

低电平有效,即对输入为" 0" 的位编码

真值表如下

得到表达式后绘制 逻辑电路图

译码器

译码是编码的逆过程,其功能是将具有特定含义 的不同二进制代码"翻译"出来。

二进制译码器属于完全译码器 ( 设译码器有 n 个输入和 m个输出,则 m=2n ) ,不满足该条件 的称为部分译码器。

一、二进制译码器

编码器和译码器的比较

2线-4线译码器

E为使能端,只有为1时,才进行译码,此外低电平有效,所以真值表如下

函数表达式

电路图

数据流级描述

module DEC2_4a (a, z);
    input wire [1:0] a;
    output wire [3:0] z;
    assign z[0] = ~a[1]&~a[0]; 
    assign z[1] = ~a[1]&a[0]; 
    assign z[2] = a[1]&~a[0];
    assign z[3] = a[1]&a[0]; 
endmodule

行为级描述方式

module DEC2_4b (a, z);
    input wire [1:0] a;
    output reg [3:0] z;
always @(a)

    2'b00: z = 4'b0001; 
    2'b01: z = 4'b0010; 
    2'b10: z = 4'b0100; 
    2'b11: z = 4'b01000;
endmodule
3 线- 8 线译码器

与2线-4线同理,不过多赘述,注意输出是高电平有效还是低电平有效

二、 二-十进制译码器

二-十进制译码器的功能是将 8421BCD 码翻译成十个不同点位的指定电平。

假如低电平有效,真值表为

三、数字显示译码器

最常见的七段数字 显示译码器

高电平有效,输出0-9的数字,真值表为

得到表达式

数据流级描述方式

module hex7seg1 (x, a_to_g);
    input wire [3:0] x;
    output wire [6:0] a_to_g;
    assign a_to_g[6] = x[3] | x[2]&x[0] |x[1]&x[0] | ~x[2]&~x[0]; 
    assign a_to_g[5] = ~x[2] | x[1]&x[0] |~x[1]&~x[0]; 
    assign a_to_g[4] = x[2] | ~x[1] | x[0]; 
    assign a_to_g[3] = ~x[2]&~x[1] | x[1]&~x[0] | ~x[2]&x[1] | x[2]&~x[1]&x[0];
    assign a_to_g[2] = ~x[2]&~x[0] | x[1]&~x[0]; 
    assign a_to_g[1] = x[3] | ~x[1]&~x[0] |x[2]&~x[0] | x[2]&~x[1]; 
    assign a_to_g[0] = x[3] | x[1]&~x[0] | ~x[2]&x[1] | x[2]&~x[1]; 
endmodul

当然,如果只是为了写verilog,可以使用行为级更为简便

module hex7seg2 (x, a_to_g);
input wire [3:0] x;
output reg [6:0] a_to_g;
always @ ( x )
case (x)
0: a_to_g = 7'b1111110;
1: a_to_g = 7'b0110000;
2: a_to_g = 7'b1101101;
3: a_to_g = 7'b1111001;
4: a_to_g = 7'b0110011;
5: a_to_g = 7'b1011011;
6: a_to_g = 7'b0011111;
7: a_to_g = 7'b1110000;
8: a_to_g = 7'b1111111;
9: a_to_g = 7'b1110011;
default: a_to_g =7'bxxxxxxx;
endcase
endmodule

因为x的范围是0-15,所以含default部分,这部分设置为未知状态x。

数据选择器

数据选择器是根据地址选择码从多路输入数据中 选择一路数据输出,也称复用器。

一、2 选 1 数据选择器

有ab两路数据输入,s选择接收a还是b的数据,也就是当 s=0 时, y=a; 当 s=1 时, y=b 。

表达式

门级 Verilog 描述

module mux21a(a, b,s, y);
    input a, b, s ;
    output y ;
    wire ns, c, d ;
    not U1(ns, s);
    and U2(c, ns, a) ;
    and U3(d, s, b) ;
    or U4(y, c, d) ;
endmodule

其中的not、and、or就是已经实现的逻辑运算,我们也可以定义自己的门运算,例如

selfDesign U(.arg1(a),.arg2(b)); //arg1为函数的形参,a为实参

其他verilog描述大家自己尝试

二、4 选 1 数据选择器

A1A0决定选择哪路输入,如A1A0=10时,Y=D2

逻辑电路如下

verilog大家自行设计。

三、4 位 2 选 1 多路选择器

与之前没有较大差别,只是输入的数据由一位变成四位

总结

可以看出对于这部分,理清逻辑电路有固定顺序,作真值表、卡诺图、表达式、电路图以及进行verilog描述。

各种电路也是对于其他电路的扩展,大家要做到融会贯通。多种电路拼接也要能识别出来。