ABEL-HDL语言简明教程 下载本文

ABEL-HDL语言简明教程

例如,下图给出了一种典型的D触发器的各个点后缀描述:

ISTYPE 'reg_d'

.OE

.SP (.AP)

PRESET .D D Q .CLK Q CLEAR

.SR (.AR)

.Q

.PIN

与上图相对应的D触发器的一段ABEL-HDL基本功能描述语句如下: d_d,cp,clear,preset PIN;

//d_d为D输入端信号,cp为触发时钟信号,clear为清零信号,preset为预置信号

q_d PIN ISTYPE 'reg_d';

//q_d为Q输出端信号,亦可写为ISTYPE 'reg'(参见2.2小节中的ISTYPE属性定义语句)

EQUATIONS

q_d.CLK=cp; //以该D触发器的Q输出端信号q_d作为触发器标识符 q_d.AR=clear; //指定clear为异步清零信号 q_d.AP=preset; //指定preset为异步预置信号

q_d:=d_d; //指定该D触发器的逻辑功能,在cp上升沿时输入端d_d置到输出端q_d 10. 变量及变量代换

变量的结构能用于宏、模块及命令中。ABEL-HDL语言支持两种变量,定义如下: ? 哑变量(相当于“哑元”、“形参”):宏、模块或指示字中可被真实变量替代的标识符。 ? 真实变量(相当于“实参”):用于宏、模块或指示字中的变量,真实变量可以替代哑变

量。一个真实变量可以是标识符、数字、字符串、运算符、集合或ABEL-HDL语言的其它元素。

可在宏说明中规定哑变量,也可在宏、模块或命令的体中规定哑变量(参见2.2小节ABEL-HDL源文件基本结构中的MACRO宏定义语句)。

例如:

OR_EM MACRO (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). 真实变量中空格有意义。

5

ABEL-HDL语言简明教程

2.2 ABEL-HDL源文件基本结构

一个完整的ABEL-HDL源文件由若干文件段组成,一般分为标题段、定义段、逻辑描述段、测试向量段和结束段。 1. 标题段

1). 模块语句:MODULE 格式为:MODULE 模块名

此语句是必须的。它是一个模块的头,最后还必须有一个End语句与之相配合。模块名是用户自定义的模块名称标识符。模块语句相当于原理图文件中的元件符号。 2). 标题语句:TITLE 格式为:TITLE '……'

此语句为可选,主要说明模块的内容、用途、作者、设计时间和地点等,单引号中为说明的内容。在编译时不处理此语句。 2. 定义段

该段规定设计中使用的信号名称及其属性,定义常量、宏等,说明底层模块和电原理图的设计逻辑,以及说明一个器件。每个模块至少有一个定义段,定义段一般在标题段后面。 1). DEVICE器件定义语句

格式为:器件标识符 DEVICE '实际器件';

其中,实际器件为所代表的实际器件的工业型号,用字符串表示。在ispLEVER/ispDesignEXPERT/ISP Synario软件中所使用的实际器件是在器件列表框中选择的,故器件定义语句可以省略。 2). PIN管脚定义语句

格式为:[!]信号名[,[!]信号名…] PIN [管脚号[,管脚号…]] [ISTYPE '属性[,属性…]'];

各信号是能与模块外部有输入输出关系的信号。信号缺省为高电平有效,前面加“!”表示该信号为低电平有效,各信号名与具体ISP器件管脚号对应。如果不希望预先设定(锁定)信号的管脚位置,则关键字PIN后面的管脚号可以不写。例如: CLK,I3,I2,I1,I0 PIN 11,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 锁存器(电平触发)

6

ABEL-HDL语言简明教程

5). 常量定义语句

格式为:[常量名][,常量名…]=表达式[,表达式…];

常量是模块中保持常数值的标识符,它用“=”符号来规定。常量定义语句必须在定义段中或者在@CONST命令之后。 6). MACRO宏定义语句

格式为:宏名 MACRO ([哑变量[,哑变量…]]) {block};

宏说明语句定义一个宏。使用宏可将函数名包含于源文件中,而无需重复这段代码。 例如:

NAND3 MACRO (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];

7

ABEL-HDL语言简明教程

[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,B PIN ISTYPE 'reg'; Y,cp PIN; ab=[A,B]; EQUATIONS ab.clk=cp;

STATE_DIAGRAM ab STATE 0: Y=0; GOTO 1; STATE 1: Y=0; GOTO 2; STATE 2: Y=0; GOTO 3; STATE 3: Y=1; GOTO 0;

4. TEST_VECTORS测试向量段 格式为:

TEST_VECTORS ……

测试向量段是可选内容,以关键字TEST_VECTORS为段首。逻辑描述段描述的电路能否实现预期的逻辑功能,可由测试向量段来实现逻辑验证。在ispLEVER/ispDesignEXPERT/ISP Synario软件环境下,测试向量段最好作为一个单独的文件(.abv)来编写。

5. END结束段

格式为:END [模块名]

此语句是必需的。其中的模块名是可选项,但对于一个多模块的ABEL-HDL文件,模块名必须写明。

8