EDA教程 5.docx

上传人:b****1 文档编号:13724956 上传时间:2023-06-16 格式:DOCX 页数:39 大小:26.65KB
下载 相关 举报
EDA教程 5.docx_第1页
第1页 / 共39页
EDA教程 5.docx_第2页
第2页 / 共39页
EDA教程 5.docx_第3页
第3页 / 共39页
EDA教程 5.docx_第4页
第4页 / 共39页
EDA教程 5.docx_第5页
第5页 / 共39页
EDA教程 5.docx_第6页
第6页 / 共39页
EDA教程 5.docx_第7页
第7页 / 共39页
EDA教程 5.docx_第8页
第8页 / 共39页
EDA教程 5.docx_第9页
第9页 / 共39页
EDA教程 5.docx_第10页
第10页 / 共39页
EDA教程 5.docx_第11页
第11页 / 共39页
EDA教程 5.docx_第12页
第12页 / 共39页
EDA教程 5.docx_第13页
第13页 / 共39页
EDA教程 5.docx_第14页
第14页 / 共39页
EDA教程 5.docx_第15页
第15页 / 共39页
EDA教程 5.docx_第16页
第16页 / 共39页
EDA教程 5.docx_第17页
第17页 / 共39页
EDA教程 5.docx_第18页
第18页 / 共39页
EDA教程 5.docx_第19页
第19页 / 共39页
EDA教程 5.docx_第20页
第20页 / 共39页
亲,该文档总共39页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

EDA教程 5.docx

《EDA教程 5.docx》由会员分享,可在线阅读,更多相关《EDA教程 5.docx(39页珍藏版)》请在冰点文库上搜索。

EDA教程 5.docx

EDA教程5

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;

ENDIF;

4)FORGENERATE语句

例:

CONSTANTNUM_OF_ADDERS=8;

SUBDESIGN4gentst

a[NUM_OF_ADDERS..1],b[NUM_OF_ADDERS..1],cin:

INPUT;

c[NUM_OF_ADDERS..1],cout:

OUTPUT;

VARIABLE

carry_out[(NUM_OF_ADDERS+1)..1]:

NODE;

BEGIN

carry_out[1]=cin;

FORiIN1TONUM_OF_ADDERSGENERATE

c[i]=a[i]$b[i]$carry_out[i];%FullAdder%

carry_out[i+1]=a[i]&b[i]#carry_out[i]&(a[i]$b[i]);

ENDGENERATE;

cout=carry_out[NUM_OF_ADDERS+1];

END;

5)真值表语句

该语句用于指定组合逻辑和状态机的输入和输出行为。

例:

TABLE

a0,f[4..1].q=>f[4..1].d,control;

0,B"0000"=>B"0001",1;

0,B"0100"=>B"0010",0;

1,B"0XXX"=>B"0100",0;

X,B"1111"=>B"0101",1;

ENDTABLE;

该例中,a0和f[4..1].q是输入,f[4..1].d和control是输出,

3.5.2AHDL中的语言元素

(1)AHDL中的保留关键字

AHDL语言建议用大写字母书写如下关键字:

ANDFUNCTIONOUTPUT

ASSERTGENERATEPARAMETERS

BEGINGNDREPORT

BIDIRHELP_IDRETURNS

BITSIFSEGMENTS

BURIEDINCLUDESEVERITY

CASEINPUTSTATES

CLIQUEISSUBDESIGN

CONNECTED_PINSLOG2TABLE

CONSTANTMACHINETHEN

DEFAULTSMODTITLE

DEFINENANDTO

DESIGNNODETRI_STATE_NODE

DEVICENORVARIABLE

DIVNOTVCC

ELSEOFWHEN

ELSIFOPTIONSWITH

ENDORXNOR

FOROTHERSXOR

(2)保留识别符

AHDL中的保留识别符:

CARRYJKFFESRFFE

CASCADEJKFFSRFF

CEILLATCHTFFE

DFFELCELLTFF

DFFMCELLTRI

EXPMEMORYUSED

FLOOROPENDRNWIRE

GLOBALSOFTX

(3)AHDL中运算符

符号

功能

+

加号

-

==

数和串相等

!

NOT

!

=

不等于

>

大于

>=

大于等于

<

小于

<=

小于等于

&

AND

!

&

NAND

$

XOR

!

$

XNOR

#

OR

!

#

BOR

 

(4)AHDL中的组

具有相同类型的端口可以形成一个组,该组可以有256个成员“BIT”,

如下的组虽然表达方式不同,但实际是同一个组。

b[5..0]

(b5,b4,b3,b2,b1,b0)

b[]

(5)AHDL中的数

二进制例:

B"0110X1X10"

八进制例:

Q"4671223"

十六进制例:

H"123AECF"

(6)AHDL中的算数表达式

运算符

说明

优先级别

+

(unary)+1positive

1

-

(unary)-1negative

1

!

!

aNOT

1

^

a^2exponent

1

MOD

4MOD2modulus

2

DIV

4DIV2division

2

*

a*2multiplication

