目录
[一、半加器(Half Adder)](#一、半加器(Half Adder))
[二、全加器(Full Adder)](#二、全加器(Full Adder))
[三、全减器(Full Deductor)](#三、全减器(Full Deductor))
[4 线 -2 线编码器](#4 线 -2 线编码器)
[8 线-3 线编码器](#8 线-3 线编码器)
[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描述。
各种电路也是对于其他电路的扩展,大家要做到融会贯通。多种电路拼接也要能识别出来。