组合逻辑电路Part1(含verilog代码实现)

什么是组合逻辑电路?

数字电路理论中组合逻辑电路1(combinatorial logic或combinational logic)是一种逻辑电路,它的任一时刻的稳态输出,仅仅与该时刻的输入变量的取值有关,而与该时刻以前的输入变量取值无关。 用数学公式表达,即:
  F i = f ( x 1 , x 2 , … , x n ) , i = 1 , 2 , … , m   . \ F_i=f(x_1,x_2,…,x_n) , i=1,2,…,m\,.  Fi=f(x1,x2,,xn),i=1,2,,m.
计算机中用到的其他电路,如半加器、全加器、半减器、全减器、数据选择器、数据分配器、编码器和译码器也用来构成组合逻辑电路。

逻辑电路的分析

补充知识点

有效电平
数电实践课上,我们会经常听到片选信号低电平有效之类的说法,那么这具体代表什么含义呢?

  1. 有效电平(有信号输入或输出)
    正逻辑电路中,凡是变量1表示有信号输入或输出,则为高电平有效电路;凡变量0表示的则为低电平有效电路
  2. 输入变量的有效电平往往取决于信号的来源,输出变量的有效电平往往取决于负载对电路的要求;为了方便设计,当高电平有效时,写为原变量,当低电平有效时,写为反变量。
  3. 片选是一个单片机学科术语,片选信号一般是在划分地址空间时,由逻辑电路产生的;
  4. 为了降低功率,同时减少干扰和保证控制的可靠性,许多器件的片选信号选择低电平有效

最小项和最大项
我们用真值表定义一个布尔函数,布尔函数可以用乘积项的逻辑和表示。简单来说,最小项即包含n个变量的与项。
例如:A,B,C三个逻辑变量的对应23=8个最小项,分别为:
  A B C , A B C ˉ , A B ˉ C , A ˉ B C , A B ˉ C ˉ , A ˉ B C ˉ , A ˉ B ˉ C , A ˉ B ˉ C ˉ   \ ABC, AB\bar{C}, A\bar{B}C, \bar{A}BC, A\bar{B}\bar{C}, \bar{A}B\bar{C}, \bar{A}\bar{B}C, \bar{A}\bar{B}\bar{C}\,  ABC,ABCˉ,ABˉC,AˉBC,ABˉCˉ,AˉBCˉ,AˉBˉC,AˉBˉCˉ
如果用和式的逻辑乘表示布尔函数,最大项即为包含n个变量的或项。
如:
  F 1 = A ˉ B C + A B ˉ C + A B C ˉ = ∑ m ( 3 , 5 , 6 )   \ F1=\bar{A}BC+A\bar{B}C+AB\bar{C}=\sum m(3,5,6)\,  F1=AˉBC+ABˉC+ABCˉ=m(3,5,6)
  F 2 = ( A ˉ + B ˉ + C ˉ ) ( A ˉ + B ˉ + C ) ( A + B ˉ + C ) = ∏ M ( 0 , 1 , 2 )   \ F2=(\bar{A}+\bar{B}+\bar{C})(\bar{A}+\bar{B}+C)(A+\bar{B}+C)=\prod M(0,1,2)\,  F2=(Aˉ+Bˉ+Cˉ)(Aˉ+Bˉ+C)(A+Bˉ+C)=M(0,1,2)

电路分析与设计

逻辑电路分析题,一般要求我们找到输入输出之间的逻辑关系,并指出电路的逻辑功能;
组合逻辑电路功能的几种表示方法:真值表、卡诺图、逻辑表达式及时间图
电路分析的步骤:

  1. 逻辑图->逻辑表达式;//若给定波形图,可采用控制变量法判断输入输出变量,再有真值表最小项或最大项写出表达式;
  2. 化简逻辑表达式;//可用代数运算或卡诺图
  3. 确定输出变量的物理意义,进而描述电路功能(如:将8421码转化为余三码)

逻辑电路设计题中,往往给定功能,要求设计出最佳电路。一般,最佳电路要求:

  • 所用逻辑器件的数目、种类最少,且器件之间的连线最简单;
  • 门电路有延迟,应使级数尽量少;
  • 功耗小,工作稳定可靠

例:分析下图电路的功能,并写出verilog HDL程序。
逻辑电路图
解答步骤

  1. 写出逻辑表达式
      G 3 = B 3 ;     G 2 = B 3 ⊕ B 2 ;   .   G 1 = B 2 ⊕ B 1 ;   .   G 0 = B 1 ⊕ B 0 ;   . \ G3=B3;\, \ G2=B3 \oplus B2;\,. \ G1=B2 \oplus B1;\,. \ G0=B1 \oplus B0;\,.  G3=B3; G2=B3B2;. G1=B2B1;. G0=B1B0;.
  2. 列出真值表分析
    真值表
    该电路的功能是:将4位二进制码转化为4位GRAY码。
  3. verilog代码
