ABELHDL语言.docx
《ABELHDL语言.docx》由会员分享,可在线阅读,更多相关《ABELHDL语言.docx(14页珍藏版)》请在冰豆网上搜索。
ABELHDL语言
ABEL-HDL语言简明教程
一.ABEL-HDL简介
ABEL-HDL(ABELHardwareDescriptionLanguage)语言是一种层次化的硬件描述语言,它支持多种行为级输入形式,其中包括逻辑方程式、状态图和真值表等。
ABEL编译器和ispLEVER/ispDesignEXPERT/ISPSynario版本软件中的ABEL-HDL编译器可通过仿真对ABEL-HDL语言设计进行功能验证。
此后,编译器在PLD或FPGA等可编程IC上实现此设计。
ABEL-HDL设计还可以通过标准格式的设计传输文件转移到其它设计环境中去使用。
二.ABEL-HDL语法
ABEL-HDL源文件中的每一行必须符合以下语法规则:
一行最多为150个字符长。
每一行可用按回车键来结束;除开始、结束、标题等语句外,多以分号“;”结束。
不同的关键字、标识符和数之间最少要用一个空格隔开。
在同一关键字、数、运算符或标识符中不可嵌入空格和句点。
关键字及特殊常量可用大写、小写或大小写字母混合方式键入,关键字及特殊常量与大小写无关。
一般标识符也可以是大写、小写或大小写字母混用,但必须注意:
一般标识符与大小写有关,这点在编写程序时要特别小心,极易出错。
ABEL-HDL基本语法
1.标识符
标识符(用户提供的名字和标号)用于标识下列各项的名称:
器件(P16V8R)
器件引脚及节点(LD,Q3,Q2,Q1,Q0,N_1)
功能块({A&B&C})
集合([Q3..Q0])
输入或输出信号(I3,I2,I1,I0,Q3,Q2,Q1,Q0)
常量(H,L,.X.,.C.)
宏(NAND3)
哑变量(A,B,C)
不管标识符描述的是什么,其规则和限制是相同的:
1).标识符最长为31个字符。
2).标识符必须以一个字母或下划线开头。
3).除标识符的第一个字符外,其余字符均可以是大小写字母、数字,波浪线(~)和下划线(_)。
4).在标识符中不得出现空格,可使用下划线或大写字母来区分一个标识符中的各个字词。
5).除保留的标识符(即关键字和特殊常量)外,标识符与字母大小写有关,即大小写字母的含义不同。
6).除了合法的点后缀(或称为点扩展名,参见“基本逻辑器件的描述”)外,在标识符中不能用句号。
注意以下几点:
标识符应该做到“见名知意”,如And_In1,And_In2,表示二个输入与门的二个输入信号。
标识符应简单明了,易于区分,避免使用大量相似的标识符。
一个标识符如用几个单词组成,则各单词之间宜用下划线或大小写字符来区分,以便阅读。
如利用标识符THIS_IS_A_COUNTER比利用标识符THISISACOUNTER就更容易阅读和理解。
使用标识符,需要特别注意:
关键字在编程时不得用来给器件、引脚、节点、数组常量、集合、宏或信号命名。
2.特殊常量
在赋值语句、真值表和测试向量中,用户可使用常量;也可将一常量赋给标识符,并在整个模块中用此标识符代表该常量。
常量的值可以是数值,也可以是非数值的特殊常量(或称为专用常量,是一种特殊的标识符)。
常用的特殊常量有:
H逻辑高电平
L逻辑低电平
.C.时钟输入(低电平-高电平-低电平转换)
.K.时钟输入(高电平-低电平-高电平转换)
.U.时钟上升沿(低电平-高电平转换)
.D.时钟下降沿(高电平-低电平转换)
.X.任意值
.Z.高阻态
3.运算符
ABEL-HDL语言的运算符分为四种基本类型:
逻辑运算符、算术运算符、关系运算符及赋值运算符,下面对它们进行说明:
1).逻辑运算符:
逻辑代数中的各种逻辑运算如与、或、非、异或等,在ABEL-HDL语句中均有专门的符号,如下所示:
运算符
定义
举例
逻辑代数中的含义
!
非
!
A
Ā
&
与
A&B
A·B
#
或
A#B
A+B
$
异或
A$B
AB
!
$
同或
A!
$B
A⊙B
2).算术运算符:
算术运算符定义了表达式中各项之间的算术关系。
移位操作运算符也属于此类中。
运算符
举例
说明
-
-A
求负数(补码)
-
A-B
减
+
A+B
加
*
A*B
乘
/
A/B
无符号整除
%
A%B
取模:
无符号整除的余数
<<
A<
A左移B位
>>
A>>B
A右移B位
注意:
“/”是无符号的取整除法,即其商为正整数。
用求模运算符“%”可得到除的余数。
移位操作执行无符号的逻辑移位;在右移过程中零由左边移入,而在左移过程中零由右边移入。
3).关系运算符:
比较一个表达式的两个项。
用关系运算符形成的表达式产生一个布尔真(True)或伪(False)值。
运算符
说明
==(两连写等号)
等于
!
=
不等于
<
小于
<=
小于等于
>
大于
>=
大于等于
所有的关系运算符都是无符号的。
在使用关系运算符时,一般总是使用括号“()”,以保证表达式的运算按希望的顺序进行。
4).赋值运算符:
赋值运算符一般在EQUATIONS语句段的方程式中使用,而不在表达式中出现。
组合型赋值(立即赋值)无延时地进行赋值,只要方程式算完就赋值;
寄存器型赋值(时钟赋值)则在与该输出相关的时钟信号的下一个时钟脉冲有效边沿到来时进行赋值。
运算符
说明
=
组合型赋值
:
=
寄存器型赋值
注意:
在《电子系统设计》第2章的RTL语言中,用“”表示时钟赋值,而用“:
=”表示立即赋值或定义命名变量。
4.表达式和方程式
表达式是标识符和运算符的结合,除赋值运算符不能在表达式中使用之外,其它运算符包括逻辑运算符、算术运算符、关系运算符都可以用于表达式中。
逻辑方程式Equations也称为布尔方程,表示输入信号和输出信号之间的逻辑关系。
所有运算符(包括赋值运算符在内)都可以用于方程式中。
5.块(block)
块是包括在花括号“{}”中的一段文本。
块常用于方程式、状态图、宏和命令中。
一个块中的文本可以是一行或多行。
例如:
不用块的表达式:
WHEN(Mode==S_Data)THENOut_data:
=S_in;
ELSEWHEN(Mode==T_Data)THENOut_data:
=T_in;
WHEN(Mode==S_Data)THENS_Valid:
=1;
ELSEWHEN(Mode==T_Data)THENT_Valid:
=1;
用块的表达式,以上语句可被简化:
WHEN(Mode==S_Data)THEN{Out_data:
=S_in;S_Valid:
=1;}
ELSEWHEN(Mode==T_Data)THEN{Out_Data:
=T_in;T_Valid:
=1;}
6.集合(set)
集合是信号及常量的汇集。
集合简化了ABEL-HDL语言的逻辑描述和测试向量,它允许把一组信号用一个名字来引用。
由逗号或范围运算符“..”分开的常量及信号清单,再用方括号将其括起来,即可表示一个集合。
例如:
MultiOut及Select集合定义为:
MultiOut=[B0,B1,B2,B3,B4,B5,B6,B7];Select=[S2,S1,S0];
以上集合也可用“..”来表示:
MultiOut=[B0..B7];Select=[S2..S0];
用“..”来定界范围的标识符必须有兼容(形式相似)的名字,它们必须以相同的字母开头,以数字结束,例如上面的B0、B1、B2等。
注意:
集合所支持的运算符有限,它支持大多数逻辑运算符、关系运算符和赋值运算符,但仅支持算术运算符中的加“+”、减“”、取负(取补码)“”。
7.字符和数
ABEL-HDL语言的字符由ASCII字符组成,可以使用大小写字母及101键盘使用的大部分字符:
a~z小写字母
A~Z大写字母
0~9数字
空格符
制表符
!
@#$+&*()-_=+[]{};:
'"`\|,<>./^%
总共有96个。
字符可用于标识符、字符串和注释。
8.注释
注释是使源文件易懂的另一种方法。
用户可用如下方式进行注释:
1).用一双引号“"”开始,以另一双引号或行结束来结束。
2).用一双斜杠“基本逻辑器件的描述
基本逻辑器件有门和触发器(在ABEL-HDL语言中,触发器统称为寄存器)。
门电路可直接用逻辑表达式表示,如:
Out1=A&B&!
C;语句表示一个与门。
寄存器需要时钟方程、输出方程、复位方程等一组方程才能完整地描述。
为了简洁,通常对一个寄存器只定义一个标识符,而对于寄存器的时钟信号、复位信号等则在该寄存器标识符后面加点后缀来表示。
下表给出了ABEL-HDL常用的点后缀:
点后缀
含义
点后缀
含义
.AP
异步寄存器置位
.AR
异步寄存器复位
.CLK
边沿触发器的时钟输入
.D
D触发器的激励输入
.FB
寄存器反馈
.J
JK触发器的J激励输入
.K
JK触发器的K激励输入
.LD
寄存器并行置数输入
.OE
输出使能
.LE
寄存器的锁存使能输入
.SP
同步寄存器置位
.SR
同步寄存器复位
在编程时,以上点后缀的方程要根据具体电路选用,没必要全用。
例如,下图给出了一种典型的D触发器的各个点后缀描述:
与上图相对应的D触发器的一段ABEL-HDL基本功能描述语句如下:
d_d,cp,clear,presetPIN;
变量及变量代换
变量的结构能用于宏、模块及命令中。
ABEL-HDL语言支持两种变量,定义如下:
哑变量(相当于“哑元”、“形参”):
宏、模块或指示字中可被真实变量替代的标识符。
真实变量(相当于“实参”):
用于宏、模块或指示字中的变量,真实变量可以替代哑变量。
一个真实变量可以是标识符、数字、字符串、运算符、集合或ABEL-HDL语言的其它元素。
可在宏说明中规定哑变量,也可在宏、模块或命令的体中规定哑变量(参见小节ABEL-HDL源文件基本结构中的MACRO宏定义语句)。
例如:
OR_EMMACRO(a,b,c){a#b#c};
定义了一个名为OR_EM的宏,它是三个变量的逻辑或,这些变量在宏定义中用哑变量a、b、c来表示;在大括号内的宏定义体中,哑变量前带上问号“”构成一个整体,表示需要用真实变量来代替这个整体。
例如:
D=OR_EM(X,Y,Z&L);
就表示用真实变量X、Y和Z&L来调用OR_EM宏,结果为D=X#Y#Z&L。
真实变量必须严格按其本身形式替代,其中的空格也不能忽略。
哑变量与真实变量的关系总结如下:
1).哑变量的位置是保留给真实变量的。
2).前面带问号的哑变量需用真实变量替代。
3).变量替代在检查源文件前完成。
4).真实变量中空格有意义。
ABEL-HDL源文件基本结构
一个完整的ABEL-HDL源文件由若干文件段组成,一般分为标题段、定义段、逻辑描述段、测试向量段和结束段。
1.标题段
1).模块语句:
MODULE
格式为:
MODULE模块名
此语句是必须的。
它是一个模块的头,最后还必须有一个End语句与之相配合。
模块名是用户自定义的模块名称标识符。
模块语句相当于原理图文件中的元件符号。
2).标题语句:
TITLE
格式为:
TITLE'……'
此语句为可选,主要说明模块的内容、用途、作者、设计时间和地点等,单引号中为说明的内容。
在编译时不处理此语句。
2.定义段
该段规定设计中使用的信号名称及其属性,定义常量、宏等,说明底层模块和电原理图的设计逻辑,以及说明一个器件。
每个模块至少有一个定义段,定义段一般在标题段后面。
1).DEVICE器件定义语句
格式为:
器件标识符Device'实际器件';
其中,实际器件为所代表的实际器件的工业型号,用字符串表示。
在ispLEVER/ispDesignEXPERT/ISPSynario软件中所使用的实际器件是在器件列表框中选择的,故器件定义语句可以省略。
2).PIN管脚定义语句
格式为:
[!
]信号名[,[!
]信号名…]PIN[管脚号[,管脚号…]][ISTYPE'属性[,属性…]'];
各信号是能与模块外部有输入输出关系的信号。
信号缺省为高电平有效,前面加“!
”表示该信号为低电平有效,各信号名与具体ISP器件管脚号对应。
如果不希望预先设定(锁定)信号的管脚位置,则关键字PIN后面的管脚号可以不写。
例如:
CLK,I3,I2,I1,I0PIN11,28,27,26,25;
3).NODE节点定义语句
格式为:
[!
]节点名[,[!
]节点名…]NODE[节点号[,节点号…]][istype'属性[,属性…]'];
节点定义语句与管脚定义语句结构类似。
节点定义用于说明模块中代表实际器件内部节点的标识符,或称为“伪管脚”,它表示外部管脚上不能得到的内部(局部)信号,但它对形成中间信号很有用。
4).ISTYPE属性定义语句
属性定义语句用于对其管脚及节点具有可编程特性的器件进行管脚及节点的属性定义,一般跟PIN或NODE语句连用。
下表是在ISTYPE标题下的属性(用单引号括起):
pos
正极性
neg
负极性
com(缺省值)
组合型(该信号与时钟无关)
reg
寄存器型(该信号与时钟同步)
reg_d
D型寄存器
reg_jk
JK型寄存器
reg_sr
RS型寄存器
reg_t
T型寄存器
reg_l
锁存器(电平触发)
5).常量定义语句
格式为:
[常量名][,常量名…]=表达式[,表达式…];
常量是模块中保持常数值的标识符,它用“=”符号来规定。
常量定义语句必须在定义段中或者在@CONST命令之后。
6).MACRO宏定义语句
格式为:
宏名MACRO([哑变量[,哑变量…]]){block};
宏说明语句定义一个宏。
使用宏可将函数名包含于源文件中,而无需重复这段代码。
例如:
NAND3MACRO(A,B,C){!
(A&B&C)};
就定义了一个宏。
如果引用该宏:
D=NAND3(Clock,Hello,Busy);
则得到的实际结果相当于:
D=!
(Clock&Hello&Busy);
3.逻辑描述段
完成了以上的定义后,用户可用一个或多个以下的表达方式来描述逻辑功能。
1).EQUATIONS方程语句
格式为:
EQUATIONS
……
方程语句表示一组布尔方程的开始。
方程用布尔函数来描述逻辑功能。
如下面的方程语句描述了2线-4线译码电路:
EQUATIONS
Y0=!
A2&!
A1;
Y1=!
A2&A1;
Y2=A2&!
A1;
Y3=A2&A1;
2).TRUTH_TABLE真值表语句
格式为:
TRUTH_TABLE(输入向量标识符->输出向量标识符)
输入向量->输出向量;
或者:
TRUTH_TABLE(输入向量标识符:
>输出向量标识符)
输入向量:
>输出向量;
或者:
TRUTH_TABLE(输入向量标识符:
>寄存器向量标识符->输出向量标识符)
输入向量:
>寄存器向量->输出向量;
其中,
“->”表示输入与输出(左与右的信号向量)关系为组合型
(与时钟无关,即左变化则右立即变化);
“:
>”表示输入与输出(左与右的信号向量)关系为寄存器型
(同步时序型,即左变化而右不立即变化,要等到下一时钟有效边沿时右才发生相应变化)。
如下面的真值表语句描述了一个组合逻辑电路4线-2线编码器:
TRUTH_TABLE([I3,I2,I1,I0]->[O1,O0])
[0,0,0,1]->[0,0];
[0,0,1,0]->[0,1];
[0,1,0,0]->[1,0];
[1,0,0,0]->[1,1];
3).STATE_DIAGRAM状态图语句
格式为:
STATE_DIAGRAM状态寄存器
[STATE状态表达式:
[方程式;…]状态转换描述语句;…]
STATE_DIAGRAM语句段包含对逻辑设计的状态描述。
其中的STATE_DIAGRAM语句用于定义状态描述中的状态机,而IF…THEN…ELSE、CASE和GOTO等状态转换描述语句则确定了状态机的运作。
状态寄存器是用于表示状态的信号向量,状态表达式定义某一状态开始转移的条件(即此时状态寄存器所具有的值),状态表达式后的方程式则给出当前状态下的输出;而在下一个时钟(有效边沿)到来时将执行后面的状态转换描述语句(即状态转移语句),使状态机转到下一个状态。
例如,下面是一个简单的四个状态随时钟节拍轮流转换的例子(同时输出变量Y在不同的状态有不同的值输出):
A,BPINISTYPE'reg';
Y,cppin;
ab=[A,B];
Equations
=cp;
STATE_DIAGRAMab
State0:
Y=0;Goto1;
State1:
Y=0;Goto2;
State2:
Y=0;Goto3;
State3:
Y=1;Goto0;
4.TEST_VECTORS测试向量段
格式为:
TEST_VECTORS
……
测试向量段是可选内容,以关键字TEST_VECTORS为段首。
逻辑描述段描述的电路能否实现预期的逻辑功能,可由测试向量段来实现逻辑验证。
在ispLEVER/ispDesignEXPERT/ISPSynario软件环境下,测试向量段最好作为一个单独的文件(.abv)来编写。
5.END结束段
格式为:
END[模块名]
此语句是必需的。
其中的模块名是可选项,但对于一个多模块的ABEL-HDL文件,模块名必须写明。