
Приложение 6. Описание на AHDL устройства для работы
с динамическим семисегментным индикатором
TITLE "Dinamic Indicator Module";
SUBDESIGN d_ind7
(
clk: INPUT; -- тактовая частота 4 МГц
a1, b1, c1, d1, e1, f1, g1: INPUT;
a2, b2, c2, d2, e2, f2, g2: INPUT;
a3, b3, c3, d3, e3, f3, g3: INPUT;
en1, en2, en3: OUTPUT; -- На индикатор
a,b,c,d,e,f,g: OUTPUT; -- "0" - зажигает
)
VARIABLE
prescaler[8..0]: DFF;
Q1[7..1], Q2[7..1], Q3[7..1]: DFF;
qq[7..1]: DFF;
ww: MACHINE WITH STATES (WriteQ1, Idle1, WriteQ2, Idle2, WriteQ3, Idle3);
BEGIN
DEFAULTS
(en1, en2, en3) = b"111";
END DEFAULTS;
Q1[]= (a3, b3, c3, d3, e3, f3, g3);
Q2[]= (a2, b2, c2, d2, e2, f2, g2);
Q3[]= (a1, b1, c1, d1, e1, f1, g1);
prescaler[].clk= clk; -- делитель
prescaler[]= prescaler[]+ 1;
Q1[].clk= clk;
Q2[].clk= clk;
Q3[].clk= clk;
qq[].clk= clk;
ww.clk= clk;
--machine state
CASE WW IS
WHEN WriteQ1 =>
en1= gnd;
qq[]= Q1[];
if prescaler[] == 0 then
ww= Idle1;
else
ww= WriteQ1;
end if;
WHEN Idle1 =>
qq[]= Q2[];
ww= WriteQ2;
WHEN WriteQ2 =>
en2= gnd;
qq[]= Q2[];
if prescaler[] == 0 then
ww= Idle2;
else
ww= WriteQ2;
end if;
WHEN Idle2 =>
qq[]= Q3[];
ww= WriteQ3;
WHEN WriteQ3 =>
en3= gnd;
qq[]= Q3[];
if prescaler[] == 0 then
ww= Idle3;
else
ww= WriteQ3;
end if;
WHEN Idle3 =>
qq[]= Q1[];
ww= WriteQ1;
WHEN OTHERS =>
ww= Idle3;
END CASE;
(a, b, c, d, e, f, g) = !qq[];
END;