// BTOG module
module BTOG(B3,B2,B1,B0,G3,G2,G1,G0);
	input B3,B2,B1,B0;
	output G3,G2,G1,G0;
	assign G3=B3;
	assign G2=B3^B2;
	assign G1=B2^B1;
	assign G0=B1^B0;
endmodule

电路器件原理

数据选择器

数据选择器又称多路选择器(MUX),可等效为一个单刀多掷开关;
原理框图与等效开关
可以看到MUX有两种输入端:地址输入端(用A表示)和数据输入端(用D表示)。
n个地址输入端对应2n个数据输入端。因为把从全0到全1排列,共有2n个值,每一个值对应一个D端;每取一个值,对应一个选中的D端,这时输出Y为该D端口的值。
如:2选1、4选1、8选1···MUX

功能描述:

以8选1MUX为例,集成电路74LS151
8选1MUX
¬ E \neg E ¬E为使能端,低电平有效。
输出函数表达式
  Y = ∑ i = 1 3 m i D i = ( A 2 A 1 A 0 ) m ( D 0 D 1 D 2 D 3 ) T   \ Y=\sum_{i=1}^3 m_iD_i=(A_2A_1A_0)_m(D_0D_1D_2D_3)^T\,  Y=i=13miDi=(A2A1A0)m(D0D1D2D3)T
推广:对n个地址输入的MUX,其表达式为:
  Y = ∑ i = 1 2 n − 1 m i D i   \ Y=\sum_{i=1}^{2^n-1} m_iD_i\,  Y=i=12n1miDi
其中mi是由地址变量组成的地址最小项。
verilog语言描述

// MUX8 module
module mux8(A,D,Y);
	input [2:0]A;
	input [7:0]D;
	output Y;
	reg Y;
	always@(A)
		case(A)
			0:Y<=D[0];
			1:Y<=D[1];
			2:Y<=D[2];
			3:Y<=D[3];
			4:Y<=D[4];
			5:Y<=D[5];
			6:Y<=D[6];
			7:Y<=D[7];
		endcase
endmodule

注:

  • verilog语言可用case条件语句表示多种情况的分支,但一定要将所有情况穷尽;
  • 列出所有有效情况后要加上default保证所有情况都能执行。default缺省,表示列出的情况以外的情况都执行default语句。
  • 可以利用数据选择器设计多功能组合电路的类型。

数据分配器

