2.21k likes | 2.54k Views
EDA 技术基础. CPLD 技术及其应用. 硬件描述语言 — AHDL. 什么是 AHDL. A ltera H ardware D escription L anguage 由 Altera 公司开发 集成在 Altera 软件 Max+Plus II 中 描述硬件用语言而不是图形 容易建立 容易修改 对以下设计非常优越 复杂的组合逻辑 BCD 到 7 段编码转换 地址译码 状态机 其他 …. 什么是 AHDL 续 …. 和图形输入一样容易 和其他硬件描述语言一样强大
E N D
EDA技术基础 CPLD技术及其应用
什么是 AHDL • Altera Hardware Description Language • 由Altera公司开发 • 集成在Altera软件 Max+Plus II中 • 描述硬件用语言而不是图形 • 容易建立 • 容易修改 • 对以下设计非常优越 • 复杂的组合逻辑 • BCD到 7段编码转换 • 地址译码 • 状态机 • 其他…
什么是 AHDL 续… • 和图形输入一样容易 • 和其他硬件描述语言一样强大 • 如HDL (Hardware Description Language) • VHDL, Verilog HDL等
Type in your AHDL design file 怎样使用 ADHL 可使用任何文本编辑器创建文件 Altera软件 Max+Plus II提供文本编辑器
创建你的 AHDL 文件 续.
两处须同名 续. • 保存 ADHL 文件名为xxxx.TDF
将这一选项 On/Off 绿色表示注释 兰为ADHL 保留字 打开 Max+Plus II附加选项 • 有些内置的附加选项对工程师在使用AHDL设计进程中有所帮助 • 选项菜单中的语法色彩选项
可选元素 颜色选定 用户可自行修改颜色选项 • 使用选项菜单中的调色板,自定义如下颜色: • comments, illegal characters, megafunctions, macrofuncitons?
错误定位 双击错误信息 点击定位按钮 编译过程中的错误定位 • 很容易定位错误
If-then-else case-end case loop-end loop ????? 忘记怎么办? AHDL 模板
修改代码 修改代码 修改代码 使用AHDL模板
Title Statement • Include Statement • Constant Statement • Define Statement • Parameters Statement • Function Prototype Statement • Options Statement • Design Section • Subdesign Section • Variable Section • Logic Section 可选 必须 程序架构 AHDL
SUBDESIGN file_name • ( input_pin_name : INPUT; • input_bus_name[15..0] : INPUT; • output_pin_name : OUTPUT; • output_bus_name : OUTPUT; • ) • BEGIN • ouptut_pin_name = input_pin_name; • output_bus_name = input_bus_name; • END; 关键字 定义 I/O 口 逻辑项 AHDL 书写格式
使用数字 • 数字是用来定义布尔表达式、方程、算术表达式及参数中的常数值,AHDL支持十进制、二进制、八进制及十六进制数。 • SUBDESIGN decode1 • ( • address[15..0] : INPUT; • chip_enable : OUTPUT; • ) • BEGIN • chip_enable = (address[15..0] == H"0370"); • END; • 在此例中,十进制数15-0用来定义地址总线的比特位, 十六进制数H“0370”用来定义被译码的地址。
a0 a1 a2 a3 • SUBDESIGN decode1 • ( a[15..0] : INPUT; • chip_enable : OUTPUT; • ) • BEGIN • chip_enable = (a[15..0] == H“370"); • END; a4 a5 a6 a7 a8 chip_enable a9 a10 a11 a12 a13 a14 a15 AHDL设计1–地址译码器 Graph?
SUBDESIGN decode1 ( a[3..0] : INPUT; chip_enable : OUTPUT; ) BEGIN chip_enable = (a[3..0] == H"7"); END; a0 chip_enable a1 a2 a3 AHDL设计1–地址译码器 AHDL ? chip_enable = a0 & a1 & a2 & !a3
相关问题 –数字的使用 • Radix: Values: • Decimal <series of digits 0 to 9> • Binary B"<series of 0's, 1's, X's>" • (where X = "don't care") • Octal O"<series of digits 0 to 7>" or • Q"<series of digits 0 to 7>" • Hexadecimal X"<series from 0 to 9, A to F>" or • H"<series from 0 to 9, A to F>" • 例: B"0110X1X10" • Q"4671223" • H"123AECF"
a0 chip_enable a1 a2 a3 为什么使用 AHDL 而不用图形 • 易于修改 • 电路由代码表示 SUBDESIGN decode1 ( a[3..0] : INPUT; chip_enable : OUTPUT; ) BEGIN chip_enable = (a[3..0] == H"A"); END; Chip_enable = !a0 & a1 & !a2 & a3 仅改此处 修改费力 自动解释功能
更有甚者 SUBDESIGN decode1 ( a[3..0] : INPUT; chip_enable : OUTPUT; ) BEGIN chip_enable = (a[3..0] == B"1x0x"); END; 有些bit位在比较时可忽略
需要了解的运算符号 • Addition : + • Subtraction : - • Numeric Equality : == • Not equal to : != • Greater than : > • Greater than or equal to : >= • Less than : < • Less than or equal to : <= • Logical OR : # • Logical AND : &
赋值问题 a[7..0] = (H“2”, H“3”)------- 编译器翻译为 B“00001011” 而不是 B“00100011” a[7..0] = (B"0010", H"3") ------- 编译器翻译为 B“001011” 而不是 B“00100011”,位数不匹配,出错。 建议:用二进制写全。
CONSTANT IO_ADDRESS = H"0370"; SUBDESIGN decode2 ( a[15..0] : INPUT; ce : OUTPUT; ) BEGIN ce = (a[15..0] == IO_ADDRESS); END; 使用常数
定义CONSTANT在关键字SUBDESIGN之前 一处修改 CONSTANTIO_ADDRESS = H"A"; SUBDESIGN decode1 ( a[3..0] : INPUT; chip_enable : OUTPUT; ) BEGIN • chip_enable = (a[3..0] == IO_ADDRESS); • IF(a[3..0] == IO_ADDRESS) THEN ... END; 各处自动替换 使用常数功能
定义一个常数值 定义一个算法式 依靠前一定义值 有关常数的进一步定义 • Constant example CONSTANT IO_ADDRESS = H“70” CONSTANT FOO = 1+2*3 - LOG2(256); CONSTANT FOO_PLUS_one = FOO + 1;
以下示例定义常数 FAMILY,然后使用它在 Assert陈述中来检查现在的器件是否是 FLEX8000系列。 • PARAMETERS • ( • DEVICE_FAMILY % DEVICE_FAMILY is a predefined Altera parameter % • ); • CONSTANTFAMILY = "FLEX8000"; • SUBDESIGN strcmp • ( • a : INPUT; • b : OUTPUT; • ) • BEGIN • IF (DEVICE_FAMILY == FAMILY) GENERATE • ASSERT • REPORT"Detected compilation for FLEX8000 family" • SEVERITYINFO; • b = a; • ELSEGENERATE • ASSERT • REPORT"Detected compilation for % family" • DEVICE_FAMILY • SEVERITYERROR; • b = a; • ENDGENERATE; • END;
使用DEFINE定义求值函数 • PARAMETERS (WIDTH); • DEFINE MAX(a,b) = (a > b) ? a : b; • SUBDESIGN minport • ( • dataA[MAX(WIDTH,0)..0] : INPUT; • dataB[MAX(WIDTH,0)..0] : OUTPUT; • ) • BEGIN • dataB[] = dataA[]; • END; 使用求值函数
定义组 • 组可以用下列三中方式声明: • 1、一个单域组包含符号名或端口名,后随用方括弧括起的单域。例: a[4..1]。 • 一旦组被定义,[]就可用来简化定义整个域。 • 一个单数字可用来替换一个域,例: a[5],此时和a5等价。 • 2、一个双域组包含符号名或端口名,后随用方括弧括起的双域。例: d[6..0][2..0]。 • 双于域组被用来设计两维总线结构。一旦组被定义,[][]就可用来简化定义整个域。一个单独的节点可被命名为name[y][z]或 name y_z。 y和z为数字。 • 3、一个序列组包含一个符号名、端口和数字的列表 ,以逗号分隔,以圆括弧括起。例: (a, b, c)。单域和双域也可以列表用圆括弧括起或作为列表内容。例:(a、b、c[5..1])。 • 定义组示例: • b[5..0] • (b5, b4, b3, b2, b1, b0) • b[] • b[log2(256)..1+2-1] • b[2^8..3 mod 1] • b[2*8..8 div 2]
定义组 一个组(GROUP)最多包含256个成员或BITS,当作一个节点集看待,操作时当作一个整体。一个组可定义为单域名、双域名或序列域名形式。 例:单域名组 a[4..1]包含节点a4、a3、a2、a1。 双域名组 a[2..1][5..3]包含节点a2_5、a2_4、a2_3、a1_5、a1_4、a1_3。 序列域名 (a、b、c)包含节点a、b、c。 在布尔方程中,一个组可被赋予一个布尔表达式、其他组、一个单节点、VCC、GNG、1或0。在每一种情况中,组获得的值是不同的。 Options 说明可用于定义组中最低数字的比特位是MSB还是LSB。 1、一旦组被定义,[]就可用来简化定义整个域。例:a[4..1]可被缩写为a[],同样, b[5..4][3..2]可简写为 b[][]。 2、为避免混淆组名,在组名中禁止使用数字尾缀。例:编译器分不清组 q1[15..0]和 q11[15..0]。
组的定义–实例 OPTIONSBIT0 = MSB; CONSTANT MAX_WIDTH = 1+2+3-3-1; % MAX_WIDTH = 2 % SUBDESIGN group1 ( a[1..2], use_exp_in[1+2-2..MAX_WIDTH] : INPUT; d[1..2], use_exp_out[1+2*2-4..MAX_WIDTH] : OUTPUT; dual_range[5..4][3..2] : OUTPUT; ) BEGIN d[] = a[] + B"10"; use_exp_out[] = use_exp_in[]; dual_range[][] = VCC; END;