You are on page 1of 19

太原理工大学 夏路易

3.6 AHDL 使用例

例 1:组合逻辑设计
第一步:选 File/Project/Name 菜单建立项目名
第二步:选 File/New 菜单,并选 text Editor 条目,进入文本编辑窗,然后输入电路设计文
件如图 3.6.1 所示

图 3.6.1

第三步:选 File/Project/Save & Check 菜单将文件存盘并检查文件的正确性


第 四 步 : 选 Assign/Device 菜 单 , 在 指 定 器 件 窗 口 指 定 MAX7000 系 列 , 并 选
EPM7128CLC84-7 器件
第五步:选 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 菜单将当前打开的文件设置为当前项目。
分设计题目必须和文件名称相同。
143
太原理工大学 夏路易

该设计的仿真结果见图 3.6.2。

图 3.6.2

例 2:八位加减法器
设计文件见图 3.6.3。

图 3.6.3

144
太原理工大学 夏路易

仿真结果见图 3.6.4:

图 3.6.4

例 3:7 段译码器
电路设计文件如下:
% -a- %
% f| |b %
% -g- %
% e| |c %
% -d- %
% %
% 012345 6789AbCdEF %
% %
SUBDESIGN 7segment
(
i[3..0] : INPUT;
a, b, c, d, e, f, g : OUTPUT;
)
BEGIN
TABLE
i[3..0] => a, b, c, d, e, f, g;
H"0" => 1, 1, 1, 1, 1, 1, 0;
145
太原理工大学 夏路易

H"1" => 0, 1, 1, 0, 0, 0, 0;
H"2" => 1, 1, 0, 1, 1, 0, 1;
H"3" => 1, 1, 1, 1, 0, 0, 1;
H"4" => 0, 1, 1, 0, 0, 1, 1;
H"5" => 1, 0, 1, 1, 0, 1, 1;
H"6" => 1, 0, 1, 1, 1, 1, 1;
H"7" => 1, 1, 1, 0, 0, 0, 0;
H"8" => 1, 1, 1, 1, 1, 1, 1;
H"9" => 1, 1, 1, 1, 0, 1, 1;
H"A" => 1, 1, 1, 0, 1, 1, 1;
H"B" => 0, 0, 1, 1, 1, 1, 1;
H"C" => 1, 0, 0, 1, 1, 1, 0;
H"D" => 0, 1, 1, 1, 1, 0, 1;
H"E" => 1, 0, 0, 1, 1, 1, 1;
H"F" => 1, 0, 0, 0, 1, 1, 1;
END TABLE;
END;
该设计文件的仿真结果见图 3.6.5。

图 3.6.5
146
太原理工大学 夏路易

例 4:十六位 D 触发器组成的加法计数器
设计文件如下:
SUBDESIGN ahdlcnt
(clk, load, ena, clr, d[15..0] : INPUT;
q[15..0] : OUTPUT; )
VARIABLE
count[15..0] : DFF;
BEGIN
count[].clk = clk;
count[].clrn = !clr;
IF load THEN
count[].d = d[];
ELSIF ena THEN
count[].d = count[].q + 1;
ELSE
count[].d = count[].q;
END IF;
q[] = count[];
END;
该设计的仿真结果见图 3.6.6。

图 3.6.6
例 5:机械开关防跳动程序
147
太原理工大学 夏路易

当开关按下时经常会出现抖动,如下程序可以将抖动去掉。
SUBDESIGN debounce
(
clk : INPUT;
key_pressed : INPUT;
pulse : OUTPUT;
)

VARIABLE
count_reg[7..0] : DFF;
at_zero : NODE;
BEGIN
count_reg[].clk = clk;
count_reg[].prn = key_pressed; %将所有触发器置“1”%
count_reg[].d = count_reg[].q - (0,!at_zero); %触发器减计数%
pulse = count_reg[].q == h"01"; %当计数到 H”01”时发出单脉冲%
at_zero = count_reg[].q == h"00";%将计数器减“1“变成减”0“,保证不出现负数%
END;
该设计的仿真结果见图 3.6.7

