计算机组成原理实验(三)
第七章 可编程逻辑器件设计
语言 ABEL
前言
7.1 ABEL-HDL语言的基本语法
7.2 ABEL-HDL语言源文件的基本结构
7.3 逻辑描述
前言
开发使用 PLD的系统时,应使用语言或
逻辑图来描述该 PLD的功能,并通过编译,
连接、适配,产生可对芯片进行编程的目
标艾件(该文件一股采用熔丝图格式,如
标准的 JED文件),然后再下载并写入芯
片中。
常用的可编程逻辑器件设计语言为
ABEL-HDL( ABEL硬件描述语言),
它是 DATA I/O公司开发的一种可编程
逻辑器件设计语言,它可支持绝大多数
可编程逻辑器件。
7.1 ABEL-HDL语言的基本语法
7.1.1 ABEL源文件构成
在用 ABEL-HDL进行逻辑设计时,描述
逻辑功能的源文件必须是符合 ABEL-HDL语
言语法规定的 ASII码文件。
ABEL-HDL源文件是由各种语句组成的,
这些语句是由 ABEL-HDL语言的基本符号构
成的,这些符号必须满足一定的格式才能正
确描述逻辑功能。语句的每一行最长为 150个
字符。在源文件的语句中标识符、关键字、数
字之间至少必须有一个空格,以便将它们分隔
开来。但在标识符列表中标识符以逗号分隔。
在表达式中,标识符和数字用操作符或括
号分隔。空格、点号不能夹在标识符、关键字,
数字之间。如空格夹在标识符、数字之间将会
被看作两个标识符或数数字。以大写、小写或
大小写混合写的关键字被看作同一个关键字,
而以大写、小写或大小写混合写写的标识符将
被看作不同的标识符。
7.1.2 ASCII字符
在 ABEL-HDL语言中,其合法的
ASCII字符除了数字 0-9,大小写的
英文字母外,还包括空格符及下述符
号,
! @ # $? + & * ( )
[ ] ;, ?, –,, < > / ^ %
7.1.3 标识符
标识符是用合法的 ASCII字符按次序排
列定义的名字,其作用是标识器件、管脚,
节点、集合、输入输出信号、常量、宏以及
变量。所有的标识符必须符合下述规定,
1,标识符的长度不超过 31个字符 ;
2,标识符必须以字母或下划线开始 ;
3,标识符其他的宇母可采用大、小写字母,
数字及下划线 ;
4,标识符中不能包括空格符 ;
5,除保留标识符 (即关键宇 )外,标识符中同
一个字母的大、小写表示不同的含义 ;
6,除了合法的点扩展外,标识符中同一个字
母的大、小写表示不同的含义。
·
在 ABEL-HDL中保留的标识符称为关
键字,关键字不能用于命名器件、管脚,
节点、集合、宏或信号,而代表了这个字
所特指的功能。
7.1.4 常量
在 ABEL-HDL语言的逻辑描述中,常
量用于赋值语句、真值表和测试向量的表
达,有时也用于给某些标识符赋值,以使
该标识符在整个模块的逻辑描述中代表该
常量的值。
常量可以是数值常量,也可以是非数值
的特殊常量。
7.1.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]
}
7.1.6 注释
注释是对源文件的解释,注释以双引
号开始,以另一个双引号或行结束符号
结束,注释不能用于关键字之间。
例如,
, declaration section”
module Basic_logic;,gives the module a name(回车 )
7.1.7 数字
ABEL-HDL中的所有的数值运算精度
都是 32位, 合法的数值范围是 0~232-1。
数字可采用二进制, 八进制, 十进制
或十六进制, 它们分别以符号 ^b,^o,^d
或 ^h表示, 如不用符号则认为是十进制数 。
在 ABEL-HDL中数字还可用字符表示,
在字符之前加上单引号后, 即以字母 ASCII
码作为数值, 例如 ‘ a?=^h61,‘ ab?=^h6162。
7.1.8 字符串
字符串用于标题、模块及选项的表达,
也用于管脚、节点和属性的定义,它包含在
一对单引号中。如字符串中有单引号或反斜
杠,则必须在它们之前再加一反斜杠。字符
串可写几行,但不能超过 324个字符。如,
TITLE ?1 to 8 line demultiplexer?;
DMI?P16L8?;
7.1.9 运算符
ABEL-HDL支持四类基本运算,逻辑运
算、算术运算、关系运算及赋值运算。
1,逻辑运算
(1)非, ! 例 !A
(2)与, & 例 A&B
(3)或, # 例 A#B
(4)异或 $ 例 A$B
(5)同或 !$ 例 A!$B·
2,算术运算
(1)取负 - 例 -A
(2)加 + 例 A+B
(3)减 - 例 A-B
(4)乘 (无符号整数 ) * 例 A*B
(5)除 (无符号整数 ) / 例 A/B
(6)取模 (无符号整数 ) % 例 A%B
(7)左移 << 例 A<<B
(8)右移 >> 例 A>>B
3,关系运算
关系运算为无符号运算,其结果为位 (布尔
值 )。
(1)等于, == 例 A==B
(2)不等号, ! = 例 A!=B
(3)小于, < 例 A<B
(4)小于等于,<= 例 A<=B
(5)大于, > 例 A>B
(6)大于等于, >= 例 A>=B
例如,
2==3 值为 false
3<5 值为 true
-1>2 值为 false
4,赋值运算
组合输出为(非时钟赋值) =
寄存器输出为(时钟赋值),=
7.1.10 表达式和等式
表达式由标示符和运算符组成。在表达式
中可出现任何逻辑、算术或关系运算,表达式
中的运算次序按运算优先级决定,也可加括号
改变执行次序。
赋值运算仅用于等式,它将表达式的运算
结果通过等式赋给输出信号 (包括组合赋值和
时序 (寄存器 )赋值 )。一个信号可以被多次赋值,
而其最终结果是所有这些赋值的或,而不是最
后一次的赋值。
7.1.11 布尔方程语法
[WHEN 条件 THEN ] [! ]……[ENABLE] 元素 = 表达式; [ELSE 方程 ]
或者
[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)
7.1.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也可使用,=
7.1.13 集合
集合是作为一个独立单元进行操作的一组
信号或常量。它采用一个标识符,用方括号内
的一组信号或常量表示,其中的每一个信号或
常量称为集合的元素。
定义集合的方法有枚举法、界限符法或它
们的组合。例如,
ADD=[A5,A4,A3,A2,A1,A0] 为枚举法
ADD=[A5..A0] 为界限符法
ADD=[A5,A4,A3..A0] 为两种方法的组合
集合可以进行逻辑、加、减、关系运算。
逻辑运算是对集合中每一个元素作相应的运
算,因此如果需对两个或两个以上集合进行
运算时,这些参与运算的集合的元素数目必
须相同。但单个变量与集合进行逻辑运算为
该变量与集合的每个元素进行逻辑运算。加,
减、关系运算为对整个集合执行该运算。
例,(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];
其逻辑功能等效于
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);
7.1.14 变量及变量代换
哑变量:在宏定义、模块或指示字中可被真
实变量替代的标识符;
真实变量:用于宏定义、模块或指示字中的
变量。
在需要用真实变量取代哑变量的地方,
哑变量前要加一个问号“?”,以与其他标识符
区分开来。
如下面的宏定义
OR_EM MACRO(a,b,c) {?a #?b #?c};
中,a,b,c就是哑变量。下列方程式对 OR_EM
宏的宏引用
D=OR_EM(X,Y,Z);
其中 X,Y,Z是真实变量。
7.2 ABEL-HDL语言源文件的基本结构
7.2.1 引言
ABEL-HDL语言源文件由一个或多个相
互独立的模块构成,每一个模块包含了一个
完整的逻辑描述。源文件中的所有模块都可
以被 ABEL-HDL软件同时处理。
模块结构必须遵从以下原则,
1.模块开头为 module语句,结束必须用相应
的 end语句;
2,若使用 flash语句,必须为 module语句的第
一条语句;
3,若使用 title语句,必须为 flags语句后的第
一条语句。若没有 title语句,则必须为 module
语句后的第一条语句;
4,一个模块至少有一个定义段,模块中可按需
要以任意次序使用多个定义段。
例 1:设计一个模块,要求以 GAL6V8构成
一个两输入端的 "与 "门和一个两输入端的
,异或门,,设输入信号为 A,B,输出信号
为 X,Y,则 X=A·B,Y=A⊕ B。如在源文件
中仅有一个这样的模块,其源文件如下所示,
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
在这个模块中有标头段、定义段、逻辑
描述段、测试向量段及结束语句段五部分组
成。
在这五部分中,标头段为模块的开始 ;定
义段的定义部分指定或定义用于设计的器件,
信号、常量宏和库 ;逻辑描述段对所设计的逻
辑进行功能描述 ;测试向量段写出了测试向量,
用以验证所设计的逻辑 ;结束语句段表示一个
模块的结束。
此外在模块中还允许有选择地加上一
些指令。每一个模块只能有一个标头段,
它与结束语句段配对使用,而定义段、逻
辑描述段、测试向量段则可以任意次序重
复,定义语句必须紧跟标头或定义段的关
键字。
7.2.2 标头段
在例 1中标头段如下,
Module GATE
Options?_trace wave?
Title?example of gate?
标头段包括模块语句、选项和标题三个
元素组成。
1,模块语句
模块语句是必不可少的,其作用是
命名模块并标志模块的开始,它与结束
语句配对使用,同时也可指出是否利用
哑元。
模块语句的关键字是 Module,其格式
为,
Module modulename[(dummy_arg[,dummy_arg]…)]
其中 modulename为命名模块的合法标
识符,在本例中为 GATE。
dummy_arg是哑变量名称,如不利用哑
变量则可以略去。
若模块选用哑变量,则在使用语言处理
程序处理模块时,可将真实变量传给模块。
哑变量可为模块引用。模块中,凡带有“?”
的哑变量,语法分析程序都用真实变量将
其替代。例,
module my_example (A,B)
……
C=?B+?A;
……
end my_example
2,选项
选项为可选语句。其作用是语言处
理器控制源文件的处理。
选项的关键字是呻 Options,其格式
为 Options?sting?
string为选项字符串。
3,标题
标题为可选语句,其作用是给出模块
一个标题,此标题将作为语言处理程序所
生的编程器下载文件及设计编制文件的题
头。
标题的关键字是 Title,其格式为,
Title?string? string为标题字符串。
7.2.3 定义段
在例 1中定义段如下,
Declarations
gate DEVICE?GAL16V8?;
A,B PIN 1,2;
X,Y PIN 18,17;
定义段包括定义段关键字、器件定义,
信号定义、常量定义、宏定义、库定义等
元素。
定义段的关键字是 Declarations,
后面可跟任何合法的定义语句。定义段
的关键字允许定义段可在源文件的任何
一部分进行定义。如定义语句紧跟标头
段,则可略去淀义段关键字。
1,器件定义
器件定义是可选项,它的作用是将模
块中所使用的器件名与实际所采用的可编
程逻辑器件联系起来。
器件定义的关键字是 DEVICE,其格式
为 Device_id DEVICE real_device;
此表达式中,device_id为模块中所使
用的器件名,在本例中为 gate。
real_device为实际际所使用的某一个特定
可编程逻辑器件的型号,在本例中为
GAL16V8。值得注意的是 device_id必须是
合法的文件名,因为编程器装载文件的文件
名由 device_id加上扩展名, jde”产生的。
2,信号定义
信号定义包括了管脚定义、节点定义及
属性定义。其作用是定义信号,并可选择和
管脚及节点相联系。
节点 /管脚定义用于定义信号名,并将信
号同具体的器件节点 /管脚序数联系起来。如
不用 FUSASM和 JEDSIM处理文件,可以不
设定具体的器件节点 /管脚序数。
属性用于定义信号的特性,它既可
用于器件的节点 /管脚说明中,作为节
点 /管脚定义的一部分,也可设在器件
的节点 /管脚定义之后,作为一个独立
的定义部分。它们的关键字分别为
PIN,NODE,ISTYPE。
(1),管脚定义
管脚定义的格式为,
[!]pin_id[,[!]pin_id…]PIN[pin#[,pin#][ISTYPE?attributes?];
其中 [!]pin_id是逻辑设计中用于指示模块中
管脚的标识符,pin#为实际器件中的管脚 (可
为?,由系统分配 ),attributes为在节点可
编程的器件中用于指明属性的字符串,有以
下几种,
例,
!Clock,Rest,SI pin in U12,12,15,3;
这行代码将器件 U12的管脚 12,15,
3分别用标示符 Clock,Rest,SI来表示。
若模块中不止定义一个器件,必须用语
句中的 in项来指明器件。
例,
管脚的属性可由语句中的属性项
或 ISTYPE语句定义,比如
FO pin 13=?neg,reg?;
(2),节点定义
节点定义的格式为,
[!]node_id[,[!]node_id…]NODE[node#[,node#][IETYPE’attributes’];
其中 [!]node_id是逻辑设计中用于表示节点的
标识符,node #为实际器件中的节点号,
Attributes为在节点可编程的器件中用于指明
属性的字符串 (同管脚定义 )。
关键字 NODE并没有把信号限制
在器件上的内部节点上,当一个信号
用 NODE定义后,也可能被器件装配
器分配给器件的 I/O引脚上。
(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]
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 库文件中抽取出来,并被插到源
文件中。
7.2.4 逻辑描述段
在例 1中逻辑描述段如下,
Equations
X=A&B;
Y=A$B;
ABEL-HDL语言描述逻辑的方式有方程,
真值表、状态图、熔丝和异或因子,其中每
一种描述方法均以关键字或符号开始,以引
导某种描述的开始。
1.方程的形式
它以扩展的布尔方程来描述逻辑功能;
方程语句表示与某个器件相关的一组方
程的开始 ;
方程语句的关键字是 Epuations,其赋值
符为 =或,=,其中,=为组合逻辑的赋值操作符,
:=为时序逻辑的赋值操作符。
在方程中允许使用 WHEN-THEN-EKSE
语句。
方程的表达形式如下,
Equations
[WHEN condition THEN] [!] element = expression;
[ELSE equations];
或者
[WHEN condition THEN] equations;
[ELSE equations];
其中 condition 为任何合法的表达式。
element 命名一个或一组信号,
或一个实际集合的一个标识符。
equation 为任何合法的表达式。
例,
equations in IC13
A = B & C # A;
[W,Y]=3;
WHEN B THEN A=B;
ELSE A=C;
2,真值表的形式
它以表格的形式描述了输出与输入逻
辑之间的关系。真值表由表头向量和表格
组成。
(1),表头向量
它的关键字是 TRUTH RABLE,它的表达形式
为, 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;
其中 in ids为逻辑关系中的输入信号标识符。
out ids为逻辑关系中的输出信号标识符。
reg ids为逻辑关系中的寄存器型信号标
识符。
inputs为逻辑关系中的输入信号。
outputs为逻辑关系中的输出信号。
reg outs为信号寄存后的输出。
这三种形式中第一种适合于描述组合
逻辑,第二种适合于描述时序逻辑,第三
种适合于描述既包含组合逻辑又包含时序
逻辑的较复杂的逻辑电路。
符号 ->表示输入输出关系为组合型,
符号,>表示输入输出关系为寄存器型。
(2),真值表格式
格式由真值表的表头向量定义,真值表
本身即为按格式定义格式排列的一组输入
输出信号。真值表中使用的所用信号必须
是常量。
例,
定义带使能的异或门
truth_table inIC6 ([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表示,它们也
放在一个集合中。输出信号为一简单的组
合型信号。
该状态机工作时,在各状态之间循环。
当 A=0,B=1时,将 E置为低电平。
truth_table inIC17([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;
也可写为
truth_table inIC17([A,B]:>[C,D]->E)
0:>1->1;
1:>2->0;
2:>3->1;
3:>0->1;
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转移态方程。
例,
current_state=[a,b]; 常量定义
state_diagram inU15 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
若初态为 1( a=0,b=1),则经历的状态顺序为,1,4,2,3,2,4,1…
(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
if 表达式 then 状态表达式
else 状态表达式
可链接的数目没有限制,但最后一个语
句必须以分号结尾
(3),CASE-ENDCASE语句
语法,case [表达式,状态表达式 ];
[表达式,状态表达式 ];
[表达式,状态表达式 ];
… …
endcase;
例,
case a==0:1;
a==1:2;
a==2:3;
a==3:0;
endcase
(4),GOTO语句
语法,goto 状态表达式;
例,
goto x+y;
(5),WITH-ENDWITH语句
语法:转移语句 状态表达式 with 方程;
[方程 ];
… …
endwith;
转移语句:即 IF,ELSE或 CASE语句;
状态表达式:表示下一个状态;
方程:表示状态机的输出信号。
WITH-ENDWITH语句与 IF-THEN或 CASE
语句连用时,可使你根据转移状态写出相应的输出
方程
例,
case 5,if a==1 then 1 with X:=1;
Y:=0;
endwith;
else 2 with X:=0;
Y:=1;
endwith;
4,熔丝的形式
熔丝可以清楚地定义有关器材中的某一个
熔丝的状态,以决定器件的功能。它的关键
字是 FUSES,表达式为,
FUSES
fuse number seet = fuse value;
或者 FUSES
fuse number = fuse value;
5,异或因子的形式
异或因子部分可以指定一个布尔表达式,
这个表达式从简化的乘积形式方程中提取公
因子,并与这个方程异或。这样当一个设计
在具有异或门结构的器件中实现时,可以大
大地简化方程的表达式。
它的关键字是 XOR_Factors,表达式为,
XOR_Factors
Singal_name = xor_factors
式中 Singal_name为信号名,
xor_factors为异或表达式。
6,关于点扩展
点扩展的语言符号为 Singal_name.ext
信号点扩展类似于属性,它可以精确地描
述电路的行为,其主要应用是复杂的语言
情况。
7.2.5.测试向量段
在例 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;
其中 note为说明测试向量的字符串。
inputs表示输入信号或输入反馈信号
的一个或一组标识符。
outputs表示一个或一组器件输出信号
的一个或一组标识符。
invalues输入值或其集合。
outvalues由给定的输入得到的输出值
或其集合。
测试向量表的格式由表头格式所决定,
每一向量中的信号都按表头格式语句中的定
义进行排列。测试向量表中列出了各种输入
信号的组合及相应的输出信号,这些信号组
合可包含所有的组合形式或其中的一部分。
表中所有的信号值必须为定义过的常量、数
值常量或特殊常且如 '.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)
7.2.6 结束段
在例 1中结束段如下,
END GATE
它标志一个模块的结束。它的关键字
是 END,表示形式为,
END module_name;
7.2.7 指示字
在源文件中还允许有选择地加上一些
指令。这些指令被处理时,可能影响源文
件的内容。
指令的关键字是 @,表示形式为,·
@directive [option]
7.3 逻辑描述
ABEL-HDL语言描述逻辑的主要方
式是方程、真值表及状态图,用户可选
用最适合其设计的逻辑的一种方法或者
选用这三种方法中的两种或三种来描述。
7.3.1 方程的形式
它以扩展的布尔方程来描述逻辑功能。
根据采用的赋值符,这种方法可描述组合
逻辑或者时序逻辑。方程中便用的 WHEN
-THEN-ELSE语句则使逻辑描述更方便。
例 1:以方程的方法描述一个二输入、四
输出的译码器,设输入信号为 A1,A0,输
出信号为 Y0,Y1,Y2,Y3。
描述上述逻辑关系的真值表如表 1所示。
根据真值表能得到布尔方程如下,
Y0=A1·A0
Y1=A1·A0
Y2=A1·A0
Y3=A1·A0
表 1 2-4译码器的真值表
采用方程式进行描述,只需将上式中的
逻辑运算符用 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。
表 2 二选一多路选择器的真值表
根据上述真值表能得到方程式
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,则表示为,
EQUATIONS
YY=!S&AA#S&BB;
还可用下述形式描述,
EQUATIONS
WHEN S==0 THEN YY=AA;
ELSE YY=BB;
例 3:以方程的方法描述一个两位的并行计数
器,它的输出信号为 Q1,Q0。
描述时序电路可采用状态表 3。
根据状态表能得到状态方程式,
Q0N+1=Q0N
Q1N+1=Q1N·Q0N+Q1N·Q0N
表 3 两位并行计数器的状态表
采用方程式进行描述时,只需将上式
中的逻辑运算符用 ABEL-HDL所采用的运
算符替换即可,
EQUATIONS
Q0.CLK=CLK;
Q1.CLK=CLK;
Q0:=! Q0;
Q1:=! Q0&Q1 # Q0&! Q1;
例 4:以方程的方法描述一个具有置数功能
的两分频电路,它的输出信号为 Q0。当控
制信号 load为, 0”时,其功能为分频器。当
控制信号 load为, 1”时,则装人输入信号 A。
可采用状态表 4描述此电路。
表 4 两分频电路的状态表
根据上述状态表能得到状态方程式,
Q0N+1 = loadA + load·Q0N
采用布尔方程式进行描述时,只需将
上式的逻揖运算符用 ABEL-HDL所采用的
运算符替换即可。
7.3.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];
例 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,0]->[0];
[0,X,^b1111]->[0];
[1,0,X]->[0];
[1,^b1111,X]->[^b1111]
例 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];
例 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对其下一个状态
为 10。当 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。
描述上述状态机时,真值表的表头应采用
寄存器与组合的运算符。
TRUTH TABLE ( [S,Q1,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];
7.3.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]
例 11:以状态图的方法描述例 4所述
的两分频电路。
描述上述逻辑关系时,只需将状
态图以状态机语句进行描述
STATE_DIAGRAM[Q0]
STATE[0]
IF(LOAD &! A)
THEN[0]
ELSE[1];
STATE[1]
IF(LOAD&A)
THEN[1]
ELSE[0];
例 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;
A=1;
IF(S)
THEN[1,1]
ELSE[0,1];
STATE[0,1],
B=1;
A=0;
GOTO[1,1]
STATE[0,0],
B=0;
A=0;
IF(S)
THEN[1,1]
ELSE[1,0];
第七章 可编程逻辑器件设计
语言 ABEL
前言
7.1 ABEL-HDL语言的基本语法
7.2 ABEL-HDL语言源文件的基本结构
7.3 逻辑描述
前言
开发使用 PLD的系统时,应使用语言或
逻辑图来描述该 PLD的功能,并通过编译,
连接、适配,产生可对芯片进行编程的目
标艾件(该文件一股采用熔丝图格式,如
标准的 JED文件),然后再下载并写入芯
片中。
常用的可编程逻辑器件设计语言为
ABEL-HDL( ABEL硬件描述语言),
它是 DATA I/O公司开发的一种可编程
逻辑器件设计语言,它可支持绝大多数
可编程逻辑器件。
7.1 ABEL-HDL语言的基本语法
7.1.1 ABEL源文件构成
在用 ABEL-HDL进行逻辑设计时,描述
逻辑功能的源文件必须是符合 ABEL-HDL语
言语法规定的 ASII码文件。
ABEL-HDL源文件是由各种语句组成的,
这些语句是由 ABEL-HDL语言的基本符号构
成的,这些符号必须满足一定的格式才能正
确描述逻辑功能。语句的每一行最长为 150个
字符。在源文件的语句中标识符、关键字、数
字之间至少必须有一个空格,以便将它们分隔
开来。但在标识符列表中标识符以逗号分隔。
在表达式中,标识符和数字用操作符或括
号分隔。空格、点号不能夹在标识符、关键字,
数字之间。如空格夹在标识符、数字之间将会
被看作两个标识符或数数字。以大写、小写或
大小写混合写的关键字被看作同一个关键字,
而以大写、小写或大小写混合写写的标识符将
被看作不同的标识符。
7.1.2 ASCII字符
在 ABEL-HDL语言中,其合法的
ASCII字符除了数字 0-9,大小写的
英文字母外,还包括空格符及下述符
号,
! @ # $? + & * ( )
[ ] ;, ?, –,, < > / ^ %
7.1.3 标识符
标识符是用合法的 ASCII字符按次序排
列定义的名字,其作用是标识器件、管脚,
节点、集合、输入输出信号、常量、宏以及
变量。所有的标识符必须符合下述规定,
1,标识符的长度不超过 31个字符 ;
2,标识符必须以字母或下划线开始 ;
3,标识符其他的宇母可采用大、小写字母,
数字及下划线 ;
4,标识符中不能包括空格符 ;
5,除保留标识符 (即关键宇 )外,标识符中同
一个字母的大、小写表示不同的含义 ;
6,除了合法的点扩展外,标识符中同一个字
母的大、小写表示不同的含义。
·
在 ABEL-HDL中保留的标识符称为关
键字,关键字不能用于命名器件、管脚,
节点、集合、宏或信号,而代表了这个字
所特指的功能。
7.1.4 常量
在 ABEL-HDL语言的逻辑描述中,常
量用于赋值语句、真值表和测试向量的表
达,有时也用于给某些标识符赋值,以使
该标识符在整个模块的逻辑描述中代表该
常量的值。
常量可以是数值常量,也可以是非数值
的特殊常量。
7.1.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]
}
7.1.6 注释
注释是对源文件的解释,注释以双引
号开始,以另一个双引号或行结束符号
结束,注释不能用于关键字之间。
例如,
, declaration section”
module Basic_logic;,gives the module a name(回车 )
7.1.7 数字
ABEL-HDL中的所有的数值运算精度
都是 32位, 合法的数值范围是 0~232-1。
数字可采用二进制, 八进制, 十进制
或十六进制, 它们分别以符号 ^b,^o,^d
或 ^h表示, 如不用符号则认为是十进制数 。
在 ABEL-HDL中数字还可用字符表示,
在字符之前加上单引号后, 即以字母 ASCII
码作为数值, 例如 ‘ a?=^h61,‘ ab?=^h6162。
7.1.8 字符串
字符串用于标题、模块及选项的表达,
也用于管脚、节点和属性的定义,它包含在
一对单引号中。如字符串中有单引号或反斜
杠,则必须在它们之前再加一反斜杠。字符
串可写几行,但不能超过 324个字符。如,
TITLE ?1 to 8 line demultiplexer?;
DMI?P16L8?;
7.1.9 运算符
ABEL-HDL支持四类基本运算,逻辑运
算、算术运算、关系运算及赋值运算。
1,逻辑运算
(1)非, ! 例 !A
(2)与, & 例 A&B
(3)或, # 例 A#B
(4)异或 $ 例 A$B
(5)同或 !$ 例 A!$B·
2,算术运算
(1)取负 - 例 -A
(2)加 + 例 A+B
(3)减 - 例 A-B
(4)乘 (无符号整数 ) * 例 A*B
(5)除 (无符号整数 ) / 例 A/B
(6)取模 (无符号整数 ) % 例 A%B
(7)左移 << 例 A<<B
(8)右移 >> 例 A>>B
3,关系运算
关系运算为无符号运算,其结果为位 (布尔
值 )。
(1)等于, == 例 A==B
(2)不等号, ! = 例 A!=B
(3)小于, < 例 A<B
(4)小于等于,<= 例 A<=B
(5)大于, > 例 A>B
(6)大于等于, >= 例 A>=B
例如,
2==3 值为 false
3<5 值为 true
-1>2 值为 false
4,赋值运算
组合输出为(非时钟赋值) =
寄存器输出为(时钟赋值),=
7.1.10 表达式和等式
表达式由标示符和运算符组成。在表达式
中可出现任何逻辑、算术或关系运算,表达式
中的运算次序按运算优先级决定,也可加括号
改变执行次序。
赋值运算仅用于等式,它将表达式的运算
结果通过等式赋给输出信号 (包括组合赋值和
时序 (寄存器 )赋值 )。一个信号可以被多次赋值,
而其最终结果是所有这些赋值的或,而不是最
后一次的赋值。
7.1.11 布尔方程语法
[WHEN 条件 THEN ] [! ]……[ENABLE] 元素 = 表达式; [ELSE 方程 ]
或者
[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)
7.1.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也可使用,=
7.1.13 集合
集合是作为一个独立单元进行操作的一组
信号或常量。它采用一个标识符,用方括号内
的一组信号或常量表示,其中的每一个信号或
常量称为集合的元素。
定义集合的方法有枚举法、界限符法或它
们的组合。例如,
ADD=[A5,A4,A3,A2,A1,A0] 为枚举法
ADD=[A5..A0] 为界限符法
ADD=[A5,A4,A3..A0] 为两种方法的组合
集合可以进行逻辑、加、减、关系运算。
逻辑运算是对集合中每一个元素作相应的运
算,因此如果需对两个或两个以上集合进行
运算时,这些参与运算的集合的元素数目必
须相同。但单个变量与集合进行逻辑运算为
该变量与集合的每个元素进行逻辑运算。加,
减、关系运算为对整个集合执行该运算。
例,(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];
其逻辑功能等效于
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);
7.1.14 变量及变量代换
哑变量:在宏定义、模块或指示字中可被真
实变量替代的标识符;
真实变量:用于宏定义、模块或指示字中的
变量。
在需要用真实变量取代哑变量的地方,
哑变量前要加一个问号“?”,以与其他标识符
区分开来。
如下面的宏定义
OR_EM MACRO(a,b,c) {?a #?b #?c};
中,a,b,c就是哑变量。下列方程式对 OR_EM
宏的宏引用
D=OR_EM(X,Y,Z);
其中 X,Y,Z是真实变量。
7.2 ABEL-HDL语言源文件的基本结构
7.2.1 引言
ABEL-HDL语言源文件由一个或多个相
互独立的模块构成,每一个模块包含了一个
完整的逻辑描述。源文件中的所有模块都可
以被 ABEL-HDL软件同时处理。
模块结构必须遵从以下原则,
1.模块开头为 module语句,结束必须用相应
的 end语句;
2,若使用 flash语句,必须为 module语句的第
一条语句;
3,若使用 title语句,必须为 flags语句后的第
一条语句。若没有 title语句,则必须为 module
语句后的第一条语句;
4,一个模块至少有一个定义段,模块中可按需
要以任意次序使用多个定义段。
例 1:设计一个模块,要求以 GAL6V8构成
一个两输入端的 "与 "门和一个两输入端的
,异或门,,设输入信号为 A,B,输出信号
为 X,Y,则 X=A·B,Y=A⊕ B。如在源文件
中仅有一个这样的模块,其源文件如下所示,
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
在这个模块中有标头段、定义段、逻辑
描述段、测试向量段及结束语句段五部分组
成。
在这五部分中,标头段为模块的开始 ;定
义段的定义部分指定或定义用于设计的器件,
信号、常量宏和库 ;逻辑描述段对所设计的逻
辑进行功能描述 ;测试向量段写出了测试向量,
用以验证所设计的逻辑 ;结束语句段表示一个
模块的结束。
此外在模块中还允许有选择地加上一
些指令。每一个模块只能有一个标头段,
它与结束语句段配对使用,而定义段、逻
辑描述段、测试向量段则可以任意次序重
复,定义语句必须紧跟标头或定义段的关
键字。
7.2.2 标头段
在例 1中标头段如下,
Module GATE
Options?_trace wave?
Title?example of gate?
标头段包括模块语句、选项和标题三个
元素组成。
1,模块语句
模块语句是必不可少的,其作用是
命名模块并标志模块的开始,它与结束
语句配对使用,同时也可指出是否利用
哑元。
模块语句的关键字是 Module,其格式
为,
Module modulename[(dummy_arg[,dummy_arg]…)]
其中 modulename为命名模块的合法标
识符,在本例中为 GATE。
dummy_arg是哑变量名称,如不利用哑
变量则可以略去。
若模块选用哑变量,则在使用语言处理
程序处理模块时,可将真实变量传给模块。
哑变量可为模块引用。模块中,凡带有“?”
的哑变量,语法分析程序都用真实变量将
其替代。例,
module my_example (A,B)
……
C=?B+?A;
……
end my_example
2,选项
选项为可选语句。其作用是语言处
理器控制源文件的处理。
选项的关键字是呻 Options,其格式
为 Options?sting?
string为选项字符串。
3,标题
标题为可选语句,其作用是给出模块
一个标题,此标题将作为语言处理程序所
生的编程器下载文件及设计编制文件的题
头。
标题的关键字是 Title,其格式为,
Title?string? string为标题字符串。
7.2.3 定义段
在例 1中定义段如下,
Declarations
gate DEVICE?GAL16V8?;
A,B PIN 1,2;
X,Y PIN 18,17;
定义段包括定义段关键字、器件定义,
信号定义、常量定义、宏定义、库定义等
元素。
定义段的关键字是 Declarations,
后面可跟任何合法的定义语句。定义段
的关键字允许定义段可在源文件的任何
一部分进行定义。如定义语句紧跟标头
段,则可略去淀义段关键字。
1,器件定义
器件定义是可选项,它的作用是将模
块中所使用的器件名与实际所采用的可编
程逻辑器件联系起来。
器件定义的关键字是 DEVICE,其格式
为 Device_id DEVICE real_device;
此表达式中,device_id为模块中所使
用的器件名,在本例中为 gate。
real_device为实际际所使用的某一个特定
可编程逻辑器件的型号,在本例中为
GAL16V8。值得注意的是 device_id必须是
合法的文件名,因为编程器装载文件的文件
名由 device_id加上扩展名, jde”产生的。
2,信号定义
信号定义包括了管脚定义、节点定义及
属性定义。其作用是定义信号,并可选择和
管脚及节点相联系。
节点 /管脚定义用于定义信号名,并将信
号同具体的器件节点 /管脚序数联系起来。如
不用 FUSASM和 JEDSIM处理文件,可以不
设定具体的器件节点 /管脚序数。
属性用于定义信号的特性,它既可
用于器件的节点 /管脚说明中,作为节
点 /管脚定义的一部分,也可设在器件
的节点 /管脚定义之后,作为一个独立
的定义部分。它们的关键字分别为
PIN,NODE,ISTYPE。
(1),管脚定义
管脚定义的格式为,
[!]pin_id[,[!]pin_id…]PIN[pin#[,pin#][ISTYPE?attributes?];
其中 [!]pin_id是逻辑设计中用于指示模块中
管脚的标识符,pin#为实际器件中的管脚 (可
为?,由系统分配 ),attributes为在节点可
编程的器件中用于指明属性的字符串,有以
下几种,
例,
!Clock,Rest,SI pin in U12,12,15,3;
这行代码将器件 U12的管脚 12,15,
3分别用标示符 Clock,Rest,SI来表示。
若模块中不止定义一个器件,必须用语
句中的 in项来指明器件。
例,
管脚的属性可由语句中的属性项
或 ISTYPE语句定义,比如
FO pin 13=?neg,reg?;
(2),节点定义
节点定义的格式为,
[!]node_id[,[!]node_id…]NODE[node#[,node#][IETYPE’attributes’];
其中 [!]node_id是逻辑设计中用于表示节点的
标识符,node #为实际器件中的节点号,
Attributes为在节点可编程的器件中用于指明
属性的字符串 (同管脚定义 )。
关键字 NODE并没有把信号限制
在器件上的内部节点上,当一个信号
用 NODE定义后,也可能被器件装配
器分配给器件的 I/O引脚上。
(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]
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 库文件中抽取出来,并被插到源
文件中。
7.2.4 逻辑描述段
在例 1中逻辑描述段如下,
Equations
X=A&B;
Y=A$B;
ABEL-HDL语言描述逻辑的方式有方程,
真值表、状态图、熔丝和异或因子,其中每
一种描述方法均以关键字或符号开始,以引
导某种描述的开始。
1.方程的形式
它以扩展的布尔方程来描述逻辑功能;
方程语句表示与某个器件相关的一组方
程的开始 ;
方程语句的关键字是 Epuations,其赋值
符为 =或,=,其中,=为组合逻辑的赋值操作符,
:=为时序逻辑的赋值操作符。
在方程中允许使用 WHEN-THEN-EKSE
语句。
方程的表达形式如下,
Equations
[WHEN condition THEN] [!] element = expression;
[ELSE equations];
或者
[WHEN condition THEN] equations;
[ELSE equations];
其中 condition 为任何合法的表达式。
element 命名一个或一组信号,
或一个实际集合的一个标识符。
equation 为任何合法的表达式。
例,
equations in IC13
A = B & C # A;
[W,Y]=3;
WHEN B THEN A=B;
ELSE A=C;
2,真值表的形式
它以表格的形式描述了输出与输入逻
辑之间的关系。真值表由表头向量和表格
组成。
(1),表头向量
它的关键字是 TRUTH RABLE,它的表达形式
为, 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;
其中 in ids为逻辑关系中的输入信号标识符。
out ids为逻辑关系中的输出信号标识符。
reg ids为逻辑关系中的寄存器型信号标
识符。
inputs为逻辑关系中的输入信号。
outputs为逻辑关系中的输出信号。
reg outs为信号寄存后的输出。
这三种形式中第一种适合于描述组合
逻辑,第二种适合于描述时序逻辑,第三
种适合于描述既包含组合逻辑又包含时序
逻辑的较复杂的逻辑电路。
符号 ->表示输入输出关系为组合型,
符号,>表示输入输出关系为寄存器型。
(2),真值表格式
格式由真值表的表头向量定义,真值表
本身即为按格式定义格式排列的一组输入
输出信号。真值表中使用的所用信号必须
是常量。
例,
定义带使能的异或门
truth_table inIC6 ([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表示,它们也
放在一个集合中。输出信号为一简单的组
合型信号。
该状态机工作时,在各状态之间循环。
当 A=0,B=1时,将 E置为低电平。
truth_table inIC17([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;
也可写为
truth_table inIC17([A,B]:>[C,D]->E)
0:>1->1;
1:>2->0;
2:>3->1;
3:>0->1;
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转移态方程。
例,
current_state=[a,b]; 常量定义
state_diagram inU15 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
若初态为 1( a=0,b=1),则经历的状态顺序为,1,4,2,3,2,4,1…
(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
if 表达式 then 状态表达式
else 状态表达式
可链接的数目没有限制,但最后一个语
句必须以分号结尾
(3),CASE-ENDCASE语句
语法,case [表达式,状态表达式 ];
[表达式,状态表达式 ];
[表达式,状态表达式 ];
… …
endcase;
例,
case a==0:1;
a==1:2;
a==2:3;
a==3:0;
endcase
(4),GOTO语句
语法,goto 状态表达式;
例,
goto x+y;
(5),WITH-ENDWITH语句
语法:转移语句 状态表达式 with 方程;
[方程 ];
… …
endwith;
转移语句:即 IF,ELSE或 CASE语句;
状态表达式:表示下一个状态;
方程:表示状态机的输出信号。
WITH-ENDWITH语句与 IF-THEN或 CASE
语句连用时,可使你根据转移状态写出相应的输出
方程
例,
case 5,if a==1 then 1 with X:=1;
Y:=0;
endwith;
else 2 with X:=0;
Y:=1;
endwith;
4,熔丝的形式
熔丝可以清楚地定义有关器材中的某一个
熔丝的状态,以决定器件的功能。它的关键
字是 FUSES,表达式为,
FUSES
fuse number seet = fuse value;
或者 FUSES
fuse number = fuse value;
5,异或因子的形式
异或因子部分可以指定一个布尔表达式,
这个表达式从简化的乘积形式方程中提取公
因子,并与这个方程异或。这样当一个设计
在具有异或门结构的器件中实现时,可以大
大地简化方程的表达式。
它的关键字是 XOR_Factors,表达式为,
XOR_Factors
Singal_name = xor_factors
式中 Singal_name为信号名,
xor_factors为异或表达式。
6,关于点扩展
点扩展的语言符号为 Singal_name.ext
信号点扩展类似于属性,它可以精确地描
述电路的行为,其主要应用是复杂的语言
情况。
7.2.5.测试向量段
在例 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;
其中 note为说明测试向量的字符串。
inputs表示输入信号或输入反馈信号
的一个或一组标识符。
outputs表示一个或一组器件输出信号
的一个或一组标识符。
invalues输入值或其集合。
outvalues由给定的输入得到的输出值
或其集合。
测试向量表的格式由表头格式所决定,
每一向量中的信号都按表头格式语句中的定
义进行排列。测试向量表中列出了各种输入
信号的组合及相应的输出信号,这些信号组
合可包含所有的组合形式或其中的一部分。
表中所有的信号值必须为定义过的常量、数
值常量或特殊常且如 '.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)
7.2.6 结束段
在例 1中结束段如下,
END GATE
它标志一个模块的结束。它的关键字
是 END,表示形式为,
END module_name;
7.2.7 指示字
在源文件中还允许有选择地加上一些
指令。这些指令被处理时,可能影响源文
件的内容。
指令的关键字是 @,表示形式为,·
@directive [option]
7.3 逻辑描述
ABEL-HDL语言描述逻辑的主要方
式是方程、真值表及状态图,用户可选
用最适合其设计的逻辑的一种方法或者
选用这三种方法中的两种或三种来描述。
7.3.1 方程的形式
它以扩展的布尔方程来描述逻辑功能。
根据采用的赋值符,这种方法可描述组合
逻辑或者时序逻辑。方程中便用的 WHEN
-THEN-ELSE语句则使逻辑描述更方便。
例 1:以方程的方法描述一个二输入、四
输出的译码器,设输入信号为 A1,A0,输
出信号为 Y0,Y1,Y2,Y3。
描述上述逻辑关系的真值表如表 1所示。
根据真值表能得到布尔方程如下,
Y0=A1·A0
Y1=A1·A0
Y2=A1·A0
Y3=A1·A0
表 1 2-4译码器的真值表
采用方程式进行描述,只需将上式中的
逻辑运算符用 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。
表 2 二选一多路选择器的真值表
根据上述真值表能得到方程式
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,则表示为,
EQUATIONS
YY=!S&AA#S&BB;
还可用下述形式描述,
EQUATIONS
WHEN S==0 THEN YY=AA;
ELSE YY=BB;
例 3:以方程的方法描述一个两位的并行计数
器,它的输出信号为 Q1,Q0。
描述时序电路可采用状态表 3。
根据状态表能得到状态方程式,
Q0N+1=Q0N
Q1N+1=Q1N·Q0N+Q1N·Q0N
表 3 两位并行计数器的状态表
采用方程式进行描述时,只需将上式
中的逻辑运算符用 ABEL-HDL所采用的运
算符替换即可,
EQUATIONS
Q0.CLK=CLK;
Q1.CLK=CLK;
Q0:=! Q0;
Q1:=! Q0&Q1 # Q0&! Q1;
例 4:以方程的方法描述一个具有置数功能
的两分频电路,它的输出信号为 Q0。当控
制信号 load为, 0”时,其功能为分频器。当
控制信号 load为, 1”时,则装人输入信号 A。
可采用状态表 4描述此电路。
表 4 两分频电路的状态表
根据上述状态表能得到状态方程式,
Q0N+1 = loadA + load·Q0N
采用布尔方程式进行描述时,只需将
上式的逻揖运算符用 ABEL-HDL所采用的
运算符替换即可。
7.3.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];
例 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,0]->[0];
[0,X,^b1111]->[0];
[1,0,X]->[0];
[1,^b1111,X]->[^b1111]
例 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];
例 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对其下一个状态
为 10。当 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。
描述上述状态机时,真值表的表头应采用
寄存器与组合的运算符。
TRUTH TABLE ( [S,Q1,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];
7.3.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]
例 11:以状态图的方法描述例 4所述
的两分频电路。
描述上述逻辑关系时,只需将状
态图以状态机语句进行描述
STATE_DIAGRAM[Q0]
STATE[0]
IF(LOAD &! A)
THEN[0]
ELSE[1];
STATE[1]
IF(LOAD&A)
THEN[1]
ELSE[0];
例 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;
A=1;
IF(S)
THEN[1,1]
ELSE[0,1];
STATE[0,1],
B=1;
A=0;
GOTO[1,1]
STATE[0,0],
B=0;
A=0;
IF(S)
THEN[1,1]
ELSE[1,0];