MAXPLUS软件的使用.docx
《MAXPLUS软件的使用.docx》由会员分享,可在线阅读,更多相关《MAXPLUS软件的使用.docx(34页珍藏版)》请在冰豆网上搜索。
![MAXPLUS软件的使用.docx](https://file1.bdocx.com/fileroot1/2022-11/16/b2a469c8-db5b-44b0-b7e8-fafee89c911e/b2a469c8-db5b-44b0-b7e8-fafee89c911e1.gif)
MAXPLUS软件的使用
3.5用AHDL语言设计数字系统
AHDL语言是ALTERA公司开发的高效、易学的硬件描述语言,在max+plus2软件中使用它比VHDL语言更有效。
3.5.1AHDL简介
一个AHDL逻辑设计至少必须包含一个分设计段(SubdesignSection)和一个逻辑设计段(LogicSection),
其它段和语句是可选择的,AHDL的设计文件是用Max+PlusⅡ软件的文本编辑器编写的源程序(*.tdf)
下面介绍AHDL的一些语句。
(1)常数叙述语句
该语句可以用一个字符串代表数字、算数表达式
例:
CONSTANTUPPER_LIMIT=130;
CONSTANTBAR=1+2DIV3+LOG2(256);
CONSTANTFOO=1;
CONSTANTFOO_PLUS_ONE=FOO+1;
(2)定义函数语句
该语句可以定义一个在分设计中使用函数,
例:
DEFINEMAX(a,b)=(a>b)?
a:
b;
SUBDESIGN
(
dataa[MAX(WIDTH,0)..0]:
INPUT;
datab[MAX(WIDTH,0)..0]:
OUTPUT;
)
BEGIN
datab[]=dataa[];
END;
此例中MAX函数保证最小的数据位宽度。
(3)参数叙述语句
该语句可以声明参数化巨功能模块和宏功能模块的一个或几个参数
例:
PARAMETERS
(
FILENAME="myfile.mif",--optionaldefaultvaluefollows"="sign
WIDTH,
AD_WIDTH=8,
NUMWORDS=2^AD_WIDTH
);
(4)函数描述语句
共有4种形式的逻辑函数可以供用户调用,它们是:
Megafunction—具有复杂逻辑功能的巨功能模块,放在mega_LPM库中,可以供用户调用
Primitive—一些基本逻辑功能函数,可以直接调用
Macrofunction—具有高水平的逻辑宏功能模块,共有300多种,放在max2lib子目录中
StateMachine—一种具有多个状态的时序电路,可以形成符号图形,用户可以调用
以上几种逻辑功能函数都可以以逻辑函数名和符号图形的方式被调用,在AHDL源文件中调用时要首先进行声明,见如下例子。
1)参数化函数:
FUNCTIONlpm_add_sub(cin,dataa[LPM_WIDTH-1..0],datab[LPM_WIDTH-1..0],add_sub)
WITH(LPM_WIDTH,LPM_REPRESENTATION,LPM_DIRECTION,ADDERTYPE,
ONE_INPUT_IS_CONSTANT)
RETURNS(result[LPM_WIDTH-1..0],cout,overflow);
该函数名为lpm_add_sub,输入端口为cin,dataa[LPM_WIDTH-1..0],anddatab[LPM_WIDTH-1..0];
关键字WITH后是参数表,
关键字RETURN后是输出口result[LPM_WIDTH-1..0],cout,andoverflow
2)非参数化函数:
FUNCTIONcompare(a[3..0],b[3..0])
RETURNS(less,equal,greater);
该函数名为compare,输入端口为a3,a2,a1,a0,b3,b2,b1,andb0.
关键字RETURN后是输出口less,equal,greater
3)状态机函数:
当输入和输出是状态机时,应该按照如下例子定义函数,在返回结果语句中加MACHINE关键字
FUNCTIONss_def(clock,reset,count)
RETURNS(MACHINEss_out);
(5)最小位数选择语句
定义一组数据中的最小数位是否是MSB(mostsignificantbit)或LSB(leastsignificantbit)
例:
OPTIONSBIT0=MSB;
(6)断言语句
该语句可以检验表达式、参数、数据、计算函数有效性和端口的使用情况。
例:
ASSERT(WIDTH>0)
REPORT"Width(%)mustbeapositiveinteger"WIDTH
SEVERITYERROR
HELP_IDINTVALUE;--forinternalAlterauseonly
在该例中,WIDTH>0是断言条件,若此条件不满足,将显示REPORT后的内容和SEVERITY后的错误等级。
(7)分设计段
分设计段声明输入、输出和双向口
例:
SUBDESIGNtop
(
foo,bar,clk1,clk2:
INPUT=VCC;
a0,a1,a2,a3,a4:
OUTPUT;
b[7..0]:
BIDIR;
)
端口类型可以是:
INPUT,OUTPUT,BIDIR,MACHINEINPUT,或MACHINEOUTPU
其中MACHINEINPUT或MACHINEOUTPUT口不能用于TDF的顶层,在端口类型说明后可以加端口当前电平—VCC或者是GND。
(8)变量段
该段是声明和产生逻辑段中使用的变量的地方,如下是变量段的例子。
VARIABLE
a,b,c:
NODE;
temp:
halfadd;
ts_node:
TRI_STATE_NODE;
IFDEVICE_FAMILY=="FLEX8000"GENERATE
8kadder:
flex_adder;
d,e:
NODE;
ELSEGENERATE
7kadder:
pterm_adder;
f,g:
NODE;
ENDGENERATE;
1)函数变量声明例:
VARIABLE
comp:
compare;
adder:
lpm_add_subWITH(LPM_WIDTH=8);
该变量段声明comp为函数compare的引用变量,声明adder为函数lpm_add_sub的引用变量,一旦声明完毕,就意味着:
变量comp就是如下端口的代表:
a[3..0],b[3..0]:
INPUT;--inputstocompare
less,equal,greater:
OUTPUT;--outputsofcompare
而变量adder是如下端口的代表:
a[8..1],b[8..1]:
INPUT;--inputsofadder
sum[8..1]:
OUTPUT;--outputsofadder
也就是如下的引用变量可以使用在当前的设计文件中:
comp.a[],comp.b[],comp.less,comp.equal,comp.greater
adder.dataa[],adder.datab[],adder.result[]
2)节点变量声明
AHDL软件支持两种节点形式:
NODEandTRI_STATE_NODE。
例:
SUBDESIGNnode_ex
(
a,oe:
INPUT;
b:
OUTPUT;
c:
BIDIR;
)
VARIABLE
b:
NODE;
t:
TRI_STATE_NODE;
BEGIN
b=a;
out=b%thereforeout=a%
t=TRI(a,oe);
t=c;%tisbusofcandtri_stateda%
END;
如下的端口和功能模块能连接三态节点(TRI_STATE_NODE):
TRI三态功能模块
输入端口(INPUT)端口从高层向下
输出或双向口(OUTPUT,BIDIR)从低层向上
当前文件中的双向口(BIDIR)
当前文件中的三态节点TRI_STATE_NODE
3)寄存器变量声明
该声明用于声明寄存器:
D型:
DFF,DFFE,
T型:
TFF,TFFE
JK型:
JKFF,JKFFE,SRFF,SRFFE
琐存器:
LATCH
例:
VARIABLEff:
TFF;
该变量一旦声明完毕,就可以使用如下变量:
ff.t,ff.clk,ff.clrn,ff.prn,ff.q
对于只有一个输出的功能模块,可以简化使用。
DFF的功能说明为:
FUNCTIONDFF(d,clk,clrn,prn)RETURNS(q);.
则对于如下的变量段,逻辑段的意思是a.d=b.q;
VARIABLE
a,b:
DFF;
BEGIN
a=b;
END;
4)状态机变量声明
例:
VARIABLE
ss:
MACHINE
OFBITS(q1,q2,q3)
WITHSTATES(
s1=B"000",
s2=B"010",
s3=B"111");
该例的意思是:
状态机的名字是ss,状态位q1,q2,和q3是该机寄存器的输出,状态机的状态是s1,s2,和s3,并给出了当前状态值。
(9)逻辑段
在逻辑段中,说明设计文件的逻辑操作。
1)布尔方程
逻辑段中布尔方程用于表达节点之间的逻辑关系,该关系必须遵从逻辑规则。
例:
a[]=((c[]&-B"001101")+e[6..1])#(p,q,r,s,t,v);
表达式的左边可以是一个字符变量、端口和组,右边是布尔方程表达式。
2)布尔控制方程
该控制方程用于建立状态机的时钟、复位和时钟使能信号,见下例:
ss.clk=clk1;
ss.reset=a&b;
ss.ena=clk1ena;
该控制方程的格式为<状态机名>.<端口名>,所以该例中状态机名是ss,三个端口:
时钟、复位和使能。
3)CASE语句
例:
CASEf[].qIS
WHENH"00"=>
addr[]=0;
s=a&b;
WHENH"01"=>
count[].d=count[].q+1;
WHENH"02",H"03",H"04"=>
f[3..0].d=addr[4..1];
WHENOTHERS=>
f[].d=f[].q;
ENDCASE;
3)缺省叙述语句
该语句指定真值表中变量的缺省值,
例:
BEGIN
DEFAULTS
a=VCC;
ENDDEFAULTS;
IFy&zTHEN
a=GND;
ENDIF;
END;
4)IFTHEN语句
例:
IFa[]==b[]THEN
c[8..1]=H"77";
addr[3..1]=f[3..1].q;
f[].d=addr[]+1;
ELSIFg3$g4THEN
f[].d=addr[];
ELSE
d=VCC;