图 3.6.7

例 6:地址译码器
该译码器在地址为 370h 时使输出信号 chip_enable 为高电平。
148
太原理工大学 夏路易

SUBDESIGN decode1
(
address[15..0] : INPUT;
chip_enable : OUTPUT;
)
BEGIN
chip_enable = (address[15..0] == H"0370");
END;
仿真结果见图 3.6.8。

图 3.6.8
例 7:图 3.6.9 显示一个译码器,该译码器将 0,1,2,3 四个信号译成 1,2,4,8 四个信

149
太原理工大学 夏路易

号。

图 3.6.9

该译码器仿真结果见图 3.6.10。

图 3.6.10
例 8:图 3.6.11 显示了一个译码设计文件,该译码器在它的任意输入状态时,输出一个特
定的数字“63”。

150
太原理工大学 夏路易

图 3.6.11
该设计的仿真结果见图 3.6.12。

图 3.6.12

例 9:计数器和译码器
该例中使用 INCLUDE 语句,调用老型号的逻辑功能模块 4 位计数器”4count”和四-十六线
分配器“16dmux”。
设计文件见图 3.6.13。

151
太原理工大学 夏路易

图 3.6.13

该设计的仿真结果见图 3.6.14。

图 3.6.14

例 10:扫描键盘
设计文件如下:
TITLE "Keyboard Encoder";

INCLUDE "74151"; %调用元器件说明%


INCLUDE "74154";
INCLUDE "4count";
FUNCTION debounce (clk, key_pressed) %调用例题 5%
RETURNS (pulse);

SUBDESIGN keyboard
(
clk : INPUT; % 50-KHz clock %
col[3..0] : INPUT; % keyboard columns %
row[3..0], d[3..0] : OUTPUT; % keyboard rows, key code %
strobe : OUTPUT; % key code is valid %
)

152
太原理工大学 夏路易

VARIABLE
key_pressed : NODE; %声明变量和节点%
mux : 74151;
decoder : 74154;
counter : 4count;
opencol[3..0] : TRI;

BEGIN
% 用译码器和三态门驱动键盘行扫描线 %
row[] = opencol[].out;
opencol[].in = GND;
opencol[].oe =!decoder.(o0n,o1n,o2n,o3n);
decoder.(b,a) = counter.(qd,qc);

% 使用分配器感觉键盘列 %
mux.d[3..0] = col[3..0];
mux.(b,a) = counter.(qb,qa);
key_pressed = !mux.y;

% 扫描键盘,并等待键压下产生键盘码%
counter.clk = clk;
counter.cin = !key_pressed;
d[] = counter.(qd,qc,qb,qa);

% 产生键盘码选通脉冲 %
strobe = debounce(clk, key_pressed);
END;

153
太原理工大学 夏路易

该设计的仿真结果见图 3.6.15。

图 3.6.15

例 11:状态机一
设计文件如下:
SUBDESIGN moore2
(
clk : INPUT;
reset : INPUT;
154
太原理工大学 夏路易

y : INPUT;
z : OUTPUT;
)
VARIABLE
ss: MACHINE WITH STATES (s0, s1, s2, s3);
zd: NODE;
BEGIN
ss.clk = clk;
ss.reset = reset;
z = DFF(zd, clk, VCC, VCC);
TABLE
% current current next next %
% state input state output %
ss, y => ss, zd;

s0, 0 => s0, 0;


s0, 1 => s2, 1;
s1, 0 => s0, 0;
s1, 1 => s2, 1;
s2, 0 => s2, 1;
s2, 1 => s3, 0;
s3, 0 => s3, 0;
s3, 1 => s1, 1;
END TABLE;
END;
该设计的仿真结果见图 3.6.16。

155
太原理工大学 夏路易

图 3.6.16

