Download presentation
Presentation is loading. Please wait.
Published by角 邓 Modified 7年之前
1
第二章 计算机的逻辑部件 其中2.1、2.2、2.3 略 2.4 计算机中常用的逻辑部件 2.5 时序电路 2.6 可编程逻辑器件设计基础
2
2.4 计算机中常用的逻辑部件 2.4.1 加法器 2.4.2 算术逻辑单元(简称ALU) 2.4.3 译码器 2.4.4 数据选择器
2.4.5 数据分配器 2.4.6 三态门
3
2.4.1 加法器 不考虑进位输入时,两数码Xn、Yn相加称为半 加器;若考虑低位进位输入Cn-1相加,则称为全加
器。全加和Fn与进位输出Cn的表示式为: Fn=XnYnCn-1+XnYnCn-1+XnYnCn-1+XnYnCn-1 Cn=XnYnCn-1+XnYnCn-1+XnYnCn-1+XnYnCn-1 其推导过程和逻辑电路图详见教材19页图2.6所示。 有关半加器和全加器的功能表及逻辑图如教材中图2.5和图2.6
4
其中Xn 为被加数,Yn为加数, Cn-1为低级进位信号,Fn为和,Cn为本级向上进位信号。
一位全加器真值表如下: 其中Xn 为被加数,Yn为加数, Cn-1为低级进位信号,Fn为和,Cn为本级向上进位信号。 Xn Yn Cn-1 Fn Cn
5
简单串行级联的4位全加器如下图所示: (教材图2-7 四位串行加法器)
简单串行级联的4位全加器如下图所示: (教材图2-7 四位串行加法器)
6
将4个全加器相连可得4位加法器(图2.7),但其加法所需时间较长。这是因为其位间进位是串行传送的。本位全加和Fi必须等低位进位Ci-1来到后才能进行,加法时间与位数有关。只有改变进位逐位传送的路径,才能提高加法器工作速度。解决办法之一是采用“超前进位产生电路”来同时形成各位进位,从而实行快速加法。我们称这种加法器为超前进位加法器。 根据各位进位的形成条件,可分别写出Ci的逻辑表达式: C1=X1Y1+(X1+Y1)C0=G1+P1C 其中: Gi=Xi·Yi 称为进位产生函数(绝对进位) Pi=Xi+Yi 称为进位传递函数(条件进位) Gi的意义是:当 XiYi 均为“1”时定会产生向高位的进位 Pi的意义是:当Xi和Yi中有一个为“1”时,若同时低位有进位输入,则本位也将向高位传送进位。写成通用式为:
7
C2=G2+P2C1= G2+P2(G1+P1C0)= G2+P2G1+P2P1C0(2.23)
C3=G3+P3 G2+ P3 P2G1+ P3 P2P1C (2.24) C4=G4+P4G3+ P4P3G2+ P4P3P2G1+ P4P3P2P1C0 (2.25) 当全加器的输入均取反码时,它的输出也均取反码。 (即应用反演律采用与非、或非、与或非实现连接)将上式 改写成如下: C1=P1+G1C0 C2=P2+G2P1+G2G1C0 C3=P3+G3G2+ G3G2P1+G3G2G1C0 C4=P4+G4P3+G4G3P2+G4G3G2P1+G4G3G2G1C0 根据上式可画得“超前进位产生电路”及四位超前进位加法器的逻辑图如图2.8。
8
图2.8 “超前进位产生电路”及四位超前进位加法器的逻辑图
9
2.4.2 算术逻辑单元(简称ALU) ALU是一种功能较强的组合逻辑电路。它能进行多种算术运算和逻辑运算。ALU的基本逻辑结构是超前进位加法器,它通过改变加法器的进位产生函数G和进位传递函数P来获得多种运算能力。下面通过介绍SN74181型四位ALU中规模集成电路了介绍ALU的原理。 在图2.9中功能表中,“加”表示算术加,“+”表示逻辑加。它能执行16种算术运算和16种逻辑运算,M是状态控制端,M=H,执行逻辑运算;M=L执行算术运算。S0 ~S3是运算选择端,它决定电路执行哪种算术运算或逻辑运算。
11
74L181逻辑电路图演示
12
图2.9 ALU功能表 正 逻 辑 S0 S1 S2 S3 L L L L L L L H L L H L L L H H L H L L
L H L H L H H L L H H H H L L L H L L H H L H L H L H H H H L L H H L H H H H L H H H H A A+B A•B “0” B AB “1” 减1 A加(A•B) (A•B)加(A+B) A减B减1 (A•B)减1 A加B A加A A加(A+B) A减1 A+1 (A+B)加1 A加(A•B)加1 (A•B)加(A+B)加1 A减B A加B加1 (A•B) A加A加1 A加(A+B)加1 正 逻 辑 M=H 逻辑运算 M=L算术运算 Cn= Cn=0 图2.9 ALU功能表
13
用四片74181电路可组成16位ALU。如图2.10片内进位是快速的,但片间进位是逐片传递的,因此总的形成时间还是是比较长的。
图 2.10 如果把16位ALU中的每四位作为一组,用类 似位间快速进位的方法来实现16位ALU(四片ALU组 成),那么就能得到16位快速ALU。推导过程如下:
14
与前面讲过的一位的进位产生函数Gi的定义相似,根 GN的表达式为: GN =G3+P3G2 +P3P2G1 +P3P2P1G0
与前面讲过的一位的进位传递函数Pi的定义相似,根 据四位一组的进位传递函数PN为“1”的条件,可以得到PN 的表达式为: PN =P3P2P1P0 把图2.10各片的进位分别命名为Cn+X 、 Cn+Y 、 Cn+Z (即C3 C7 C11)。根据式2.22~2.25的推导可将式中的G1,G2, G3和P1 P2, P3分别换为 GN0, GN1, GN2和PN0, PN1, PN2,把C0 换以Cn,即可得Cn+X 、 Cn+Y 、 Cn+Z 的表示式如下: Cn+X = GN0 + PN0 Cn= GN0 + PN0Cn= GN0PN0+GN0Cn(2-33)
15
Cn+y=GN1+PN1GN0+PN1PN0Cn =GN1+PN1GN0+PN1PN0Cn
=GN1PN1+ GN1GN0PN0 +GN1GN0Cn (2-34) Cn+Z=GN2+PN2 GN1+ PN2 PN1GN0+ PN2 PN1PN0Cn =GN2+PN2 GN1+ PN2 PN1GN0+ PN2 PN1PN0Cn (2-35) =GN2PN2 + GN1GN0PN1+GN2GN1GN0Pn0 +GN2GN1GN0Cn 由2-33,2-34,2-35式可知,只要74181型ALU能提供输出GN, PN 那么就可用3个与或非门和4片ALU相连,这样就能实现16位快速 ALU。 实现2-33,2-34,2-35式的逻辑电路就成为超前进位扩展器(74182 芯片),图2-11使它的逻辑电路图,图中将Pni、GNi分别用Pi、Gi表 示。图中P、G输出可用于把4组16位快速ALU扩展成64位快速ALU 图2-12画出了用74181和74182芯片构成的16位快速ALU。
16
图2.11 与74181型ALU连用的超前进位产生电路
19
用两个16位全先行进位部件(74182)和八个74181可级连组成的32位ALU电路
用四个16位全先行进位部件(74182)和十六个 74181可级连组成的64位ALU电路 由于集成器件的集成度的提高,允许更多位的 ALU集成在一个芯片内。例如AMD公司的 AM29332为32位ALU,而在Intel公司的Pentium处 理器中,32位ALU仅是芯片内的一部分电路。尽 管器件不同,但基本电路原理还是相似的。
20
2.4.3 译码器 译码:把某组编码翻译为唯一的输出,实际应用中要用到的有地址译码器和指令译码器。
译码器:有2-4译码器、3-8译码器(8选1译码器)和4-16译码器(即16选1译码器)等多种。 书中介绍的是2-4译码器的组成及应用 例如:3-8译码器,即8选1译码器的输入信号有三个:C、B、A(A为低位),三位二进制数可组成8个不同数字,因此可分别选中输出Y0 到Y7的某一个输出故称为 8选1译码器。在资料手册中的型号为74138。
21
其中:G1、G2A、G2B为芯片选择端,G1高电 平有效,而G2A、G2B为低电平有效。
下图分别为译码器引脚图和输入输出真值表 其中:G1、G2A、G2B为芯片选择端,G1高电 平有效,而G2A、G2B为低电平有效。 输 入 输 出 C B A Y7 Y6 Y5 Y4 Y3 Y2 Y1 Y0 74LS138 Y0 Y1 Y2 Y3 Y4 Y5 Y6 Y7 G1 G2A G2B C B A
22
2.4.4 数据选择器 逻辑功能是在地址选择信号的控制下,从多路 数据中选择一种作为输出信号。又称多路开关或
多路选择器。以四选一选择器为例: D0 D1 D2 D3 A1 A0 地址A1A 输出F D0 D1 D2 D3 F
23
数据传输过程中,常常需要将一路数据分配到多路装置中指定的某一路中,执行这种功能的电路叫数据分配器。下面以四路数据分配器为例进行说明:
2.4.5 数据分配器 数据传输过程中,常常需要将一路数据分配到多路装置中指定的某一路中,执行这种功能的电路叫数据分配器。下面以四路数据分配器为例进行说明: A0 A D W D W0=D D W1=D D W2=D D W3=D D W0 W1 W2 W3 S A1 A0
24
2.4.6 三态门 当E=1时,其输出等于输入,是同相门; 当E=0时,输出与输入呈现高电阻隔离。
D——输入端 L——输出端 E——使能端 D E L 当E=1时,其输出等于输入,是同相门; 当E=0时,输出与输入呈现高电阻隔离。 计算机中用做数据输出器件,当不输出数据时,可令E=0,使对总线无影响,因而多个器件可同时连到总线上。
25
2.5 时序电路 2.5.1 触发器 2.5.2 寄存器 2.5.3 四级二进制并行计数器
26
2.5.1 触发器 (1)D触发器 电路符号: D为数据输入端; CLK为时钟信号; S为置位信号端; CLR复位信号端; Q为输出信号端。
D S Q CLK CLR Q 输入 输出 S CLR CLK D Q X X X X D触发器功能表: 正跳变触发有效。
27
电路符号: JK为控制输入端; CLK为时钟信号; S为置位信号端; CLR复位信号端; Q为输出信号端。 (2) J-K触发器 输入 输出
输入 输出 S CLR CLK J K Q 不变 翻转 X X X X X X J S Q CLK K CLR Q
28
2.5.2 寄存器 1 寄存器 计算机中常用部件,用于暂存二进制信息。 寄存器可由多个触发器组成。每个触发器存
1Bit,N个触发器储存N位二进制数据。 下图为由4个D触发器组成的四位缓冲寄存器。 Q0 D0 CLK Q3 D3 CLK Q2 D2 CLK Q1 D1 CLK 控制端 X0 X3 X2 X1
29
2 移位寄存器 移位寄存器不仅具有存储数据的功能,而且还具有移位功能。所谓移位功能就是将移位寄存器中所存的数据,在移位脉冲信号的作用下,按要求逐次向左、右方进行移动。 从信号输入上分有串行输入和并行输入 从信号输出上分有串行输出和并行输出 下面以串行输入并行输出右移位寄存器为例进行说明:
30
串行输入信号DIN 移位脉冲 CLK 串行输入并行输出右移位寄存器波形图 D1 Q1 F1 CLK D2 Q2 F2 D3 Q3 F3
X X X X4 串行输入信号DIN 移位脉冲 CLK DIN CLK X1 X2 X3 X4 串行输入并行输出右移位寄存器波形图
31
2.5.3 四级二进制并行计数器 控制端 计数端 清0端 Q0 Q1 Q2 Q3 J Q CLK K CLR
32
2.6 可编程逻辑器件设计基础 2.6.1 可编程逻辑器件简介 2.6.2 硬件描述语言(VHDL)介绍
可编程逻辑器件简介 硬件描述语言(VHDL)介绍 可编程逻辑器件设计语言ABEL
33
2.6.1 可编程逻辑器件简介 目前,数字集成电路得到了广泛的应用,其本身也在不断地进行更新换代。随着微电子技术的发展,设计与制造集成电路的任务已不可能全由半导体厂商来独立承担,出现了可编程逻辑器件(PLD),其中应用最广泛的是现场可编程门阵列(FPGA)和复杂可编程逻辑器件(CPLD)。 可编程逻辑器件如同一张白纸或是一堆积木。它能做什么呢?可以毫不夸张地讲,它能完成任何数字器件的功能,上至高性能CPU(如NiosII) ,下至简单组合逻辑(如74系列元器件) ,都可以用它来实现。现在的可编程逻辑器件已经能够容纳几个32位的CPU同时工作,实现复杂嵌入式系统。可编程逻辑器件是电子设计领域中最具活力和发展前途的一项技术。下面我们深入地探讨一下可编程逻辑器件方面的知识。
34
1)FPGA和CPLD FPGA是现场可编程门阵列(Field Programable Gate Array) 的简称,它是可编程逻辑器件的一种。CPLD是复杂可编程逻辑器件 (Complex Programable Logic Device)的简称。两者的功能基本相 同,只是实现的原理有所不同。在进行逻辑设计时,统称为可编程 逻辑器件或CPLD\FPGA。 FPGA与CPLD的主要区别 在编程方式上,CPLD主要是基于EEPROM或FLASH存储器编 程,编程次数可达1万次,其优点是系统断电时编程信息也不丢失。 FPGA大部分是基于SRAM编程,编程信息在系统断电时丢失, 所以每次上电时须将编程数据从外部配置芯片重新写入SRAM中, 其优点是可以编程任意次,可在工作中快速编程,从而实现板级和 系统级的动态配置。 但FPGA的制造工艺确定了FPGA芯片中包含的LUT和触发器的 数量要比CPLD丰富得多,更适合完成复杂的时序逻辑。CPLD由于 其宏单元的分解组合逻辑功能强大,适合于触发器有限而乘积项丰 富的组合逻辑。
35
为什么要使用CPLD/FPGA 搞过硬件电路设计的工程师可能明白:使用通用的标准逻辑集 成器件(如74系列元器件)组合设计一块具有特定逻辑功能的电路 板是很麻烦的。需要进行逻辑电路设计,然后再进行印刷电路板设 计、最后还有焊接工序。这期间的调试工作很多都牵涉到各器件之 间的阻抗匹配、信号完整性等。这就是说,各逻辑器件并不像在逻 辑设计阶段那么理想了,还需要考虑其实际情况。一个小错误都可 能使得PCB报废,须重新制板。系统的调试只有在硬件PCB板制 造、焊接完成后才能进行。若发现错误,调试也只能等下一次PCB 修改后才能继续。 这样一来,整个开发周期就变得很长了,电路板的体积功耗都 变大,可靠性降低。而且逻辑设计人员不能专注于逻辑功能的设 计,效率大打折扣。 可编程逻辑器件为数字系统的开发带来革命性的突破,简化了 系统的设计。只要逻辑门数足够,一片可编程逻辑器件就可以容纳 传统设计所需要的通用标准逻辑器件。“器件”(并非真正的器件, 而是内部逻辑关系)之间的连接和可靠性完全由芯片制造商来保证。
36
大缩短设计时间,减少PCB面积,提高系统的可靠性。 可编程逻辑器件的这些优点使得PLD技术在20世纪90年
另外,通过逻辑设计或者修改模块参数,还可以“自制”原来所 没有的器件,这一点很重要。通过购买第三方的IP(Intellectual Property,知识产权)核,使系统设计大为简化,具有很高的集成 度。 由于可编程逻辑器件的大部分引脚均为普通I/O引脚,可以设置 为输入、输出、双向或高阻。所以在器件型号选定后,根据系统的 要求,可编程器件的输入输出关系及其所使用的引脚就可以确定下 来了。另外由于可编程逻辑器件的内部逻辑设计与硬件PCB绘制同 时进行,大大缩短了系统设计周期。在PCB完成以后,还可以利用 可编程逻辑器件的在线修改能力,随时修改设计,而不必改动硬件 电路。可以说,这就是“可编程”的魅力! 总之,使用可编程逻辑器件来开发数字电路,可以大 大缩短设计时间,减少PCB面积,提高系统的可靠性。 可编程逻辑器件的这些优点使得PLD技术在20世纪90年 以后得到飞速的发展,同时也大大推动了EDA软件和硬 件描述语言(HDL)的进步。
37
2.6.2 硬件描述语言(VHDL)介绍 Description Language)设计CPLD/FPGA称为一种趋势
随着EDA技术的发展,使用硬件描述语言(Hardware Description Language)设计CPLD/FPGA称为一种趋势 为什么要使用硬件描述语言呢?它跟原理图输入又有什么区别? 传统的原理图输入其实就相当于物理器件的焊接,其输入的可靠性好、效率高、比较直观,但设计大规模PLD/FPGA时显得很烦琐、移植性差。硬件描述语言和传统原理图输入方法的关系就好比是高级语言和汇编语言的关系。HDL的可移植性好,使用方便,但效率不如原理图高。在真正的CPLD/FPGA设计中,通常建议采用原理图和HDL结合的方法来设计。在最短的时间内,用自己最熟悉的工具设计出高效、稳定、符合设计要求的电路才是我们的最终目的。
38
目前主要的硬件描述语言是VHDL和Verilog HDL。VHDL发展较早,语法严格,而Verilog HDL是在C语言基础上发展起来的一种
VHDL的英文全名是Very-High-Speed Integrated Circuit Hardware Description Language,诞生于1982年。1987年底, VHDL被IEEE和美国国防部确认为标准硬件描述语言。 VHDL的程序结构特点是将一项工程设计,或称设计实体(可以 是一个元件、一个电路模块或一个系统)分成外部(或称可视部分, 即端口)和内部(或称不可视部分,即涉及实体的内部功能实现部 分)。在完成了对一个涉及实体开发后,其他的设计就可以直接调 用这个模块。这种将设计实体分成内外部分的概念是VHDL系统设 计的基本点。
39
使用任何文本编辑器都可进行VHDL语言的编写,也可以
用专门的HDL编辑环境。通常将VHDL文件保存为.vhd文件。 VHDL的语言形式、描述风格及句法有点类似于一般的计算机高级语言,但是要注意的是,硬件描述语言与平常的计算机描述语言并不相同,它描述的是硬件电路。VHDL主要用于描述数字系统的结构、行为、功能和接口,与原理图有对应的关系 VHDL是美国国防部颁布的超高速集成电路(VHSIC)计划 所确定的硬件描述语言,并于1987年被IEEE批准为标准设计 语言,命名为IEEE 。美国国防部鼓励设计语言格 式标准化,它要求所有与政府项目有关的ASIC设计必须符合 IEEE-1076标准。设计者用VHDL可对整个ASIC进行从系统级 (对电路结构的高层次抽象)到门级硬件的描述。对被模拟系统 的模型可混合使用高层次行为描述和低层次(逻辑和门电路)的详细描述。
40
VHDL是一种标准语言,VHDL模型可以在与此标准相一致的任一计算机系统上运行,并产生相同的模拟结果。VHDL模型以使用离散值的“激励一响应”形式为基础。
41
在对电路进行逻辑模拟时,一般要经历以下步骤:
定义电路的端口(输入端、输出端),端口是电路与外界的连接点。 电路的行为描述和结构描述。 编写对电路进行激励模拟的命令文件,进行逻辑模拟。 (1)电路的VHDL描述 在VHDL中,被模拟的电路由实体定义,实体由说明部分与结 构部分组成。今将半加器的VHDL描述作一介绍(其中“- -”为注释 符,一行中“- -”后面的任何字符都为注释,在程序中不起作用 )。 描述工具是Viewlogic公司提供的Workview软件。 - -下面是半加器的实体说明 ENTITY half_adder is port (X:in vlbit; Y:in vlbit; Sum:out vlbit; Carry:out vlbit); end half_adder; - -端口定义结束,in表示输入数据,out表示输出数据。
42
ARCHITECTURE behavioral_description of half-adder is begin process
- -VHDL有三种基本数据类型:整数、浮点数和枚举类 型,vlbit为枚举类型二值(0,1) 。 - - X、Y是半加器的输入,Sum为和(输出),Carry为 进位(输出)。 - -下面为结构体描述 ARCHITECTURE behavioral_description of half-adder is begin process begin Sum<=X xor Y after 5 ns; Carry<=X and Y after 5 ns; Wait on X,Y; end process; - -进程描述结束 end behavioral_description; - -结构体描述结束
43
在VHDL中,常用进程Process进行行为描述。 在该进程中,表示Sum和Carry的值要比信号X,Y
现将结构体描述简单说明如下: 在VHDL中,常用进程Process进行行为描述。 在该进程中,表示Sum和Carry的值要比信号X,Y 延迟5ns时间才能形成。Wait语句将进程挂起,直 到信号X或Y中的任一个发生了变化,进程就从进程 语句的顶端开始重新执行一遭,也可将进程改写如 下,此时不再需要Walt语句,而作用与有Wall语句 的进程相同。 process (X,Y) begin Sum<=X xor Y after 5 ns; Carry<=X and Y after 5 ns; end process;
44
A<31:0>进行任意位(31位~0位)移位,移位次数由<4:0>
例1、举一个移位器的例子。该移位器可对32位数据 A<31:0>进行任意位(31位~0位)移位,移位次数由<4:0> 给出,移位器的功能由5级门完成,在B(i)控制下数据经 过每级门有两种操作可供选择:直接送出(B(i)=0不移位) 或移固定位数(B(i)=1),其中第1级可移1位;第2级可移2 位;第3级可移4位;第4级可移8位;第5级可移16位。另 外该移位器可进行逻辑左移、逻辑右移、算术左移和算术 右移四种操作。逻辑左移和算术左移,空出来的低位补 0;所以这两种操作没有区别,统称为左移;逻辑右移空 出的高位补0;算术右移,空出的高位全部补入原符号 位。SR为移位结果。 在本例中,首先对移位器进行行为描述,定义了三个 函数(function):左移shiftl,逻辑右移shiftr-logic,算术右移shiftr maths,并一起归入Extend.Vhd程序包中。
45
左移的VHDL描述: function shiftl( A:vlbit_ld(31 downto 0); i:integer) return vlbit_ld is variable SR:vlbit_ld(31 dowmo 0); begin SR(31+i downto i):=A; for j in i-l downto 0 loop SR(j):='0'; end loop return SR(31 downto 0); cndI; 程序中的vlbit_ld表示一维数组。 在VHDL中有两种赋值符号“<=”和“:=”。前者表示赋值需经 过一段延迟时间才能完成;后者则可立即赋值。当给变量置初始化 值或给常量赋值时使用“:=”符号。
46
逻辑右移的VHDL描述; function shiftr_logic( A:vlbit_ld(31 downto 0); i:integer) return vlbit_ld is variable SR:vlbit_ld(31 downto 0); begin for j in 31 downto 32-i loop SR(j):= '0'; end loop SR(31-i downto -i):=A return SR(31 downto 0); end; 算术右移的VHDL描述请读者自行写出。
47
下面给出移位器的实体说明与结构体描述。 文件名:shifter.vhd use work.extend.all; --use语句允许本实体引用。extend.vhd程序包,内有3个移 位函数 ENTITY shifter is generic(SR_DELAY:time:=10ns); --属性定义,从输入A、B到输出SR的延迟 port(A:in vlbit_ld(31 downto 00); B:in vlbit_ld(4 downto 0); SR:out vlbit_ld(31 downto 00); Clr,Cal:in vlbit); --端口定义,A为32位一维向量,B为5位一维向量。 --Clr为左右移控制信号,Clr="0"为左移,Clr="1",为右移 --Cal为算术移位和逻辑移位的控制信号,Cal=“0”为算术移位, Cal="1"为逻辑移位. end shifter;
48
实体说明结束,以下为结构体描述 ARCHITECTURE behavior OF shifter IS begin process (A,B,Clr,Cal) variable tmp1, tmp2,tmp3,tmp4,tmp5: vlbit_ld (31 downto 00) if B(0)='0' then tmp1:=A; elsif Clr='0' then tmp1=(shiftl(A,1)); elsif Cal='0' then tmp1:= (shiftr_maths(A,1)); else tmp1:= (shiftr_logic(A,1));
49
end if; --shiftl,shiftr_logic及shiftr_maths在extend.vhd中定义 if B(1)= '0' then . end if --得出tmp2 if B(2):='0' then if B(3)='0' then --得出tmp3,tmp4
50
if B(4)='0' then tmp5:=(tmp4) elsif Clr='0' then tmp5:= (shiftl(tmp4,16)); elsif Car=0 then tmp5:=(shiflr_maths (tmp4,16)); else tmp5:=(shiftr_logic (tmp4,16)); end if SR<= tmp5 after SR_DELAY; --输出结果SR end process; --进程描述结束 end behavior;
51
例2、这里举一个简单的VHDL例子,让大家有一个入门的认
识。例子的功能是实现一个12位的寄存器。 ENTITY REG12 IS --外部端口定义:数据,时钟,输出 PORT(d:IN BIT_VECTOR(11 DOWNTO 0); clk:IN BIT; q :OUT BIT_VECTOR(11 DOWNTO 0); EDN REG12; --内部实体逻辑 ARCHITECTURE a OF REG12 IS BEGIN PROCESS WAIT UNTILL clk=’1’;--等待时钟上升沿 q<=d; END PROCESS; END a;
52
这里例子十分简单,就是在时钟的上升沿把输
入的数据锁存起来。当然,用原理图的方法也可 以实现,用12位的D触发器就可以了。例子虽然简 单,但已经具有以上所说的VHDL语言特点了,请 仔细推敲。
53
(2)逻辑模拟及验证 如何证明用VHDL描述的ASIC在逻辑上和时序上的 正确性?这便是逻辑模拟的目的。 在workview环境下,逻辑模拟可根据屏幕提示和菜 单进行操作。下面以shifter的模拟过程为例进行说明。 第一步,把VHDL的逻辑描述(shifter.VHD)转换为网 表文件,这是因为模拟器只能对网表进行模拟,用命令 C2>VHDL shifter-v 可生成shifter.VLI及shifter.VSM网表文件(其中VHDL为 编译命令,-v为命令的参数,表示需要生成网表文件)。 第二步,进入模拟器,并把模拟对象的网表文件加载 到模拟器中。 在workview集成环境中,模拟器为viewsim。进入 viewsim中后,模拟器会问用户加载网表的名称,输入 shifter即可(关于workview的具体使用,可参看其使用说 明书)。
54
第三步,对输入端口施加激励并进行模拟。所
谓激励,对应于实际电路的输入端输入信号,一般 通过逻辑值1和0的组合来表达。 在shifter中,输入端口有A<31:0>,B<A:0>, Clr及Cal为这些输入端口设计激励时,要注意尽可 能全面地测试移位器的功能。 第四步,显示模拟结果,设计简单的列表方式及 图形显示方式等。
55
2.6.3 可编程逻辑器件设计语言ABEL (用于计算机组成原理实验)
前言 1 ABEL-HDL语言的基本语法 2 ABEL-HDL语言源文件的基本结构 3 逻辑描述 可编程逻辑器件,是用户可以通过编程来实现各种逻辑功能的一类集成电路。
56
前言 开发使用PLD的系统时,应使用语言或逻辑图来描述该PLD的功能,并通过编译、连接、适配,产生可对芯片进行编程的目标文件(如标准的JED文件),然后再下载并写入芯片中。 常用的可编程逻辑器件设计语言为ABEL-HDL(ABEL硬件描述语言),它是DATA I/O公司开发的一种可编程 逻辑器件设计语言,它可支持绝大多数可编程逻辑器件。
57
1 ABEL-HDL语言的基本语法 1、ABEL源文件构成
在用ABEL-HDL进行逻辑设计时,描述逻辑功能的源文件必须是符合ABEL-HDL语言语法规定的ASII码文件。 ABEL-HDL源文件是由各种语句组成的,这些语句是由ABEL-HDL语言的基本符号构成的,这些符号必须满足一定的格式才能正确描述逻辑功能。语句的每一行最长为150个字符。在源文件的语句中标识符、关键字、数字之间至少必须有一个空格,以便将它们分隔开来。但在标识符列表中标识符以逗号分隔。在表达式中,标识符和数字用操作符或括号分隔。空格、点号不能夹在标识符、关键字、数字之间。如空格夹在标识符、数字之间将会被看作两个标识符或两个数字。以大写、小写或大小写混合写的关键字被看作同一个关键字(关键字不区分大小写),而以大写、小写或大小写混合写写的标识符将被看作不同的标识符(标识符区分大小写)。 标识符主要用来标识器件、引脚、型号,变量等。
58
Abel语言是由一个或多个相互独立的模块构成,每一个模块包含了一个完整的逻辑描述。
62
2、ASCII字符 在ABEL-HDL语言中,其合法的ASCII字符除了数字0-9,大小写的英文字母外,还包括空格符及下述符号:
! @ # $ ? + & * ( ) [ ] ; : ‘ “ – ,. < > / ^ %
63
3、标识符 标识符是用合法的ASCII字符按次序排列定义的名字,其作用 是标识器件、管脚、节点、集合、输入输出信号、常量、宏以及变
量。所有的标识符必须符合下述规定: 标识符的长度不超过31个字符; 2. 标识符必须以字母或下划线开始; 3. 标识符其他的宇母可采用大、小写字母、数字及下划线; 4. 标识符中不能包括空格符; 5. 除保留标识符(即关键宇)外,标识符中同一个字母的大、小写 表示不同的含义; 6. 除了合法的点扩展外,标识符中同一个字母的大、小写表示不 同的含义。 在ABEL-HDL中保留的标识符称为关键字,关键字不能用于命 名器件、管脚、节点、集合、宏或信号,而代表了这个字所特指的 功能。
65
4、常量 在ABEL-HDL语言的逻辑描述中,常量用于赋值语句、真值表和测试向量的表达,有时也用于给某些标识符赋值,以使该标识符在整个模块的逻辑描述中代表该常量的值。 常量可以是数值常量,也可以是非数值的特殊常量。
67
5、块 块是包含在一对大括号中的文本,它用于宏和指令。括号中的文本内容可以是一行,也可以是多行。块可以嵌套,即块中包含块。如在块的文本的字符中包含了大括号,则应在其之前加上反斜杠。 例如: {This is a block} 再如: { This is also a block,and it spans more than one line } A=B#C D=[0,1]&[1,0]
68
6、注释 注释是对源文件的解释,注释以双引号开始,以另一个双引号或行结束符号结束,注释不能用于关键字之间。 例如:
“declaration section” module Basic_logic; ”gives the module a name(回车)
69
7、数字 8、字符串 ABEL-HDL中的所有的数值运算精度都是32位,合法的数值范围是0~232-1。
数字可采用二进制、八进制、十进制或十六进制,它们分别以符号^b、^o、^d或^h表示,如不用符号则认为是十进制数。 在ABEL-HDL中数字还可用字符表示,在字符之前加上单引号后,即以字母ASCII码作为数值,例如‘a’=^h61,‘ab’=^h6162 8、字符串 字符串用于标题、模块及选项的表达,也用于管脚、节点和属性的定义,它包含在一对单引号中。如字符串中有单引号或反斜杠则必须在它们之前再加一反斜杠。字符串可写几行,但不能超过324个字符。 如: TITLE ‘1 to 8 line demultiplexer’; DMI’P16L8’;
70
9、运算符 ABEL-HDL支持四类基本运算:逻辑运算、算术运算、关系运算及赋值运算。 1) 逻辑运算 (1)非: ! 例 !A
2) 算术运算 (1)取负 例 -A (2)加 例A+B (3)减 例A-B (4)乘(无符号整数) * 例A*B (5)除(无符号整数) / 例A/B (6)取模(无符号整数) % 例A%B (7)左移<< 例A<<B (8)右移>> 例A>>B
71
4)赋值运算 3) 关系运算 关系运算为无符号运算,其结果为位(布尔值)。 (1)等于: == 例A==B
例如: 2== 值为false 3< 值为true -1> 值为false 4)赋值运算 组合输出为(非时钟赋值) = 寄存器输出为(时钟赋值) :=
73
10、表达式和等式 表达式由标示符和运算符组成。在表达式中可出现任何逻辑、算术或关系运算,表达式中的运算次序按运算优先级决定,也可加括号改变执行次序。 赋值运算仅用于等式,它将表达式的运算结果通过等式赋给输出信号(包括组合赋值和时序(寄存器)赋值)。一个信号可以被多次赋值,而其最终结果是所有这些赋值的或,而不是最后一次的赋值。
74
11、布尔方程语法 [WHEN 条件 THEN ] [! ]……[ENABLE] 元素 = 表达式;[ELSE 方程]
式中: 条件:任意合法表达式; 元素:给一个或一组信号命名的标识符,或要被表达式赋值的集合 表达式:由标识符和运算符组成的式子,求值后得出一个结果。 例如: WHEN B THEN A=B; ELSE A=C X=A&B; Y:=A&B; ENABLE Y=C#D; 若C#D为真,Y被使能(并不是Y输出为Y=C#D)
75
12、引脚和寄存器的特别说明 1. 三态允许端: .OE,它为1有效,仅适用于引脚。 2. 寄存器复位端: .RS,它为1有效
3. 寄存器置位端: .PR,它为1有效 4. 寄存器时钟: .CLK,它为上跳触发 5. JK触发器输入端: .J和.K 6. T触发器输入端: .T 7. RS触发器输入端: .R和.S 8. D触发器输入端: .D也可使用:=
76
13、集合 集合是作为一个独立单元进行操作的一组信号或常量。它采用一个标识符,用方括号内的一组信号或常量表示,其中的每一个信号或常量称为集合的元素。 定义集合的方法有枚举法、界限符法或它们的组合。 例如:ADD=[A5,A4,A3,A2,A1,A0] 为枚举法 ADD=[A5..A0] 为界限符法 ADD=[A5,A4,A3..A0] 为两种方法的组合集合可以进行逻辑、加、减、关系运算。 逻辑运算是对集合中每一个元素作相应的运算,因此如果需对两个或两个以上集合进行运算时,这些参与运算的集合的元素数目必须相同。但单个变量与集合进行逻辑运算为该变量与集合的每个元素进行逻辑运算。加、减、关系运算为对整个集合执行该运算。
77
例:(ADD>=^h10)&(ADD<=^h2F)
等价于A5^A4VA5^A4 如:当ADDR为6位寄存器, ADDR:=ADDR+l,为把寄存器A5~A0的值加1。 ABEL-HDL语言处理集合时,将它们作为二进制数来对待,二进制数中的每一位代表了集合中的每一个元素的取值。 例如:[A0,A1,A2]=3 等效于A0=0,A1=1,A2=1。 例1: 用集合运算实现布尔方程 ChipSel=A15&A14&A13; 首先,定义一个包含A15,A14,A13的常量集合 Addr=[A15,A14,A13]; 于是方程 ChipSel=Addr=[1,0,1];
78
其逻辑功能等效于 ChipSel= A15&A14&A13。
因为如果Addr=[1,0,1],即A15=1,A14=0, A13=1,那么ChipSel为真。上述集合方程 也可以写成: ChipSel=Addr=5; 本例定义了一个包含16位地址线中高3位的一个集合,并用于集合运算中,也可用其他方法对全部地址进行效果相同的操作。 例2:如果在定义段中定义了常量: Addr=[A15..A0]; X=.X.; 那么,下例两种方法等效于地址线集合中只使用地址高三位的方法: 方法1: ChipSel=Addr=[1,0,1,X,X,X,X,X,X,X,X,X,X,X,X,X] 方法2:ChipSel=(Addr>=^hA000)&(Addr<=^hBFFF);
79
14、变量及变量代换 哑变量:在宏定义、模块或指示字中可被真实变量替代的标识符; 真实变量:用于宏定义、模块或指示字中的变量。
在需要用真实变量取代哑变量的地方,哑变量前要加一个问号“?”,以与其他标识符区分开来。 如下面的宏定义 OR_EM MACRO(a,b,c) {?a # ?b # ?c}; 中,a,b,c就是哑变量。下列方程式对OR_EM宏的宏引用 D=OR_EM(X,Y,Z);其中X,Y,Z是真实变量。
80
2 ABEL-HDL语言源文件的基本结构 1、引言
ABEL-HDL语言源文件由一个或多个相互独立的模块构成,每一个模块包含了一个完整的逻辑描述。源文件中的所有模块都可以被ABEL-HDL软件同时处理。
82
模块结构必须遵从以下原则: 1. 模块开头为module语句,结束必须用相应 的end语句; 2. 若使用flags语句,必须为module语句的第 一条语句; 3. 若使用title语句,必须为flags语句后的 第一条语句; 4. 一个模块至少有一个定义段,模块中可按 需要以任意次序使用多个定义段。 例1:设计一个模块,要求以GAL6V8构成一个两输 入端的“与”门和一个两输入端的“异或门”, 设输入信号为A,B,输出信号为X,Y,则X=A·B, Y=A⊕B。如在源文件中仅有一个这样的模块,其源 文件如下所示:
83
Module GATE Options ’_trace wave’ Title ’example of gate’ Declarations gate DEVICE ’GAL16V8’; A,B PIN 1,2; X,Y PIN 18,17; Equations X=A&B; Y=A$B; Test_vections ( [A,B]->[X,Y] ) [0,0]->[0,0] [0,1]->[0,1] [1,0]->[0,1] [1,1]->[1,0]; End GATE
84
在这个模块中有说明段、定义段、逻辑描述段、测试向量段及结束语句段五部分组成。
在这五部分中,说明段为模块的开始;定义段的定义部分指定或定义用于设计的器件、信号、常量宏和库;逻辑描述段对所设计的逻辑进行功能描述;测试向量段写出了测试向量,用以验证所设计的逻辑;结束语句段表示一个模块的结束。 此外在模块中还允许有选择地加上一些指令。每一个模块只能有一个说明段,它与结束语句段配对使用,而定义段、逻辑描述段、测试向量段则可以任意次序重复,定义语句必须紧跟标头或定义段的关键字。
85
2、说明段 在例1中说明段如下: Module GATE Options ’_trace wave’
Title ’example of gate’ 说明段包括模块语句、选项和标题三个元素组成。 1) 模块语句 模块语句是必不可少的,其作用是命名模块并标志模块的开始,它与结束语句配对使用,同时也可指出是否利用哑元。
86
模块语句的关键字是Module,其格式为:
Module modulename[(dummy_arg[,dummy_arg]…)] 其中modulename为命名模块的合法标识符,在本例中为GATE。 dummy_arg是哑变量名称,如不利用哑变量则可以略去。 若模块选用哑变量,则在使用语言处理程序处理模块时,可将真实变量传给模块。哑变量可为模块引用。模块中,凡带有“?”的哑变量,语法分析程序都用真实变量将其替代。 例: module my_example (A,B) …… C=?B+?A; end my_example
87
2) 选项 选项为可选语句。其作用是语言处理器控制源文件的处理。选项的关键字是 Options,其格式为 Options’sting’ string为选项字符串。 3) 标题 标题为可选语句,其作用是给出模块一个标题,此标题将作为语言处理程序所生的编程器下载文件及设计编制文件的题头。 标题的关键字是Title,其格式为: Title’string’ string为标题字符串。
88
3、定义段 在例1中定义段如下: Declarations gate DEVICE ’GAL16V8’; A,B PIN 1,2;
X,Y PIN 18,17; 定义段包括定义段关键字、器件定义、信号定义、常量定义、宏定义、库定义等元素。 定义段的关键字是Declarations,后面可跟任何合法的定义语句。定义段的关键字允许定义段可在源文件的任何一部分进行定义。如定义语句紧跟说明段,则可略去定义段关键字。
89
器件定义的关键字是DEVICE,其格式为 Device_id DEVICE real_device;
1) 器件定义 器件定义是可选项,它的作用是将模块中所使用的器件名与实际所采用的可编程逻辑器件联系起来。 器件定义的关键字是DEVICE,其格式为 Device_id DEVICE real_device; 此表达式中,device_id为模块中所使用的器件名,在本例中为gate。real_device为实际际所使用的某一个特定可编程逻辑器件的型号,在本例中为GAL16V8。值得注意的是device_id必须是合法的文件名,因为编程器装载文件的文件名由device_id加上扩展名“.jed”产生的 2) 信号定义 信号定义包括了管脚定义、节点定义及属性定义。其作用是定义信号,并可选择和管脚及节点相联系。 节点/管脚定义用于定义信号名,并将信号同具体的器件节点/管脚序数联系起来。
90
属性用于定义信号的特性,它既可用于器件的节点/管脚说明中,作为节点/管脚定义的一部分,也可设在器件的节点/管脚定义之后,作为一个独立的定义部分。它们的关键字分别为PIN,NODE,ISTYPE。
(1) 管脚定义 管脚定义的格式为: [!]pin_id[,[!]pin_id…]PIN[pin#[,pin#][ISTYPE’attributes’]; 其中[!]pin_id是逻辑设计中用于指示模块中管脚的标识符,pin#为实际器件中的管脚(可为?,由系统分配),attributes为在节点可编程的器件中用于指明属性的字符串,有以下几种:
92
例: !Clock,Rest,SI pin in U12,12,15,3;
这行代码将器件U12的管脚12,15,3分别用标示符Clock,Rest,SI来表示。 若模块中不止定义一个器件,必须用语句中的in项来指明器件。 例:管脚的属性可由语句中的属性项或ISTYPE语句定义,比如 FO pin 13 =‘neg,reg’; FO pin 13 ISTYPE‘neg,reg’; (2) 节点定义 节点定义的格式为: [!]node_id[,[!]node_id…]NODE[node#[,node#][IETYPE’attributes’]; 其中[!]node_id是逻辑设计中用于表示节点的标识符,node #为实际器件中的节点号,Attributes为在节点可编程的器件中用于指明属性的字符串(同管脚定义)。 关键字NODE并没有把信号限制在器件上的内部节点上,当一个信号用NODE定义后,也可能被器件装配器分配给器件的I/O引脚上。
93
(3) 属性定义 属性定义的格式为: signal[signal…][PIN NODE[##S]] ISTYPE’ attributes’[,attributes’]; signal是管脚或节点的标识符,attributes为指明属 性的字符串。 例: FO , A istype ‘neg,latch’;将FO和A定义为负 极性锁存信号。 3) 常量定义 常量定义用于定义模块中的常量,常量的关键字是=, 其格式为: id [,id…] = expr [,expr …]。 id为模块中所使用的常量的标识符。 expr为定义 常量值的表达式。 例:A , B , C = 5 , [1,0] , 6; G = [1,2] + [3,4]
94
4) 宏定义 宏定义用于定义模块中的宏。这个宏包含了源文件中的某一部分,这样,用户在建立文件时,不必每次书写相同的内容,而可以调用宏。 宏定义的关键字是MACRO,其格式为: Macro_id MACRO(dummy_arg[,dummy_arg]…)block; Macro_id为表示宏的宏的标识符。dummy_arg为哑变量。block为块。 例:若定义了NAND3 MACRO(A,B,C){!(?A&?B&?C}; 则引用D=NAND3(Clock,Hello,Busy); 相当于D=!(Clock&Hello&Busy); 5) 库定义 库定义的关键字是Library,其格式为: Library ’name’ name为定义库文件名的字符串,不含扩展名。 库定义使用户指定的文件内容从name.inc 库文件中抽取出来,并被插到源文件中。
95
4、逻辑描述段 在例1中逻辑描述段如下: Equations X=A&B; Y=A$B;
ABEL-HDL语言描述逻辑的方式有方程、真值表、状态 图、熔丝和异或因子,其中每一种描述方法均以关键字或 符号开始,以引导某种描述的开始。 1) 方程的形式 它以扩展的布尔方程来描述逻辑功能;方程语句表示 与某个器件相关的一组方程的开始;方程语句的关键字是 Epuations,其赋值符为=或:=,其中=为组合逻辑的赋值 操作符,:=为时序逻辑的赋值操作符。
96
在方程中允许使用WHEN-THEN-ELSE语句。
方程的表达形式如下: Equations [WHEN condition THEN] [!] element = expression; [ELSE equations]; 或者 [WHEN condition THEN] equations; 其中condition 为任何合法的表达式。 element 命名一个或一组信号,或一个实际集合的一 个标识符。 equation 为任何合法的表达式。
97
2) 真值表的形式 (1) 表头向量 例: equations in IC13 A = B & C # A; [W,Y]=3;
WHEN B THEN A=B; ELSE A=C; 2) 真值表的形式 它以表格的形式描述了输出与输入逻辑之间的关系。真值表由表头向量和表格组成。它的关键字是TRUTH TABLE. (1) 表头向量 它的表达形式为: TRUTH TABLE(in ids->out ids) inputs->outputs; 或者 TRUTH TABLE(in ids:>reg ids) inputs:>regs outs; TRUTH TABLE(in ids:>reg ids->out ids) inputs:>regs outs->outputs;
98
(2) 真值表格式 其中:in ids为逻辑关系中的输入信号标识符。 out ids为逻辑关系中的输出信号标识符。
reg ids为逻辑关系中的寄存器型信号标识符。 inputs为逻辑关系中的输入信号。 outputs为逻辑关系中的输出信号。 reg outs为信号寄存后的输出。 这三种形式中第一种适合于描述组合逻辑,第二种适合于描述时序逻辑,第三种适合于描述既包含组合逻辑又包含时序逻辑的较复杂的逻辑电路。 符号->表示输入输出关系为组合型,符号:>表示输入输出关系为寄存器型。 (2) 真值表格式 格式由真值表的表头向量定义,真值表本身即为按格式定义格式排列的一组输入输出信号。真值表中使用的所用信号必须是常量。
99
例:定义带使能的异或门 TRUTH TABLE in IC6 ([EN,A,B]->C) [0, .X., .X.]->.X; [1, 0, 0]->0; [1, 0, 1]->1; [1, 1, 0]->1; [1, 1, 1]->0; 例:定义一个简单的状态机。当前状态用放在一个集合里 的信号A,B表示,下一个状态用寄存器输出信号C,D表示, 它们也放在一个集合中。输出信号为一简单的组合型信号 E。 该状态机工作时,在各状态之间循环。当A=0,B=1时,将E置为低电平。
100
TRUTH TABLE in IC17([A,B]:>[C,D]->E)
[0,0]:>[0,1]->1; [0,1]:>[1,0]->0; [1,0]:>[1,1]->1; [1,1]:>[0,0]->1; 也可写为 0:>1->1; 1:>2->0; 2:>3->1; 3:>0->1;
101
3) 状态图的形式 状态图采用了状态机的结构,专门用于描述时序逻辑,它可以更简便地设计如计数器、顺序控制器等状态机构。它的关键字是STATE DIAGRAM,其表达形式为: STATE DIAGRAM State reg [->state out] STATE state exp [equation] [equation] . [trans-stmt…] 其中State reg为表示决定状态机当前状态信号的一个或一组标识符。 state out为表示状态机下一个状态的一个或一组标识符。 state exp为表示当前状态的表达式。equation为定义状态机输出信号的合法方程。 trans stmt可为IF-THEN-ELSE语句,CASE语句或GOTO语句,后面可跟WHEN-ENDWITH转移态方程。
102
例: current_state=[a,b]; “常量定义” state_diagram in U15 current_state state 1: w=1; y=1; goto 4; state 2: if y==3 then 3 else 4; state 3: w=2; y=w; goto 2; state 4: y=3; case w==1: 2; w==2: 1; endcase
103
若初态为1(a=0,b=1),则经历 的状态顺序为: 1,4,2,3,2,4,1…
104
语法:if 表达式 then 状态表达式 [else 状态表达式];
(1) IF-THEN-THEN语句 语法:if 表达式 then 状态表达式 [else 状态表达式]; 例: if X-Y then J else K;若X-Y不等于零,转入J态,否则转入K态。 (2) 链式IF-THEN-THEN语句 语法:if 表达式 then 状态表达式 [else 状态表达式] else if 表达式 then 状态表达式 else 状态表达式; 可链接的数目没有限制,但最后一个语句必须以分号结尾
105
(3) CASE-ENDCASE语句 语法:case [表达式:状态表达式]; [表达式:状态表达式]; … … endcase; 例: state_diagram in U15 a case a==0: 1; a==1: 2; a==2: 3; a==3: 0; endcase
106
(4) GOTO语句 (5) WITH-ENDWITH语句 语法:goto 状态表达式; 例: goto x+y;
[方程]; … … endwith; 转移语句:即IF、ELSE或CASE语句; 状态表达式:表示下一个状态; 方程:表示状态机的输出信号。WITH-ENDWITH语句与IF-THEN或CASE语句连用时,可使你根据转移状态写出相应的输出方程。 例:case 5: if a==1 then 1 with X:=1; Y:=0; else 2 with X:=0; Y:=1;
107
4) 熔丝的形式 5) 异或因子的形式 熔丝可以清楚地定义有关器材中的某一个熔丝的状态,以决定器件的功能。它的关键字是FUSES,表达式为:
fuse number seet = fuse value; 或者 FUSES fuse number = fuse value; 5) 异或因子的形式 异或因子部分可以指定一个布尔表达式,这个表达式从简化的乘积形式方程中提取公因子,并与这个方程异或。这样当一个设计 在具有异或门结构的器件中实现时,可以大大地简化方程的表达式。它的关键字是XOR_Factors,表达式为: XOR_Factors Singal_name = xor_factors 式中Singal_name为信号名, xor_factors为异或表达式。
108
6) 关于点扩展 点扩展的语言符号为Singal_name.ext信号点扩展类似于属性,它可以精确地描述电路的行为,其主要应用是复杂的语言情况。
109
5、测试向量段 Test_vections ( [A,B]->[X,Y] ) [0,0]->[0,0]
在例1中测试向量段如下: Test_vections ( [A,B]->[X,Y] ) [0,0]->[0,0] [0,1]->[0,1] [1,0]->[0,1] [1,1]->[1,0]; 测试向量段是可选项,它包括了测试向量和跟踪说明两部分。 测试向量用于验证逻辑设计的功能,通过定义输出为输入的一个函数来指定用户所期望的器件的逻辑运算,以便在仿真时确定逻辑功能是否正确。 测试向量的关键字是Test_vectors。 测试向量的表达形式为: Test_vectors [note] ( input [,input…]->output[,output] ) invalues->outvalues;
110
其中:note为说明测试向量的字符串。 inputs表示输入信号或输入反馈信号的一个或一组标识符。 outputs表示一个或一组器件输出信号的一个或一组标识符。 invalues输入值或其集合。 outvalues由给定的输入得到的输出值或其集合。 测试向量表的格式由表头格式所决定,每一向量中的信号都按表头格式语句中的定义进行排列。测试向量表中列出了各种输入。 信号的组合及相应的输出信号,这些信号组合可包含所有的组合形式或其中的一部分。
111
表中所有的信号值必须为定义过的常量、数值常量或特殊常且如‘.X. ’.C.‘等。
例: test_vectors([A,B]->[C,D]) [0,0]->[1,1]; [0,1]->[1,0]; [1,0]->[0,1]; [1,1]->[0,0]; 对于采用状态机描述的逻辑,其测试向量必须是顺序的,即必须通过合法的状态转换。跟踪说明用来控制PLAsim和Jedsim模拟结果的显示特性。跟踪说明的关键字是TRACE,其表达形式为: TRACE(inputs->outputs)
112
6、结束段 在例1中结束段如下: END GATE 它标志一个模块的结束。它的关键字是END,表示形式为: END module_name;
113
3 逻辑描述 ABEL-HDL语言描述逻辑的主要方式是方程、真值表及状态图,用户可选用最适合其设计的逻辑的一种方法或者选用这三种方法中的两种或三种来描述。 1、方程的形式 它以扩展的布尔方程来描述逻辑功能。根据采用的赋值符,这种方法可描述组合逻辑或者时序逻辑。方程中便用的WHEN-THEN-ELSE语句则使逻辑描述更方便。 例1:以方程的方法描述一个二输入、四输出的译码器,设输入信号为A1,A0,输出信号为Y0,Y1,Y2,Y3。 描述上述逻辑关系的真值表如表1所示。 根据真值表能得到布尔方程如下: Y0=A1·A0 Y1=A1·A0 Y2=A1·A0 Y3=A1·A0
114
表1 2-4译码器的真值表
115
采用方程式进行描述,只需将上式中的逻辑运算符用ABEL-HDL所采用的运算符替换即可:
EQUATIONS Y0=!(!A1&!A0); Y1=!(!A1&A0); Y2=!(A1&!A0); Y3=!(A1&A0); 例2:以方程的方法描述一个二选一的多路选择器,它根据选择信号的输入信号中的一组送到输出端。设输入信号为B3,B2,B1,B0,A3,A2,A1,A0,输出信号为Y3,Y2,Y1,Y0,控制信号为S。当S为“ 0”时,输出A组信号。当S为“1” 输出B组信号。 描述上述逻辑关系可采用真值表,输出Y0的真值表如表2。
116
表2 二选一多路选择器的真值表
117
根据上述真值表能得到方程式 Y0 = S · A0 + S · B0 Y1 = S · A1 + S · B1 Y2 = S · A2 + S · B2 Y3 = S · A3 + S · B3 采用方程式进行描述时,只需将上式中的逻辑运算符用ABEL-HDL所采用的运算符替换即可: EQUATIONS Y0=!S&A0#S&B0; Y1=!S&A1#S&B1; Y2=!S&A2#S&B2; Y3=!S&A3#S&B3; 如将输入输出信号分别设置为集合BB,AA,YY,则表示为: YY=!S&AA#S&BB; 还可用下述形式描述: EQUATIONS WHEN S==0 THEN YY=AA; ELSE YY=BB;
118
例3:以方程的方法描述一个两位的并行计数器,它的输出信号为Q1,Q0。描述时序电路可采用状态表3。根据状态表能得到状态方程式:
Q0N+1=Q0N Q1N+1=Q1N·Q0N+Q1N·Q0N Q1N Q0N Q1N+1 Q0N+1 1 1 1 1 1 1 1 1 表3 两位并行计数器的状态表
119
采用方程式进行描述时,只需将上式中的逻辑运算符用ABEL-HDL所采用的运算符替换即可:
EQUATIONS Q0.CLK=CLK; Q1.CLK=CLK; Q0:=! Q0; Q1:=! Q0&Q1 # Q0&! Q1; 例4:以方程的方法描述一个具有置数功能的两分频电路,它的输出信号为Q0。当控制信号load为“0”时,其功能为分频器。当控制信号load为“1”时,则装入输入信号A。可采用状态表4描述此电路。
120
根据上述状态表能得到状态方程式: Q0N+1 = loadA + load·Q0N 采用布尔方程式进行描述时,只需将上式的逻揖运算符用ABEL-HDL所采用的运算符替换即可。
121
2、真值表的形式 它以表格的形式来描述逻辑功能。根据采用的表头向量的运算符,这种方法可描述组合逻辑或者时序逻辑。
例5:以真值表的方法描述例1的2-4译码器,设输入信号为A1,A0,输出信号为Y0,Yl,Y2,Y3。 根据表1的真值表,采用真值表语句进行描述时,只需将此真值表加上表头向量即可: TRUTH TABLE( [A1,A0]->[Y0,Y1,Y2,Y3] ) [0,0]->[0,1,1,1]; [0,1]->[1,0,1,1]; [1,0]->[1,1,0,1];
122
例6:以真值表的方法描述例2的二选一的多路选择器.
根据表2的真值表,采用真值表语句进行描述时,只需将此真值表加上表头向量即可,描述Y0的真值表示法如下: TRUTH TABLE ( [S,B0,A0]->[Y0] ) [0,X,0]->[0]; [0,X,1]->[1]; [1,0,X]->[0]; [1,1,X]->[1]; 如将输入输出信号分别设置为集合BB,AA,YY,则表示为: TRUTH TABLE ( [S,BB,AA]->[YY] ) [0,X,^b1111]->[^b1111]; [1,^b1111,X]->[^b1111]
123
例7:以真值表的方法描述例3的两位并行计数器。描述上述逻辑关系时,真值表的表头应采用寄存器的运算符。
TRUTH TABLE( [load,a,Q0.fb]:>[Q1,Q0] ) [0,0]:>[0,1]; [0,1]:>[1,0]; [1,0]:>[1,1]; [1,1]:>[0,0]; 例8:以真值表的方法描述例4所述的两分频电路。描述上述逻辑关系时,真值表的表头应采用寄存器的运算符。 TRUTH TABLE( [load,a,Q0.fb]:>[Q0] ) [0,0,0]:>[1]; [0,0,1]:>[0]; [0,1,0]:>[1]; [0,1,1]:>[0]; [1,0,0]:>[0]; [1,0,1]:>[0]; [1,1,0]:>[1]; [1,1,1]:>[1];
124
例9:以真值表的方法描述一个简单的状态机,该状态机的初始输入信号为S,状态寄器为Q1,Q0,组合输出为B,A。此状态机的控制过程如下:
当状态寄存器Q1,Q0的当前状态为11时组合输出B,A为11,当S为0对其下一个状态为10。当S为1其下一个状态为11。当状态寄存器Q1,Q0的当前状态为10时组合输出B,A为01,当S为0对其下一个状态为01。当S为1其下一个状态为11。 当状态寄存器Q1,Q0的当前状态为01时组合输出B,A为10,当S为0对其下一个状态为11。当S为1其下一个状态为11。当状态寄存器Q1,Q0的当前状态为00时组合输出B,A为00,当S为0对其下一个状态为10。当S为1其下一个状态为11。 描述上述状态机时,真值表的表头应采用寄存器与组合的运算符。
125
TRUTH TABLE ( [S, Q1.fb, Q0.fb]:>[Q1,Q0]->[B,A] )
[1,1,1]:>[1,1]->[1,1]; [0,1,1]:>[1,0]->[1,1]; [1,1,0]:>[1,1]->[0,1]; [0,1,0]:>[0,1]->[0,1]; [1,0,1]:>[1,1]->[1,0]; [0,0,1]:>[1,1]->[1,0]; [1,0,0]:>[1,1]->[0,0]; [0,0,0]:>[1,0]->[0,0];
126
3、状态图的形式 这种形式采用了状态图的结构,专门用于描述时序逻辑及状态机构。
例10:以状态机的方法描述例3的两位并行计数器。用状态机的方法描述时,只需将状态图以状态机语句进行描述。 STATE_DIAGRAM[Q1,Q0] STATE[0,0] GOTO[0,1] STATE[0,1] GOTO[1,0] STATE[1,0] GOTO[1,1] STATE[1,1] GOTO[0,0]
127
例11:以状态图的方法描述例4所述的两分频电路。
描述上述逻辑关系时,只需将状态图以状态机语句进行描述。 STATE_DIAGRAM[Q0] STATE[0] IF(LOAD &! A) THEN[0] ELSE[1]; STATE[1] IF(LOAD&A) THEN[1] ELSE[0];
128
例12:以状态图的方法描述例9所描述的状态机。
STATE_DIAGRAM[Q1,Q0] STATE[1,1]: B=1; A=1; IF(S) THEN[1,1] ELSE[1,0]; STATE[1,0]: B=0; ELSE[0,1]; STATE[0,1]: A=0; GOTO[1,1] STATE[0,0]:
Similar presentations