2

LOG2

LOG2(4-3)logarithmbase2

2

+

1+1addition

3

-

1-1subtraction

3

==

(numeric)5==5numericequality

4

==

(string)"a"=="b"stringequality

4

!

=

5!

=4notequalto

4

>

5>4greaterthan

4

>=

5>=5greaterthanorequalto

4

<

a

4

<=

a<=b+2lessthanorequalto

4

&

a&bAND

5

AND

aANDb

!

&

1!

&0NAND(ANDinverter)

5

NAND

1NAND0

$

1$1XOR(exclusiveOR)

6

XOR

1XOR1

!

$)

1!

$1XNOR(exclusiveNOR

6

XNOR

1XNOR1

#

a#bOR

7

OR

aORb

!

#

a!

#bNOR(ORinverter)

7

NOR

aNORb

?

(5<4)?

3:

4ternary

8

(7)巨功能模块(LPM功能)

Mega功能模块列表:

门类:

lpm_andlpm_inv

lpm_bustrilpm_mux

lpm_clshiftlpm_or

lpm_constantlpm_xor

lpm_decodemux

busmux

运算类:

lpm_abslpm_counter

lpm_add_sublpm_mult

lpm_compare

存储类:

csfifolpm_ram_dq

csdpramlpm_ram_io

lpm_fflpm_rom

lpm_latchlpm_dff(forbackwardcompatibilityonly)

lpm_shiftreglpm_tff(forbackwardcompatibilityonly)

其它类:

clklockpll

ntsc

核心类:

a16450a8255

a6402fft

a6850rgb2ycrcb

a8237ycrcb2rgb

a8251

具体的功能块输入输出信号见Max+plusⅡ软件帮助。

 

(8)老逻辑功能块(Old-StyleMacrofunctions)和宏功能块(Macrofunction)

分类列表:

功能模块

Adders

Latches

ArithmeticLogicUnits

Multipliers

Buffers

Multiplexers

Comparators

ParityGenerators/Checkers

Converters

RateMultipliers

Counters

Registers

Decoders

ShiftRegisters

DigitalFilters

StorageRegisters

EDAC

SSIFunctions

Encoders

True/ComplementI/OElements

FrequencyDividers

具体的功能块输入输出信号见Max+plusⅡ软件帮助。

(9)基本逻辑功能块(Primitives)

缓冲器类:

CARRY

OPNDRN

CASCADE

SOFT

EXPTRI

GLOBAL(SCLK)

WIRE(GDFsonly)

LCELL(MCELL)

触发器和琐存器类:

DFFSRFF

DFFE

SRFFE

JKFF

TFF

JKFFE

TFFE

LATCH

输入输出端口类:

BIDIR

INOUT

INPUT

IN

OUTPUT

OUT

BIDIRC(GDFsonly)

INPUTC(GDFsonly)

OUTPUTC(GDFsonly)

逻辑类:

AND

NOR

NOT

OR

XNOR

XOR

NAND

VCC(GDFsonly)

BAND(GDFsonly)

BNAND(GDFsonly)

BNOR(GDFsonly)

BOR(GDFsonly)

GND(GDFsonly)

具体的功能块的功能和输入输出信号见Max+plusⅡ软件帮助。

3.5.3AHDL的使用例子

(1)使用AHDL中的数

例1:

SUBDESIGNdecode1

address[15..0]:

INPUT;

chip_enable:

OUTPUT;

BEGIN

chip_enable=(address[15..0]==H"0370");

END;

在该例中当地址为十六进制数370时,输出端“chip_enable”输出高电平。

(2)常数和定义函数功能的使用

例1:

常数使用例。

CONSTANTIO_ADDRESS=H"0370";%常数%

SUBDESIGNdecode2

a[15..0]:

INPUT;

ce:

OUTPUT;

BEGIN

ce=(a[15..0]==IO_ADDRESS);

END;

例2:

定义函数使用例。

PARAMETERS(WIDTH);

DEFINEMAX(a,b)=(a>b)?

a:

b;%使用定义功能定义的函数,该函数保证端口位数的数量%

SUBDESIGNminport

dataA[MAX(WIDTH,0)..0]:

INPUT;

dataB[MAX(WIDTH,0)..0]:

OUTPUT;

BEGIN

dataB[]=dataA[];

END;

(3)布尔表达式的使用

例1:

SUBDESIGNboole1

a0,a1,b:

INPUT;

out1,out2:

OUTPUT;

BEGIN

out1=a1&!

a0;

out2=out1#b;

END;

例2:

具有一个声明的节点

SUBDESIGNboole2

a0,a1,b:

INPUT;

out:

OUTPUT;

VARIABLE

a_equals_2:

NODE;%被声明的节点%

BEGIN

a_equals_2=a1&!

a0;

out=a_equals_2#b;

END;

例3:

具有组的例。

OPTIONSBIT0=MSB;%指定BIT0是MSB%

CONSTANTMAX_WIDTH=1+2+3-3-1;%

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 表格模板 > 合同协议

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2