完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
AHDL语言是ALTERA公司开发的高效、易学的硬件描述语言,在Max+plusⅡ软件中使用,它比VHDL语言更有效。 一、AHDL 简介 一个AHDL逻辑设计至少必须包含一个分设计段(Subdesign Section)和一个逻辑设计段(Logic Section),其它段和语句是可选择的,AHDL的设计文件是用Max+PlusⅡ软件的文本编辑器编写的源程序(*.tdf) 下面介绍AHDL的一些语句。 1、常数叙述语句 该语句可以用一个字符串代表数字、算数表达式 例: CONSTANT UPPER_LIMIT = 130; CONSTANT BAR = 1 + 2 DIV 3 + LOG2(256); CONSTANT FOO = 1; CONSTANT FOO_PLUS_ONE = FOO + 1; 2、定义函数语句 该语句可以定义一个在分设计中使用函数, 例: DEFINE MAX(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", -- optional default value follows "=" sign WIDTH, AD_WIDTH = 8, NUMWORDS = 2^AD_WIDTH ); 4、函数描述语句 共有4种形式的逻辑函数可以供用户调用,它们是: Megafunction—具有复杂逻辑功能的巨功能模块,放在mega_LPM库中,可以供用户调用 Primitive—一些基本逻辑功能函数,可以直接调用 Macrofunction—具有高水平的逻辑宏功能模块,共有300多种,放在max2lib子目录中 State Machine—一种具有多个状态的时序电路,可以形成符号图形,用户可以调用 以上几种逻辑功能函数都可以以逻辑函数名和符号图形的方式被调用,在AHDL源文件中调用时要首先进行声明,见如下例子。 (1)参数化函数: FUNCTION lpm_add_sub(cin,dataa[LPM_WIDTH-1..0],datab[LPM_WIDTH-1..0], dd_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], and datab[LPM_WIDTH-1..0]; 关键字WITH后是参数表, 关键字RETURN后是输出口result[LPM_WIDTH-1..0], cout, and overflow (2)非参数化函数: FUNCTION compare (a[3..0], b[3..0]) RETURNS (less, equal, greater); 该函数名为compare,输入端口为a3, a2, a1, a0, b3, b2, b1, and b0. 关键字RETURN后是输出口less, equal, greater (3)状态机函数: 当输入和输出是状态机时,应该按照如下例子定义函数,在返回结果语句中加MACHINE关键字 FUNCTION ss_def (clock, reset, count) RETURNS (MACHINE ss_out); 5、最小位数选择语句 定义一组数据中的最小数位是否是MSB(most significant bit)或LSB(least significant bit) 例: OPTIONS BIT0 = MSB; 6、断言语句 该语句可以检验表达式、参数、数据、计算函数有效性和端口的使用情况。 例: ASSERT (WIDTH > 0) REPORT "Width (%) must be a positive integer" WIDTH SEVERITY ERROR HELP_ID INTVALUE; -- for internal Altera use only 在该例中,WIDTH>0是断言条件,若此条件不满足,将显示REPORT后的内容和SEVERITY后的错误等级。 7、分设计段 分设计段声明输入、输出和双向口 例: SUBDESIGN top ( foo, bar, clk1, clk2 : INPUT = VCC; a0, a1, a2, a3, a4 : OUTPUT; b[7..0] : BIDIR; ) 端口类型可以是: INPUT, OUTPUT, BIDIR, MACHINE INPUT, 或 MACHINE OUTPU 其中MACHINE INPUT或MACHINE OUTPUT口不能用于TDF的顶层,在端口类型说明后可以加端口当前电平—VCC或者是GND。 8、变量段 该段是声明和产生逻辑段中使用的变量的地方,如下是变量段的例子。 VARIABLE a, b, c : NODE; temp : halfadd; ts_node : TRI_STATE_NODE; IF DEVICE_FAMILY == "FLEX8000" GENERATE 8kadder : flex_adder; d,e : NODE; ELSE GENERATE 7kadder : pterm_adder; f,g : NODE; END GENERATE; (1)函数变量声明例: VARIABLE comp : compare; adder : lpm_add_sub WITH (LPM_WIDTH = 8); 该变量段声明comp为函数compare的引用变量,声明adder为函数lpm_add_sub的引用变量,一旦声明完毕,就意味着: 变量comp就是如下端口的代表: a[3..0], b[3..0] : INPUT; -- inputs to compare less, equal, greater : OUTPUT; -- outputs of compare 而变量adder是如下端口的代表: a[8..1], b[8..1] : INPUT; -- inputs of adder sum[8..1] : OUTPUT; -- outputs of adder 也就是如下的引用变量可以使用在当前的设计文件中: comp.a[], comp.b[], comp.less, comp.equal, comp.greater adder.dataa[], adder.datab[], adder.result[] (2)节点变量声明 AHDL 软件支持两种节点形式:NODE and TRI_STATE_NODE。 例: SUBDESIGN node_ex ( a, oe : INPUT; b : OUTPUT; c : BIDIR; ) VARIABLE b : NODE; t : TRI_STATE_NODE; BEGIN b = a; out = b % therefore out = a % t = TRI(a, oe); t = c; % t is bus of c and tri_stated a % 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 例: VARIABLE ff : TFF; 该变量一旦声明完毕,就可以使用如下变量: ff.t, ff.clk,ff.clrn,ff.prn,ff.q 对于只有一个输出的功能模块,可以简化使用。 DFF的功能说明为: FUNCTION DFF(d, clk, clrn, prn) RETURNS (q);. 则对于如下的变量段,逻辑段的意思是a.d = b.q; VARIABLE a, b : DFF; BEGIN a = b; END; (4)状态机变量声明 例: VARIABLE ss : MACHINE OF BITS (q1, q2, q3) WITH STATES ( 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语句 例: CASE f[].q IS WHEN H"00" => addr[] = 0; s = a & b; WHEN H"01" => count[].d = count[].q + 1; WHEN H"02", H"03", H"04" => f[3..0].d = addr[4..1]; WHEN OTHERS => f[].d = f[].q; END CASE; (4)缺省叙述语句 该语句指定真值表中变量的缺省值, 例: BEGIN DEFAULTS a = VCC; END DEFAULTS; IF y & z THEN a = GND; END IF; END; (5)IF THEN语句 例: IF a[] == b[] THEN c[8..1] = H "77"; addr[3..1] = f[3..1].q; f[].d = addr[] + 1; ELSIF g3 $ g4 THEN f[].d = addr[]; ELSE d = VCC; END IF; (6)FOR GENERATE 语句 例: CONSTANT NUM_OF_ADDERS = 8; SUBDESIGN 4gentst ( 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; FOR i IN 1 TO NUM_OF_ADDERS GENERATE c = a $ b $ carry_out; % Full Adder % carry_out[i+1] = a & b # carry_out & (a $ b); END GENERATE; cout = carry_out[NUM_OF_ADDERS+1]; END; (7)真值表语句 该语句用于指定组合逻辑和状态机的输入和输出行为。 例: 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; END TABLE; 该例中,a0和f[4..1].q 是输入,f[4..1].d和control是输出, 二、AHDL中的语言元素 1、AHDL中的保留关键字 AHDL语言建议用大写字母书写如下关键字: AND FUNCTION OUTPUT ASSERT GENERATE PARAMETERS BEGIN GND REPORT BIDIR HELP_ID RETURNS BITS IF SEGMENTS BURIED INCLUDE SEVERITY CASE INPUT STATES CLIQUE IS SUBDESIGN CONNECTED_PINS LOG2 TABLE CONSTANT MACHINE THEN DEFAULTS MOD TITLE DEFINE NAND TO DESIGN NODE TRI_STATE_NODE DEVICE NOR VARIABLE DIV NOT VCC ELSE OF WHEN ELSIF OPTIONS WITH END OR XNOR FOR OTHERS XOR 2、 保留识别符 AHDL中的保留识别符: CARRY JKFFE SRFFE CASCADE JKFF SRFF CEIL LATCH TFFE DFFE LCELL TFF DFF M CELL TRI EXP MEMORY USED FLOOR OPENDRN WIRE GLOBAL SOFT X 3、AHDL中运算符
4、AHDL中的组 具有相同类型的端口可以形成一个组,该组可以有256个成员“BIT”, 如下的组虽然表达方式不同,但实际是同一个组。 b[5..0] ;(b5, b4, b3, b2, b1, b0) ;b[] 5、AHDL中的数 二进制例: B"0110X1X10" 八进制例: Q"4671223" 十六进制例: H"123AECF"
6、AHDL中的算数表达式
7、巨功能模块(LPM功能) Mega功能模块列表: 门类: lpm_and ;lpm_inv ;lpm_bustri ;lpm_mux ;lpm_clshift ;lpm_or ;lpm_constant lpm_xor ;lpm_decode ; mux ; busmux 运算类: lpm_abs ;lpm_counter ;lpm_add_sub ;lpm_mult ;lpm_compare 存储类: csfifo ;lpm_ram_dq ;csdpram ;lpm_ram_io ;lpm_ff lpm_rom lpm_latch lpm_dff (for backward compatibility only) lpm_shiftreg lpm_tff (for backward compatibility only) 其它类: clklock pll ntsc 核心类: a16450 a8255 a6402 fft a6850 rgb2ycrcb a8237 ycrcb2rg b a8251 具体的功能块输入输出信号见Max+plusⅡ软件帮助。 8、老逻辑功能块(Old-Style Macrofunctions)和宏功能块(Macrofunction) 功能模块:
具体的功能块输入输出信号见Max+plusⅡ软件帮助。
9、基本逻辑功能块(Primitives) 缓冲器类:
触发器和琐存器类:
输入输出端口类:
逻辑类:
具体的功能块的功能和输入输出信号见Max+plusⅡ软件帮助。 三、AHDL语言设计步骤 第一步:选File/Project/Name菜单建立项目名。 第二步:选File/New菜单,并选text Editor条目,进入文本编辑窗,然后输入电路设计文件。 第三步:选File/Project/Save & Check 菜单将文件存盘并检查文件的正确性。 第四步:选Assign/Device菜单,在指定器件窗口指定MAX7000S系列,并选EPM7128SLC84-15器件。 第五步:选Assign/Global Project Logic Synthesis菜单,指定逻辑综合的类型为FAST。 第六步:选Max+plus2/Floorplan Editor 菜单,将设计文件的输入和输出引脚赋予实际器件。 第七步:选File/Project/Save & Compile 菜单,编译设计文件。 第八步:选Max+plus2/Time Analyzer 菜单,在Delay Matrix 查看时间特性。 第九步:若有下载硬件,就可以选Max+plus2/Programmer菜单进行配置下载,然后在硬件环境中观察设计的正确性,若无硬件环境就只能进行功能仿真,进行第十一步。 第十步:选Max+plus2/waveform Editor菜单,编辑输入信号波形(在波形编辑窗口,选Node/Enter Nodes from SNF菜单将输入和输出端口凋入,然后再编辑)。 第十一步:选Max+plus2/Simulator 菜单进行行为访真。 第十二步:观察仿真结果,研究设计的正确性。 说明:若使用已经编写完毕的文件,选File/Open打开文件后,一定用File/Project/Set Project to Current file菜单将当前打开的文件设置为当前项目。 注:分设计题目必须和文件名称相同。 |
||
相关推荐
1 个讨论
|
||
好东西
|
|
|
|
|
|
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-5-14 23:35 , Processed in 0.476815 second(s), Total 36, Slave 30 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号