Professional Documents
Culture Documents
例 1:组合逻辑设计
第一步:选 File/Project/Name 菜单建立项目名
第二步:选 File/New 菜单,并选 text Editor 条目,进入文本编辑窗,然后输入电路设计文
件如图 3.6.1 所示
图 3.6.1
该设计的仿真结果见图 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";
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;
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;
该设计的仿真结果见图 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;
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