数据分配器(DEMUX)将一路输入数据按n位地址分配到2n个数据输出端上;
DEMUX
有两种输入端:地址输入端,用A表示;数据输入端,用D表示。n个地址输入端对应2n-1个数据输出端。每取一个地址值,对应选中的Y端,此时对应的Y端输出D值,没选中的Y端默认输出为高电平。数据分配器等效为数据选择器的反变换。
输出函数表达式
  Y = { D , i = A 2 n − 1 ⋅ ⋅ ⋅ A 1 A 0 1 , i ≠ A 2 n − 1 ⋅ ⋅ ⋅ A 1 A 0   \ Y=\begin{cases}D,&i=A_{2^n-1}···A_1A_0 \cr 1,&i\neq A_{2^n-1}···A_1A_0\end{cases}\,  Y={D,1,i=A2n1A1A0i=A2n1A1A0

编码器/译码器

编码器
编码器有2^n个数据输入端和n个数据输出端,每个码只对应一个输入信号,某时刻只对一个输入信号进行编码。
常见的编码器类型有3种:二进制编码器、二-十进制编码器、优先编码器。这里主要介绍优先编码器。
优先编码器允许输入端同时有多个编码信号,但是电路只对优先权较高的一个进行编码。
优先编码器
如图,这是一个4-2优先编码器,有4个输入端,2个输出端。所有输入端都有一个小圆圈,表示输入为低电平有效,即输入0时有效,输出端也是如此,输出低电平为有效电平。
附加的功能端有:

  • S ‾ \overline{S} S:选通输入端,即使能端,低电平有效;
  • Y s ‾ \overline{Y_s} Ys:选通输出端,低电平有效,无编码输入指示;
  • Y E X ‾ \overline{Y_{EX}} YEX:输出扩展端,低电平有效,指示编码状态;

以74LS148编码器为例,用verilog语言设计:

// cod8 module
module cod8(nS,nI,nY,nYs,nYex); 
	input nS;  
	input [7:0] nI;  
	output [2:0] nY;  
	output nYs,nYex;   
	reg [2:0] nY;   
	reg nYs,nYex;
	always @(nS or nI)  
	if(nS)       
		{nY,nYs,nYex}<=5'b00011;   
	else     
	casex(nI)       
		8'b0xxxxxxx: {nY,nYs,nYex}<=5'b00010;       
		8'b10xxxxxx: {nY,nYs,nYex}<=5'b00110;       
		8'b110xxxxx: {nY,nYs,nYex}<=5'b01010;       
		8'b1110xxxx: {nY,nYs,nYex}<=5'b01110;       
		8'b11110xxx: {nY,nYs,nYex}<=5'b10010;       
		8'b111110xx: {nY,nYs,nYex}<=5'b10110;       
		8'b1111110x: {nY,nYs,nYex}<=5'b11010;       
		8'b11111110: {nY,nYs,nYex}<=5'b11110;       
		default: {nY,nYs,nYex}<=5'b11101;     
endcase
endmodule

注:casex语句与case、casez语句的区别
语句格式相同,但对于x,z的敏感程度不同;x表示无效,z表示高阻;
casez语句中,如果分支表达式某些位的值为高阻z,那么对这些位的比较就会忽略,而只关注其他位的比较结果;
变量前加n表明变量使低电平有效;

译码器
逻辑功能:将输入的二进制代码的原意译为相应的状态信息。可分为两种类型:变量译码器和显示译码器;

  • 变量译码器:唯一地址译码器,常用于计算机中将一个地址代码转换成一个有效信号;
  • 显示译码器:主要用于驱动数码管显示数字或字符;
    变量译码器最常用的是3-8译码器即74LS138译码器。
    3-8译码器
    如上图,输入端为高电平有效,输出端为低电平有效。三个使能端必须同时有效,即 E 1 E 2 ‾ E 3 ‾ = 100 时 E_1\overline{E_2}\overline{E_3}=100时 E1E2E3=100,芯片才能正常工作。正常工作时,输出表达式为:
      Y i ˉ = m i ˉ = M i , ( i = 0 , 1 , … , 7 )   \ \bar{Y_i}=\bar{m_i}=M_i ,(i=0,1,…,7)\,  Yiˉ=miˉ=Mi,(i=0,1,7)
    使用verilog语言实现3-8译码器,使能端高电平有效,输出端低电平有效:
// decode module
module decode(Ain,En,Yout);
	input En;    
	input [2:0] Ain;     
	output [7:0] Yout;   
	reg [7:0] Yout;   
	always @ (En or Ain)      
	begin  
	if (!En)            
		Yout = 8'b0;     
	else           
	case (Ain)               
		3'b000 : Yout = 8'b00000001;               
		3'b001 : Yout = 8'b00000010;               
		3'b010 : Yout = 8'b00000100;               
		3'b011 : Yout = 8'b00001000;              
		3'b100 : Yout = 8'b00010000;               
		3'b101 : Yout = 8'b00100000;              
		3'b110 : Yout = 8'b01000000;               
		3'b111 : Yout = 8'b10000000;               
		default : Yout = 8'b00000000;            
	endcase        
end 
endmodule

注:

  1. 实际编程时,应尽量避免使用for语句。虽然理论可行,但是电路模块是不能循环的,每一次循环都需要额外的电路开销。
  2. 译码器实际相当于一个最小项输出器,可实现任何组合逻辑函数;输出可以是单变量或多变量;设计方案不唯一;
  3. 当输出为低电平有效时,将表达式转化为与非形式更方便。

数码管
最常用的是七段显示数码管,可以显示十进制数,分为共阳与共阴两种类型。
数码管
注:

  • 由于二极管的导通性,要使数码管发光,共阳型另一端需接低电平;共阴型另一端需要接高电平
  • 译码器与共阴数码管连接时需要连接上拉电阻来保护器件。

verilog实现(共阴数码管):

// seg module
module seg7 (bcd, leds);
  input [3:0] bcd;
  output [1:7] leds;
  reg [1:7] leds;
   always @(bcd)
     case (bcd)   //abcdefg
       0: leds = 7’b1111110;
       1: leds = 7’b0110000;
       2: leds = 7’b1101101;
       3: leds = 7’b1111001;
       4: leds = 7’b0110011;
       5: leds = 7’b1011011;
       6: leds = 7’b1011111;
       7: leds = 7’b1110000;
       8: leds = 7’b1111111;
       9: leds = 7’b1111011;
       default: leds = 7’bx;
     endcase
endmudule

  1. 组合逻辑电路定义 ↩︎

  • 3
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值