例 12:状态机二
该状态机的输出与时钟不同步。设计文件如下:
SUBDESIGN mealy
(
clk : INPUT;
reset : INPUT;
y : INPUT;
z : OUTPUT;
)
VARIABLE
ss: MACHINE WITH STATES (s0, s1, s2, s3);
BEGIN
ss.clk = clk;
ss.reset = reset;

TABLE
% current current current next %
% state input output state %
ss, y => z, ss;

s0, 0 => 0, s0;


s0, 1 => 1, s1;
s1, 0 => 1, s1;
s1, 1 => 0, s2;
s2, 0 => 0, s2;
s2, 1 => 1, s3;
s3, 0 => 0, s3;
s3, 1 => 1, s0;
END TABLE;
END;

该设计的仿真结果见图 3.6.17。
156
太原理工大学 夏路易

图 3.6.17
例 13:状态机三
SUBDESIGN recover
(
clk : INPUT;
go : INPUT;
ok : OUTPUT;
)
VARIABLE
sequence : MACHINE
OF BITS (q[2..0])
WITH STATES (
idle,
one,
two,
three,
four,
illegal1,
illegal2,
illegal3);
BEGIN
157
太原理工大学 夏路易

sequence.clk = clk;

CASE sequence IS
WHEN idle =>
IF go THEN
sequence = one;
END IF;
WHEN one =>
sequence = two;
WHEN two =>
sequence = three;
WHEN three =>
sequence = four;
WHEN OTHERS =>
sequence = idle;
END CASE;
ok = (sequence == four);
END;
在该状态机设计例中,由于采用三个触发器,共有 8 个状态,但有用的状态共 5 个,当
进入无用状态时,该状态机应该有确定的状态与之对应。在设计文件中 WHEN OTHERS
=>sequence = idle; 正是说明当进入无用状态时就转到 idle 状态。
该设计的仿真结果见图 3.6.18。

158
太原理工大学 夏路易

图 3.6.18

例 14:状态机四
使用 CASE 语句的状态机设计文件如下:
SUBDESIGN ss_def
(
clk, reset, count : INPUT;
ss_out[4..0] : OUTPUT;
)
VARIABLE
ss: MACHINE WITH STATES (s1, s2, s3, s4, s5);
BEGIN
ss_out[] = (s1,s2,s3,s4,s5);

CASE ss IS
WHEN s1=>
IF count THEN ss = s2; ELSE ss = s1; END IF;
WHEN s2=>
IF count THEN ss = s3; ELSE ss = s2; END IF;
WHEN s3=>
IF count THEN ss = s4; ELSE ss = s3; END IF;
WHEN s4=>
IF count THEN ss = s5; ELSE ss = s4; END IF;
WHEN s5=>
IF count THEN ss = s1; ELSE ss = s5; END IF;
END case;

ss.(clk, reset) = (clk, reset);


END;

159
太原理工大学 夏路易

该设计文件的仿真结果见图 3.6.19。

图 3.6.19

例 15:状态机五
步进马达控制器,信号 ccw 和 cw 控制电机正反转,设计文件如下:
SUBDESIGN stepper
(
clk, reset : INPUT;
ccw, cw : INPUT;
phase[3..0] : OUTPUT;
)
VARIABLE
ss: MACHINE OF BITS (phase[3..0])
WITH STATES (
s0 = B"0001",
s1 = B"0010",
s2 = B"0100",
s3 = B"1000");
160
太原理工大学 夏路易

BEGIN
ss.clk = clk;
ss.reset = reset;

TABLE
ss, ccw, cw => ss;
s0, 1, x => s3;
s0, x, 1 => s1;
s1, 1, x => s0;
s1, x, 1 => s2;
s2, 1, x => s1;
s2, x, 1 => s3;
s3, 1, x => s2;
s3, x, 1 => s0;
END TABLE;
END;

该设计的仿真结果见图 3.6.20。

图 3.6.20

161

You might also like