第三章 组合逻辑电路 第一节 组合电路的分析和设计 第二节 组合逻辑电路中的竞争与冒险 第三节 超高速集成电路硬件描述语言VHDL 第四节 组合逻辑电路模块及其应用 小结
第三章 组合逻辑电路 相关知识回顾: 本章任务: 非门 与门 或门 与非门 或非门 异或门 同或门 与 或 非 异或 同或 逻辑运算 逻辑门 1.组合逻辑电路的分析与设计 2.常用组合逻辑模块的使用 由逻辑 门组成
本章基本内容 本章重点 (1)掌握分析和设计组合电路的基本方法 加法器 比较器 译码器 编码器 (2) 学习常用中规模集成模块 加法器 比较器 译码器 编码器 选择器 分配器 (2) 学习常用中规模集成模块 (3) 了解电路中的竞争和冒险现象 本章重点 (1)电路分析与设计经典的方法 (2)常用组合逻辑模块的灵活应用
第一节 组合电路的分析和设计 组合电路 组合电路的分析 组合电路的设计
特点: 一、组合电路 … 组合网络 … 输入: X1、X2、…、Xn 输出: F1、F2、…、Fm 组合电路方框图 F1 F2 Fm … 输入: X1、X2、…、Xn 输出: F1、F2、…、Fm 逻辑关系:Fi = fi (X1、X2、…、Xn) i = (1、2、…、m) 特点: 电路由逻辑门构成; 不含记忆元件; 输出无反馈到输入的回路; 输出与电路原来状态无关。
二、组合电路的分析 分析已知逻辑电路功能 步骤: 真值表 输出函数 表达式 描述电路 功能 简化函数 已知组合电路
多数输入变量为1,输出F为1; 多数输入变量为0,输出 F为0。 例1:试分析右图所示逻辑电路的功能。 & A B C F 解:(1)由电路图得逻辑表达式 A B C F 0 0 0 0 0 0 1 0 0 1 0 0 0 1 1 1 1 0 0 0 1 0 1 1 1 1 0 1 1 1 1 1 真值表 (2)由逻辑表达式得真值表 (3)功能分析: 多数输入变量为1,输出F为1; 多数输入变量为0,输出 F为0。 因此该电路为少数服从多数电路, 称表决电路。
例2:试分析下图所示逻辑电路的功能。 =1 G2 B2 G1 B1 G0 B0 G3 B3 解:(1)由电路图得 表达式 (2)列出 真值表
自然二进制码 格雷码 B3B2B1B0 G3 G2 G1 G0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 1 0 0 0 1 1 0 0 1 1 0 0 1 0 0 1 0 0 0 1 1 0 0 1 0 1 0 1 1 1 0 1 1 0 0 1 0 1 0 1 1 1 0 1 0 0 1 0 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 1 0 1 1 1 1 1 0 1 1 1 1 1 0 1 1 0 0 1 0 1 0 1 1 0 1 1 0 1 1 1 1 1 0 1 0 0 1 1 1 1 1 1 0 0 0 (1)由电路图得表达式 (2)列出 真值表 (3) 分析功能 本电路是自然二进制码至格雷码的转换电路。
推广到一般,将n位自然二进制码转换成n位格雷码: Gi = Bi⊕Bi+1 (i = 0、1、2、…、 n-1) 自然二进制码至格雷码的转换 推广到一般,将n位自然二进制码转换成n位格雷码: Gi = Bi⊕Bi+1 (i = 0、1、2、…、 n-1) 注意:利用此式时对码位序号大于(n-1)的位应按0处理,如本例码位的最大序号i = 3,故B4应为0,才能得到正确的结果。
三、组合电路的设计 根据要求设计出实际逻辑电路 步骤: 确定输入、输出、列出真值表 写出表达式并简化 画逻辑电路图 分析题意,将设计 选择所需 门电路 确定输入、输出、列出真值表 写出表达式并简化 画逻辑电路图 根据设 计要求 分析题意,将设计 要求转化为逻辑关 系,这一步为设计 组合逻辑电路的关键 形式变换 根据设计所用 芯片要求
由表达式知,若无特别要求,用一个异或门和一个与门即可实现半加器电路。电路图为: 分析:半加器是将两个一位二进 制数相加求和及向高位 进位的电路。因此,有两 个输入(加数与被加数) 及两个输出(和与进位)。 由表达式知,若无特别要求,用一个异或门和一个与门即可实现半加器电路。电路图为: & A B C =1 S 例3:半加器的设计 (1)半加器真值表 (2)输出函数 设被加数和加数分别为A和B,和与进位分别为S、C,真值表为: (3)逻辑图 (4)逻辑符号 ∑ CO S C A B 输入 输出 被加数A 加数B 和S 进位C 0 0 0 0 0 1 1 0 1 0 1 0 1 1 0 1 半加器逻 辑符号
将用“异或”门实现的半加器改为用“与非”门实现 函数表达式变换形式: & A B C S 用“与非”门实现半加器逻辑图如图所示:
例4:全加器的设计。 一位二进制数 和 全加器是实现 一位二进制数 相加 高位进位 低位来的进位 全加器真值表 全加器逻辑符号 ∑ 输入 输出 Ai Bi Ci Si Ci+1 0 0 0 0 0 0 0 1 1 0 0 1 0 1 0 0 1 1 0 1 1 0 0 1 0 1 0 1 0 1 1 1 0 0 1 1 1 1 1 1 全加器逻辑符号 ∑ CO Si Ci+1 Ci Bi CI Ai 学生自己完成逻辑电路
例5:试将8421BCD码转换成余三BCD码。 (1)真值表 (2)卡诺图 8421码 余三码 8421码 余三码 B3 B2 B1 B0 E3 E2 E1 E0 0 0 0 0 0 0 0 1 1 1 0 0 0 1 0 1 0 0 2 0 0 1 0 0 1 0 1 3 0 0 1 1 0 1 1 0 4 0 1 0 0 0 1 1 1 5 0 1 0 1 1 0 0 0 6 0 1 1 0 1 0 0 1 7 0 1 1 1 1 0 1 0 8 1 0 0 0 1 0 1 1 9 1 0 0 1 1 1 0 0 10 1 0 1 0 ☓ ☓ ☓ ☓ 11 1 0 1 1 ☓ ☓ ☓ ☓ 12 1 1 0 0 ☓ ☓ ☓ ☓ 13 1 1 0 1 ☓ ☓ ☓ ☓ 14 1 1 1 0 ☓ ☓ ☓ ☓ 15 1 1 1 1 ☓ ☓ ☓ ☓ (2)卡诺图 B3 B2 B1 B0 00 01 11 10 1 ☓ E3 E0 E1 E2
(2)卡诺图 B3 B2 B1 B0 00 01 11 10 1 ☓ E3 E0 E1 E2 (3)表达式
(3)表达式 余3码 (4)电路图 8421BCD码 8421BCD码转换成余3BCD码的逻辑电路 & 1 E1 E0 E2 E3 B3B2B1B0 8421BCD码转换成余3BCD码的逻辑电路
第二节 组合电路中的竞争与冒险 一、冒险与竞争 在组合电路中,信号经由不同的途径达到某一会合点的时间有先有后。 竞争: 由于竞争而引起电路输出发生瞬间错误现象。表现为输出端出现了原设计中没有的窄脉冲,常称其为毛刺。 冒险: ≥1 A F f1 f2 & B C (a)逻辑图 (b)波形图 t tpg tpd
二、竞争与冒险的判断 或的形式时,A变量的变化可能引起险象。 代数法: 如函数卡诺图上为简化作的圈相切,且相切处又无其他圈包含,则可能有险象。 卡诺图法: 如图所示电路的卡诺图两圈相切,故有险象。 A B C 00 01 11 10 1 两圈相切有险象 ≥1 A F f1 f2 & B C
三、冒险现象的消除 1.增加冗余项 如图所示卡诺图,只要在两圈相切处增加一个圈(冗余),就能消除冒险。 增加冗余项可以解决每次只有单个 输入信号发生变化时电路的冒险问题, 却不能解决多个输入信号同时发生变化 时的冒险现象,适用范围有限。 三、冒险现象的消除 1.增加冗余项 如图所示卡诺图,只要在两圈相切处增加一个圈(冗余),就能消除冒险。 A B C 00 01 11 10 1 两圈相切有险象 A B C 00 01 11 10 1 增加冗余圈克服险象
三、冒险现象的消除 1.增加冗余项 2. 增加选通信号 增加选通信号的方法比较简单,一 般无需增加电路元件,但选通信号必须 与输入信号维持严格的时间关系,因此 选通信号的产生并不容易。 在可能产生冒险的门电路的输入端增加一个选通脉冲。当输入信号变换完成,进入稳态后,才启动选通脉冲,将门打开。这样,输出就不会出现冒险脉冲。
三、冒险现象的消除 1.增加冗余项 2.增加选通信号 3.输出接滤波电容 输出端接滤波电容方便易行, 但会使输出电压波形变坏,仅适 合对信号波形要求不高的场合。 由于竞争冒险产生的干扰脉冲的宽度一般都很窄,在可能产生冒险的门电路输出端并接一个滤波电容(一般为4~20pF),使输出波形上升沿和下降沿都变得比较缓慢,从而起到消除冒险现象的作用。
第三节 超高速集成电路硬件描述语言VHDL 概述 VHDL语言的基本组成 VHDL数据类型和属性 VHDL的行为描述 VHDL的结构描述
VHDL概述 存在的问题: ★ 设计方法 ◆ 传统的电路系统设计方法:纯硬件逻辑设计(试凑法) ★ 设计方法 ◆ 传统的电路系统设计方法:纯硬件逻辑设计(试凑法) 存在的问题: 当系统规模增大,设计工作量大,设计周期长; 设计电路的体积大、功耗大、可靠性较低; 交流性较差。 ◆ 现代电路的设计方法:硬件设计+ 软件设计 从上至下的设计方法 出现Hardware Description Language,HDL
VHDL概述 ★ 硬件描述语言 ◆ ABEL ◆ AHDL ◆ Verilog HDL ◆ VHDL ★ 硬件描述语言 ◆ ABEL ◆ AHDL ◆ Verilog HDL ◆ VHDL 美国国防部在80年代初提出了VHSIC(Very High Speed Integrated Circuit)计划,其目标之一是为下一代集成电路的生产,实现阶段性的工艺极限以及完成10万门级以上的设计,建立一项新的描述方法。1981年提出了一种新的HDL,称之为VHSIC Hardware Description Language,简称为VHDL。 IEEE标准
VHDL概述 ★ VHDL语言的主要优点 ◆ 是一种多层次的硬件描述语言,覆盖面广,描述能力强。即设计的原始描述可以是非常简练的描述,经过层层细化求精,最终成为可直接付诸生产的电路级或版图参数描述,整个过程都可以在VHDL的环境下进行。 ◆ VHDL 有良好的可读性,即可以被计算机接受,也容易被理解用VHDL 书写的原文件,即是程序,又是文档,即是技术人员之间交换信息的文件,又可作为合同签约者之间的文件。
VHDL概述 ★ VHDL语言的主要优点 ◆ VHDL本身的生命期长。因为VHDL的硬件描述与工艺技术无关,不会因工艺变化而使描述过时。与工艺技术有关的参数可通过VHDL提供的属性加以描述,工艺改变时,只需修改相应程序中的属性参数即可。 ◆ 支持大规模设计的分解和已有设计的再利用。一个大规模设计不可能一个人独立完成,它将由多人、多项目组来共同完成。VHDL为设计的分解和设计的再利用提供了有力的支持。 ◆ VHDL已成为IEEE承认的一个工业标准,事实上已成为通用硬件描述语言。
一、VHDL的基本组成 参数部分——程序包 VHDL 语言 接口部分—设计实体 描述部分—结构体
调用数据类型标准程序包的VHDL语言描述 设计中的子程序和公用数据类型的集合。 (一)参数部分——程序包 调用程序包 语句 标 准 程 序 包 定 义 IEEE标准的标准程序包 程序包 设计者自身设计的程序包 调用数据类型标准程序包的VHDL语言描述 LIBRARY ieee; USE ieee.std_logic_1164.all; 放在VHDL程序的最前面,表示以后在实体或结构体中要用到数据类型包中的数据类型。
提供设计模块的公共信息,是VHDL设计电路的最基本部分。 设计实体 (二)接口部分—设计实体 一个模块中仅有一个设计实体。 提供设计模块的公共信息,是VHDL设计电路的最基本部分。 设计实体 调用程序包 语句 标 准 程 序 包 定 义 VHDL实体的描述方法: kxor a1 b1 c1 ENTITY kxor IS PORT(a1,b1:IN std_logic; 实体 及实体声明语句 c1:OUT std_logic); END kxor;
PORT(a1,b1:IN std_logic; (二)接口部分—设计实体 ENTITY kxor IS PORT(a1,b1:IN std_logic; END kxor; c1:OUT std_logic); ENTITY、IS、PORT、IN、OUT和END为关键字; ENTITY...END之间表示实体内容; kxor表示实体的名称,即电路的符号名; PORT——端口(引脚)信息关键字,描述了信号的流向; IN——输入模式; OUT——输出模式; std_logic表示信号取值的类型为标准逻辑。
sel out1 s ENTITY sel IS PORT(d0,d1,d2,d3:IN BIT; (二)接口部分—设计实体 再例: d0 d1 d2 d3 s out1 sel ENTITY sel IS PORT(d0,d1,d2,d3:IN BIT; s :IN INTEGER RANGE 0 TO 3; out1 :OUT BIT); END sel;
描述实体硬件的互连关系、数据的传输和变换以及动态行为。 结构体 (三)描述部分—结构体 调用程序包 语句 标 准 程 序 包 定 义 实体 及实体声明语句 描述实体硬件的互连关系、数据的传输和变换以及动态行为。 结构体 一个实体可以对应多个结构体,每个结构体可以代表该硬件的某一方面特性,例如行为特性、结构特性。 ARCHITECTURE kxor_arc OF kxor IS 结构体1 结构体2 结构体n BEGIN c1 <= (NOT a1 AND b1) OR (a1 AND NOT b1); END kxor_arc;
a1 c1 a1 c1 a1 c1 a1 c1 a1 c1 a1 c1 a1 c1 a1 c1 a1 c1 a1 c1 a1 c1 a1 b1 c1 a1 b1 c1 a1 b1 c1 a1 b1 c1 a1 b1 c1 a1 b1 c1 a1 b1 c1 a1 b1 c1 a1 b1 c1 a1 b1 c1 a1 b1 c1 a1 b1 c1 a1 b1 c1 a1 b1 c1 a1 b1 c1 a1 b1 c1 a1 b1 c1 a1 b1 c1 a1 b1 c1 a1 b1 c1 kxor a1 b1 c1 kxor a1 b1 c1 a1 b1 c1 a1 b1 c1 a1 b1 c1 a1 b1 c1
二、VHDL数据类型和属性 VHDL硬件描述语言中涉及了许多信号、变量和常量,它们用来保持数据。 在表达式中分配数值给目标时的数据类型不可以被混用。 在VHDL中,保持数据的信号、变量和常量称为目标。 每一个目标都有一个数据类型来确定目标保持的那一类数据。 VHDL是一种非常严格的数据类型化语言,规定每个信号、常量或变量和每个表达式有一个唯一的确定数据类型, 每个目标和表达式的数据类型静态地被确定。
在VHDL中目标有三种:信号、变量和常量。 信号和变量可以赋予一系列的值,而常量一次仅被分配一个值。 信号和变量又有不同,赋予信号的数值要到未来 的某个时刻,信号才接受当前的数值;而赋予变量的 数值,变量立即接收当前的数值。 目标的一般形式如下: < 目标种类> < 目标< , 目标...>> : < 目标类型> :=< 表达式> ;
目标:是一个或多个代表着目标种类的字符串,多个目 标时用“,”号分开。 < 目标种类> < 目标< , 目标...>> : < 目标类型> :=< 表达式> ; 目标种类:信号(SIGNAL)、变量(VARIABLE)和常量 (CONSTANT)。 信号:它表示把元件的端口连接在一起的互连线。 变量:用于对暂时数据的局部存储,变量只在进程和子 程序内部定义。 常量:对某些特定类型数据赋予的一次性数值。 VARIABLE a1:INTEGER:=3; 目标:是一个或多个代表着目标种类的字符串,多个目 标时用“,”号分开。 表达式:表达式是为了规定目标的初始值,这是缺省部分。 目标类型:为了规定目标的特征,VHDL含有很宽范围的数据类型。VHDL除了有基本的数据类型之外,设计者还可以建立自己的数据类型,类型说明部分规定类型名和类型范围,它的一般形式是:
TYPE < 类型名> IS < 类型范围> ; VHDL可用数据类型有五类: 标量类型、复合类型、子类型、文件类型和寻址类型。 标量类型包括所有的简单类型:如整数、实数等; 复合类型包括数组和记录; 寻址类型在一般编辑语言中等价为指针; 文件类型是设计者定义的文件类型为设计者提供说明的文件对象; 子类型主要是对现有类型加以限制。
1.标量数据类型 标量数据类型是基本的数据类型,它包括整数类型、 实数类型、物理类型和枚举类型。 物理类型要提供一个基本单位,然后在这个基本单位 上定义多个或零个次级单位,每个次级单位都是基本单位 的整数倍。 一个目标的数值有可能经常更换或者说是包含多个值,但一个目标一次只能被一种类型说明。 枚举类型在形式上是定义括弧括起来的字符串文字表,一个字符串文字在枚举类型定义中只能出现一次,但允许同样一个字符串文字出现在不同的枚举类型的字符串文字表中,枚举类型的字符串文字表中的文字是由设计者定义的,这些字母可以是单个字母,也可以是一个字符串,例如BREAKFAST, Lunch, a等。 下面举一个VHDL程序加深理解枚举类型的使用。
meals next previous 例1: 枚举型数据 PACKAGE meals_pkg IS TYPE meal IS(breakfast,lunch,dinner); END meals_pkg; 自定义程序包的名字 meals next previous USE work . meals_pkg . all; ENTITY meals IS PORT(previous_meal:IN meal; next_meal:OUT meal); END meals; 枚举数据类型的名字 三个枚举数据 ARCHITECTURE meals_arc OF meals IS BEGIN WITH previous_meal SELECT next_meal <= breakfast WHEN dinner, lunch WHEN breakfast, dinner WHEN lunch; END meals_arc; 调用自定义程序包
2.复合数据类型 Word(15)…word(0)共16个同数据类型的元素 复合类型是由数组类型和记录类型组成,它们的元素是标量类型的元素。数组类型是由相同的标量元素组成,即同构复合类型,数组可以是一维、二维或多维。例如: TYPE word IS ARRAY(15 DOWNTO 0) OF BIT; TYPE column IS RANGE 1 TO 40; TYPE row IS RANGE 1 TO 10; CONSTANT ROM : BIT_VECTOR(0 TO 15); TYPE matrix IS ARRAY(row,column) OF std_logic; TYPE r_ma IS ARRAY( 1 TO 10, 1 TO 40) OF std_logic;
VHDL的属性 VHDL中的属性使得VHDL程序更加简明扼要, 更加容易理解,VHDL的属性在时序程序中几乎处处 可见,如值类属性的左边界、右边界、上下边界以及 值类属性的长度,还可以检测信号上升沿和下降沿以 及前一次发生的事件等等。
值类属性:值类属性用于返回数组的边界或长度,首先举一例 数组边界的例子说明值类属性。 例2: TYPE bit1 IS ARRAY(63 DOWNTO 32) OF BIT; VARIABLE left_range,right_range,uprange,lowrange:INTEGER; BEGIN left_range:= bit1’LEFT; --returns 63 right_range:= bit1’RIGHT; --returns 32 uprange:= bit1’HIGH; --returns 63 lowrange:= bit1’LOW; --returns 32
下面再举一个值类数组属性的例子,让其返回数组范围的总长度。 例: TYPE bit1 IS ARRAY(0 TO 7) OF BIT; TYPE bit2 IS ARRAY(8 TO 31) OF BIT; VARIABLE len1,len2:INTEGER; BEGIN len1:=bit1’LENGTH; --return 8 len2:=bit2’LENGTH; --return 24
它可用来检查一个信号的变化,并且变化刚刚发生,即推断出在信号上发生了一个跳变。 函数信号属性:函数信号属性用来返回有关信 号行为功能的信息,它反映一个信号是否正好有值 的变化或事件的发生,如clk’EVENT,这个属性为 “EVENT”,对检查时钟边沿触发是很有效的。 它可用来检查一个信号的变化,并且变化刚刚发生,即推断出在信号上发生了一个跳变。 下面举一个例子,说明函数信号属性的用法。 IF clk= ‘1’ AND clk’EVENT THEN q <= d; END IF; 上述语句中用到了函数信号属性clk’EVENT,说明如果时钟信号clk为高电平,并且事件刚刚发生,也就是说是时钟上升沿有效,此时q得到d的信号。
(三)VHDL的行为描述 在VHDL硬件描述语言中,描述电路逻辑的程 序称为行为描述,行为描述有并行描述、进程描述 和顺序描述。 三个行为既可以是相互独立,成为单一的行为 描述体,又可以相互联系,成为混合描述体,如进 程行为描述行为之间是并行行为,进程行为体的内 部是顺序行为。
1.VHDL的并行行为 在典型的编程语言如C或Pascal中,每个赋值语句按规定的次序,一个接在另一个之后顺序执行,执行的次序由源文件决定。 结构体中并行赋值语句的一般格式如下: < 对象> <= < 表达式>; 读作对象得到表达式的值,作用是将表达式的信号值分配给对象,即每当表达式的信号值变化时执行该语句。 每个表达式都至少有一个敏感信号,每当敏感信号改变其 值时,就执行这个信号赋值语句。
在所有的并行语句中,两个以上的并行赋值语句在字面上的顺序并不表明它们的执行顺序。 例如下面的两个结构体在功能上是等价的。 ENTITY exe IS PORT(a1,a2:IN BIT; b1,b2:OUT BIT); END exe; ARCHITECTURE exe_arc1 OF exe IS BEGIN b1 <= a1 AND b2; b2 <= NOT a1 OR a2; END exe_arc1; ARCHITECTURE exe_arc2 OF exe IS BEGIN b2 <= NOT a1 OR a2; b1 <= a1 AND b2; END exe_arc2;
另一种并行信号赋值语句是选择信号赋值语句,它们的每一个赋值语句都需要给出一个表达式,同时给出与该表达式的每个可能值相关联的信号。 选择信号赋值语句的一般形式如下: WITH < 表达式> SELECT < 对象> <= < 信号1> WHEN < 分支1> , < 信号2> WHEN < 分支2> , < 信号n> WHEN < 分支n> ;
一个典型的四路数据选择器VHDL程序说明WITH一般 形式的用法。 ENTITY sels IS PORT(d0,d1,d2,d3:IN BIT; s :IN INTEGER RANGE 0 TO 3; out1 :OUT BIT); END sels; ARCHITECTURE sels_arc OF sels IS BEGIN WITH s SELECT out1 <= d0 WHEN 0, d1 WHEN 1, d2 WHEN 2, d3 WHEN 3; END sels_arc; d0 d1 d2 d3 s out1 sels
仍以四路数据选择器为例,讨论另一个较为复杂的并行信号赋值语句的例子,以便更详细地说明并行概念,下面是四输入数据选择器的第二个VHDL程序。 例: LIBRARY ieee; USE ieee.std_logic_1164.all; ENTITY mux4 IS PORT(I0,I1,I2,I3,A,B:IN std_logic; Q :OUT std_logic); END mux4; ARCHITECTURE mux4_arc OF mux4 IS SIGNAL sel :INTEGER ; BEGIN Q <= I0 AFTER 10 ns WHEN sel= 0 ELSE I1 AFTER 10 ns WHEN sel= 1 ELSE I2 AFTER 10 ns WHEN sel= 2 ELSE I3 AFTER 10 ns ; sel <= 0 WHEN A= ‘0’ AND B= ‘0’ ELSE 1 WHEN A= ‘1’ AND B= ‘0’ ELSE 2 WHEN A= ‘0’ AND B= ‘1’ ELSE 3 ; END mux4_arc;
2.VHDL的进程行为 VHDL除了并行行为之外,还有顺序行为。顺序行为执行 的顺序是一个接在另一个之后严格执行。 顺序行为的语句存在于VHDL程序中的进程行为之中。 而进程行为之间是并行行为语句。 进程行为语句的一般形式如下: < 进程标号> :PROCESS < 敏感信号表> < 进程说明区> BEGIN < 语句部分> WAIT ON < 敏感信号表> ; WAIT UNTIL < 条件表达式> ; WAIT FOR < 时间表达式> ; END PROCESS;
整个实体模块中的每个进程行为语句,可以在任何时候被 激活,所有被激活的进程是并行执行的。 下面举一个3线-8线通用译码器程序的例子,说明进程语句如何工作。 LIBRARY ieee; USE ieee.std_logic_1164.all; USE ieee.std_logic_arith.all; ENTITY decoder IS PORT(sel : IN UNSIGNED(2 DOWNTO 0); dout : OUT UNSIGNED(7 DOWNTO 0)); END decoder; ARCHITECTURE decoder_arc OF decoder IS SIGNAL sel1 :INTEGER; BEGIN PROCESS(sel) BEGIN sel1 <= CONV_INTEGER(sel); CASE sel1 IS WHEN 0 => dout <= (‘0’,’0’,’0’,’0’,’0’,’0’,’0’,’1’) AFTER 5 ns;
PROCESS(sel) 此例只要sel的值一发生改变就激活进程,从第一句执行 直到满足条件后再被挂起。 WHEN 1 => dout <= (‘0’,’0’,’0’,’0’,’0’,’0’,’1’,’0’) AFTER 5 ns; WHEN 2 => dout <= (‘0’,’0’,’0’,’0’,’0’,’1’,’0’,’0’) AFTER 5 ns; WHEN 3 => dout <= (‘0’,’0’,’0’,’0’,’1’,’0’,’0’,’0’) AFTER 5 ns; WHEN 4 => dout <= (‘0’,’0’,’0’,’1’,’0’,’0’,’0’,’0’) AFTER 5 ns; WHEN 5 => dout <= (‘0’,’0’,’1’,’0’,’0’,’0’,’0’,’0’) AFTER 5 ns; WHEN 6 => dout <= (‘0’,’1’,’0’,’0’,’0’,’0’,’0’,’0’) AFTER 5 ns; WHEN OTHERS => dout <= (‘1’,’0’,’0’,’0’,’0’,’0’,’0’,’0’) AFTER 5 ns; END CASE; END PROCESS; END decoder_arc; 此例只要sel的值一发生改变就激活进程,从第一句执行 直到满足条件后再被挂起。 PROCESS(sel)
下例是另一种激活进程的方式: ENTITY reg IS PORT(d,clk:IN BIT; q1,q2:OUT BIT); END reg; ARCHITECTURE reg_arc OF reg IS BEGIN VHDL的每个结构体中可以有多个进程行为语句。 PROCESS BEGIN WAIT UNTIL clk= ‘1’; q1 <= d; END PROCESS; 它的关键之处是: PROCESS BEGIN WAIT UNTIL clk= ‘0’; q2 <= d; END PROCESS; END reg_arc; 进程行为语句之间是并行关系,进程行为语句内部是顺序关系。
3.VHDL的顺序行为 顺序行为语句可分为两大类:条件控制类,循环控制类。 在这两类中选出六种 IF、CASE、FOR、WHILE..LOOP、 EXIT和ASSERT进行讨论 (1) IF语句 IF语句的一般形式为: IF < 条件> THEN < 语句> ; ELSIF < 条件> THEN ELSE END IF;
ARCHITECTURE alarm_arc OF alarm IS BEGIN 下面举例说明IF条件语句的用法。 例: 用VHDL设计一家用报警系统的控制逻辑,它有来自传感 器的三个输入信号smoke、door、water和准备传输到告警设备 的三个输出触发信号fire_alarm、burg_alarm、water_alarm以 及使能信号en和alarm_en。 VHDL程序描述如下: LIBRARY ieee; USE ieee.std_logic_1164.all; ENTITY alarm IS PORT(smoke,door,water:IN std_logic; en,alarm_en :IN std_logic; fire_alarm,burg_alarm,water_alarm:OUT std_logic); END alarm; ARCHITECTURE alarm_arc OF alarm IS BEGIN
IF ((water= ‘1’) AND (en= ‘0’)) THEN water_alarm <= ‘1’; PROCESS(smoke,door,water,en,alarm_en) BEGIN IF ((smoke= ‘1’) AND (en= ‘0’)) THEN fire_alarm <= ‘1’; ELSE fire_alarm <= ‘0’; END IF; IF ((door= ‘1’) AND ((en= ‘0’) AND (alarm_en= ‘0’))) THEN burg_alarm <= ‘1’; ELSE burg_alarm <= ‘0’; END IF; IF ((water= ‘1’) AND (en= ‘0’)) THEN water_alarm <= ‘1’; ELSE water_alarm <= ‘0’; END IF; END PROCESS; END alarm_arc;
(2) CASE 语句 CASE语句的一般形式: CASE < 表达式> IS WHEN < 值> => < 语句> ; WHEN < 值> | < 值> => < 语句> ; WHEN < 离散范围> => < 语句> ; WHEN OTHERS => < 语句> ; END CASE; CASE语句是VHDL提供的另一种形式的控制语句,每当 单个表达式的值在多个起作用的项中选择时,用此语句是较合 适的,它根据所给表达式的值或域,选择“=>”后面的执行语句。
用CASE语句应该注意三个问题: A) 关键字WHEN的数量不作限制,但不容许两个语句用一个值; B)所有WHEN后面的值在CASE语句中合起来的值是值域中的全部; C)WHEN语句的次序可以任意排定。
下面举例说明ASSERT语句的用法。 例:由两个或非门构成的RS触发器。 为真时,执行IF语句。 ENTITY RSFF IS PORT(R,S:IN BIT; Q:OUT BIT); END RSFF; ARCFITECTURE RSFF_ARC OF RSFF IS BEGIN PROCESS(R,S) VARIABLE LAST_STATE:BIT:=‘0’; ASSERT NOT(R=‘1’ AND S=‘1’) REPORT “BOTH R AND S EQUAL TO ‘1’” SEVERITY ERROR; IF R=‘0’ AND S=‘0’ THEN LAST_STATE:=LAST_STATE; ELSIF R=‘1’ AND S=‘0’ THEN
LAST_STATE:=‘0’; ELSE LAST_STATE:=‘1’; END IF; Q<=LAST_STATE; END PROCESS; END RSFF_ARC;
信号可被看作两个元件之间数据传输的通路。 (四)VHDL的结构描述 实体主要描述元件、端口与信号。 元件是硬件的描述,即门、芯片或者电路板。 端口是元件与外界的连接点,数据通过端口进入或流出元件。 而信号则是作为硬件连线的一种抽象描述,它既能保持变化 的数据,又可以连接各个子元件。 信号可被看作两个元件之间数据传输的通路。
结构描述的基本单元则是“调用元件语句”。 对一个硬件的结构进行描述,就是要描述它由哪些 子元件组成,以及各个子元件之间的互连关系。 结构描述比行为描述更加具体化,即结构描述与硬 件之间的关系要比行为描述与硬件之间的关系更明显。 前面讨论, 行为描述的基本单元是进程语句。 结构描述的基本单元则是“调用元件语句”。 下面举例说明“调用元件语句”的用法。
一定记住输入、输出端口的顺序。 例: 用VHDL结构描述设计一全减器,全减器可由两个 半减器和一个或门组成。 ENTITY halfsub IS PORT(A,B:IN BIT; T,C:OUT BIT); END halfsub; ARCHITECTURE halfsub_arc OF halfsub IS BEGIN END halfsub_arc; PROCESS(A,B) BEGIN T<= A XOR B AFTER 10 ns; C <= (NOT A) AND B AFTER 10 ns; END PROCESS;
ARCHITECTURE orgate_arc OF orgate IS BEGIN O1<= A1 OR B1; 下面再将或门的VHDL程序描述如下: 一定记住输入、输出端口的顺序。 ENTITY orgate IS PORT(A1,B1:IN BIT; O1:OUT BIT); END orgate; ARCHITECTURE orgate_arc OF orgate IS BEGIN O1<= A1 OR B1; END orgate_arc; 下面将两个半减器,一个或门的端口,通过定义一 些中间信号将其连接起来形成VHDL的结构描述。
在说明区说明调用的半加器。一定记住顺序。 三个输入,两个输出。 在下面举的全减器例子里可以看到定义了中间信号 temp_T,temp_c1和temp_c2 在说明区定义中间变量。 ENTITY fullsub IS PORT(I1,I2,C_IN:IN BIT; FT,C_OUT:OUT BIT); END fullsub; ARCHITECTURE fullsub_arc OF fullsub IS SIGNAL temp_T,temp_c1,temp_c2:BIT; COMPONENT halfsub PORT(A,B:IN BIT; T,C:OUT BIT); END COMPONENT; 在说明区说明调用的半加器。一定记住顺序。 COMPONENT orgate PORT(A1,B1:IN BIT; O1:OUT BIT); END COMPONENT;
fullsub 减数、被减数。 低位借位与和位。 图中虚线框各元件之间 的连线命名。temp_T将第一 个半减器的差位输出连到第 BEGIN U0:halfsub PORT MAP(I1,I2,temp_T,temp_c1); U1:halfsub PORT MAP(temp_T,C_IN,FT,temp_c2); U2:orgate PORT MAP(temp_c1,temp_c2,C_OUT); END fullsub_arc; fullsub U0 halfsub I1 I2 temp_T temp_c1 U1 halfsub C_IN FT temp_c2 图中虚线框各元件之间 的连线命名。temp_T将第一 个半减器的差位输出连到第 二个半减器的输入端。信号 temp_c1将第一个半减器的借 位输出连至“或”门的一个输入 端,信号temp_c2将第二个半 减器的借位输出连至“或”门的 另一个输入端。 用三个元件调用语句定义这三个连接关系。 U2 C_OUT
第四节 组合逻辑电路模块及其应用 编码器 译码器 数据选择器 数值比较器 加法器
逻辑功能:任何一个输入端接低电平时,三个输出端有一组对应的二进制代码输出。 一、编码器 功能:输入m位代码; 输出n位二进制代码(m≤2n)。 (一)二进制编码器 将输入信号编成二进制代码的电路 逻辑功能:任何一个输入端接低电平时,三个输出端有一组对应的二进制代码输出。 任何时刻只允许一个输入端有信号输入。 优先编码 优先编码器允许几个输入端同时加上信号,电路只对其中优先级别最高的信号进行编码。
8线—3线优先编码器74148 编码输出 Y0 Y1 Y2 扩展输出 YEX 使能输出 YS 使能输入 S 编码输入 I0 I1 I2 I3
管脚定义: ~ :输入,低电平有效,优先级别依次为 ~ 。 ~ :编码输出端。 :使能输入端; =0时,编码, =1时,禁止编码。 :使能输出端,编码状态下( =0),若无输入信号, =0。 :扩展输出端,编码状态下( =0),若有输入信号, =0。
编码输出 Y0 Y1 Y2 Y3 二—十进制编码器 编码输入 I1 I2 I3 I4 I5 I6 I7 I8 I9
IF (input(7)='0') THEN y<= ''000''; 优先编码器的VHDL描述 LIBRARY IEEE; USE IEEE.std_logic_1164.all; ENTITY priorityencoder IS PORT (input:IN STD_LOGIC_VECTURE(7 DOWNTO 0); y:OUT STD_LOGIC_VECTURE (2 DOWNTO 0); END priorityencoder; ARCHITECTURE rtl OF priorityencoder IS BEGIN 首先判断input(7)是否为低,若 为低,执行接下来的语句,将结果送到 输出,然后退出进程。否则继续判别IF 语句,执行程序。 PROCESS(input) END PROCESS; END rtl; IF (input(7)='0') THEN y<= ''000''; ELSIF (input(6)='0' ) THEN y<= ''001''; …… ELSIF (input(1)='0' ) THEN y<= ''110''; ELSE y<= ''111''; END IF;
例:用8-3线优先编码器74148扩展成16线-4线编码器。 (2)实现优先编码:高位选通输出与低位控制端连接。 (二)编码器的应用 例:用8-3线优先编码器74148扩展成16线-4线编码器。 解:(1)编码器输入16线,用两片8-3线编码器,高位为第 一片,低位为第二片。 (2)实现优先编码:高位选通输出与低位控制端连接。 (3)第一片工作时,编码器输出:0000-0111 第二片工作时,编码器输出: 1000-1111 Z1 Z0 Z2 Z3 低位 高位 A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 A10 A11 A12 A13 A14 A15
二、译码器 译码输入 译码输出 a1 a0 y0 y1 y2 y3 0 0 1 0 0 0 0 1 0 1 0 0 1 0 0 0 1 0 1 1 0 0 0 1 2位二进制译码器 (一) 变量译码器 译码输入:n位二进制代码 译码输出m位: 一位为1,其余为0 或一位为0,其余为1 二进制译码器输入输出满足:m=2n 译码输入 译码输出 a1 a0 y0 y1 y2 y3 0 0 0 1 1 1 0 1 1 0 1 1 1 0 1 1 0 1 1 1 1 1 1 0 2位二进制译码器 如:2线-4线译码器 集成译码器74138 8421BCD译码器
2线—4线译码器 1 & Y3 Y2 Y1 Y0 S B A
3线-8线译码器(74LS138) A0 ~A2 译码输入,二进制编码0~7依次对应8个输出。 S1、 使能输入, 与逻辑。 EN = 1( 1 2 3 4 5 6 7 BIN/OCT G & EN A0 ~A2 Y0 Y1 Y2 Y3 Y4 Y5 Y6 Y7 A0 A1 A2 译码输入,二进制编码0~7依次对应8个输出。 S3 S2 S1 S1、 使能输入, 与逻辑。 EN = 1( EN=0 ,禁止译码,输出均为1。 ) ,译码。 ~ 八个输出端,低电平有效。 译码状态下,相应输出端为0; 禁止译码状态下,输出均为1。
3—8译码器的VHDL描述 CASE indata IS WHEN ''000'' =>y<=''11111110'', WHEN others=>y<=''11111111''; END case; ELSE y<=''11111111''; END IF; END PROCESS; END rtl; LIBRARY IEEE; USE IEEE.std_logic_1164.all; ENTITY decoder_3_to_8 IS PORT (a,b,c,g1,g2a,g2b:IN STD_LOGIC; y:OUT STD_LOGIC_VECTOR(2 DOWNTO 0); END decoder_3_to_8; ARCHITECTURE rtl OF decoder_3_to_8 IS SIGNAL indata: STD_LOGIC_VECTOR (2 DOWNTO 0); BEGIN indata<=c&b&a; PROCESS(indata,g1,g2a,g2b) IF (g1='1' AND g2a='0' AND g2b='0') THEN 选通输入端g1=1,g2a=0, g2b=0时,3-8译码器才进行正 常译码。 否则y0 ∼y7输出均为高电平
EN端正电平的撤除在A0∼A2再次改变之前。 使能端的两个作用: (1)消除译码器输出尖峰干扰 EN端正电平的出现在A0∼A2稳定之后; EN端正电平的撤除在A0∼A2再次改变之前。 (2)逻辑功能扩展 避免A0∼A2在变化过程中引起输出端产生瞬时负脉冲。 例:用3线-8译码器构成4线-16译码器。
例:用3线-8线译码 器构成4线-16线译 码器。 X0∼X3:译码输入 E:译码控制 E=0,译码 E=1,禁止译码 X3∼X0:0000∼0111, 000∼111 译码输入 1 第一片工作 X3∼X0:1000∼1111 000∼111 译码输入 1 第二片工作
(三)译码器的应用 例:试用 74138和与非门构成一位全加器。 解:全加器的最小项表达式应为 Si = Ci+1 =
& Si & Ci+1 BIN/OCT G & EN 1 1 2 3 4 5 6 7 Y0 Y1 Y2 Y3 Y4 Y5 Y6 Y7 A0 1 2 3 4 5 6 7 BIN/OCT G & EN Y0 Y1 Y2 Y3 Y4 Y5 Y6 Y7 A0 A1 A2 Ci Bi Ai & Si & Ci+1 S3 S2 S1 1
8421BCD译码器 输入端 输入端 BIN/DEC G & EN 1 2 3 4 5 6 7 8 9 S3 S2 S1 Y0 Y1 Y2 1 2 3 4 5 6 7 8 9 BIN/DEC G & EN S3 S2 S1 Y0 Y1 Y2 Y3 Y4 Y5 Y6 Y7 Y8 Y9 A0 A1 A2 A3
例: 用译码器和门电路实现逻辑函数 利用译码器实现组合逻辑电路 = & F BIN/OCT G & EN Y0 Y1 Y2 Y3 Y4 Y5 A0 A1 A2 S3 S2 S1 1 2 3 4 5 6 7 BIN/OCT G & EN C B A F &
用译码器构成数据分配器 多路数据 输出 地址 选择码 输入数据 BIN/OCT G & EN D D0 D1 D2 D3 D4 D5 D6 A0 A1 A2 S3 S2 S1 1 2 3 4 5 6 7 BIN/OCT G & EN D 输入数据
(二)数字显示译码器 1.七段数码管 每一段由一个发光二极管组成。 共阴极 共阳极 :高电平亮 :低电平亮 2.七段显示译码器 输入:二—十进制代码 输出:译码结果,可驱动相应的七段数码管显示正确的数字。 显示译码器动画
当LT为低电平时, BI/RBI为高电平时, 试灯。 七段译码器7448 译码输出,低电平有效 当LT为高电平, RBI为低电平时, 灭零。 BCD码输入信号 本信号为低电平时, 熄灭。
选择 三、数据选择器 数据选择器 在多个通道中选择其中的某一路,或多个信息中选择其中的某一个信息传送或加以处理。 多输入 一输出 (一)分类:2选1、4选1、8选1、16选1。 双四选一数据选择器74153
(一)分类:二选一、四选一、八选一、十六选一。 三、数据选择器 (一)分类:二选一、四选一、八选一、十六选一。 双四选一数据选择器74153 S1 F1 F2 D10 D11 D12 D13 D20 D21 D22 D23 A0 A1 S2 74153 使能端 公用控 制输入 输出端 数据 输入
例:试用最少数量的8选1选择器扩展成16选1选择器。 将两片的输出原端用或门连载一起,和非端用与门连接在一起。 八选一需3位地址码 8选1数据选择器74LS151 将地址连接在一起 (二)数据选择器的通道扩展 例:试用最少数量的8选1选择器扩展成16选1选择器。 将两片的输出原端用或门连载一起,和非端用与门连接在一起。 八选一需3位地址码 1 A3 F1 D0 D1 D2 D3 D4 D5 D6 D7 A0 A1 A2 74151(1) S F2 D8 D9 D10 D11 D12 D13 D14 D15 A0 A1 A2 D0 D1 D2 D3 D4 D5 D6 D7 74151(2) S S1 (1) F ≥1 & 如果A3=0,则(1)片工作,根据A2~A0,从D7~D0中选择一路输出;如果A3=1,则(2)片工作,根据A2~A0,从D15~D8中选择一路输出。
F式中出现的最小项,对应的数据输入端应接1,F式中没出现的最小项,对应的数据输入端应接0 。 (三)实现组合逻辑函数 例: 试用8选1数据选择器74151实现逻辑函数 输入变量接至数据选择器的地址输入端。 F D0 D1 D2 D3 D4 D5 D6 D7 A0 A1 A2 74151 S E C B A F式中出现的最小项,对应的数据输入端应接1,F式中没出现的最小项,对应的数据输入端应接0 。 1
功能:能对两个相同位数的二进制数进行比较的逻辑电路。 四、数值比较器 (一) 数值比较器的基本概念及工作原理 功能:能对两个相同位数的二进制数进行比较的逻辑电路。 1.1位数值比较器 ≥1 FA<B & 1 A B FA >B FA=B 2. 多位比较器 在比较两个多位数的大小时,自高向低地逐位比较,只能在高位相等时,才需要比较低位。
2. 多位比较器 (二) 集成数值比较器 7485 FA>B FA>B IA>B IA>B IA=B FA=B
(三)数值比较器的位数扩展 1. 串联扩展方式 7485(1) 7485(2) IA<B IA>B FA<B FA=B 1 B0 B1 B2 B3
2. 并联扩展方式 由于串联扩展方式中比较结果是逐级进位的,级联芯片数越多,传递时间越长,工作速度越慢。因此,当扩展位数较多时,常采用并联方式。
(四) 8位无符号数数值比较器的VHDL描述 IF A=B THEN EQ <='1'; END IF; IF A/=B THEN NE <='1'; IF A>B THEN GT <='1'; IF A>=B THEN GE <='1'; IF A<B THEN LT <='1'; IF A<=B THEN LE <='1'; END PROCESS; END vcompare_arch; LIBRARY IEEE; USE IEEE.std_logic_1164.all; ENTITY vcompare IS PORT (A, B: IN STD_LOGIC_VECTOR (7 DOWNTO 0); EQ, NE, GT, GE, LT, LE; OUT STD_LOGIC); END vcompare; ARCHITECTURE vcompare_zrch OF vcompare IS BEGIN PROCESS(A, B) EQ<='0';NE<='0';GT<='0';LT<='0';LE<='0'; EQ 表示“等于”;NE表示“不等于”; GT表示“大于”;GE表示“大于等于”; LT表示“小于”;LE表示“小于等于”。
不考虑来自低位的进位的两个1位二进制数相加称为半加器。 五、加法器 (一)加法器的工作原理 =1 A & B S C C S B A Σ CO 1.半加器 不考虑来自低位的进位的两个1位二进制数相加称为半加器。 2.全加器 Bi Ci+1 Si Ci Ai Σ CO CI 在多位数加法运算时,除最低位外,其他各位都需要考虑低位送来的进位 。
和 进位 注意:CI0=0 低位全加器进位输出 (二)串行进位加法器 高位全加器进位输入 如图:用全加器实现4位二进制数相加。 B3 CO4 S3 A3 Σ CO CI B2 CO3 S2 A2 Σ CO CI B1 CO2 S1 A1 Σ CO CI B0 CO1 S0 CI0 A0 Σ CO CI 进位 四位串行进位加法器 注意:CI0=0
(三)快速进位集成4位加法器74283 进位位直接由加数、被加数和最低位进位位CI0形成。 直接形 成进位
四位加法器的逻辑符号 加数 进位 进位 和 低位进位 (四)集成加法器的应用 进位 被加数 1.加法器级联实现多位二进制数加法运算 CO B0 B1 B2 B3 74283 CO CI A0 A1 A2 A3 S0 S1 S2 S3 C7 S4 S5 S6 S7 A4 A5 A6 A7 B6 B4 B5 B7 (1) (2) 进位 74283 CO CI A0 A1 A2 A3 S0 S1 S2 S3 B0 B1 B2 B3 A0 A1 A2 A3 S0 S1 S2 S3 和 B2 B0 B1 B3 被加数 C3 低位进位 C0 (四)集成加法器的应用 进位 1.加法器级联实现多位二进制数加法运算
2.实现余3码到8421BCD码的转换 转换电路 进位 进位 8421BCD码 3的补码等于减3 8421BCD码 和数 8421BCD码 74283 A0 A1 A2 A3 A0 A1 A2 A3 被加数 进位 CO CI B0 B1 B2 B3 74283 A0 A1 A2 A3 S0 S1 S2 S3 S0 S1 S2 S3 S0 S1 S2 S3 进位 C3 & ≥1 1 B0 B1 B2 B3 C7 S4 S5 S6 S7 个位输出 十位输出 B0 B1 B2 B3 加数 CO CI 8421BCD码 3的补码等于减3 8421BCD码 和数 8421BCD码 余3码 3.构成一位8421BCD码加法器
本 章 小 结 (1)组合电路 任何时刻的输出仅决定于当时的输入,与电路原来的状态无关。它由基本门构成,不含存储电路和记忆元件,且无反馈线。 (2)组合电路的分析 根据已经给定的逻辑电路,描述其逻辑功能。 (3)组合电路的设计 根据设计要求构成功能正确、经济、可靠的电路。 (4)常用的中规模组合逻辑模块 用加法器、比较器、译码器、编码器、数据选择器和 码组检验器等设计特定电路。
作 业 自我检测:3.2,3.3,3.4,3.7,3.8 思考题: 3.3,3.8,3.10,3.11 习题: 3.1,3.3,3.7,3.13,3.18