Mam problem z napisaniem automatu w AHDL'u. Automat po sygnale zezewolenia WR=1 powinien odczytac wejscie I[] i dać je na wyjście O_F[] oraz na wyjsciu PODKLUCZ[] dac K1[].
W kolejnych stanach odczytuje wejscie I_F[] i daje je na O_F[] (miedzy O_F[] a I_F[] jest blok kombinacyjny) i na wyjscie PODKLUCZ[] daje odpowiednio nastepne K, aż do ich wyczerpania (16 rund). W ostatnim stanie odczytujemy wartosc I_F[] i wpisujemy na O[].
Problem jest w tym, że to co napisałem nie za bardzo działa. Wygląda na to, jakby wyjście były zwarte z wejściem i automat zmienia wyjścia w dowolnym momencie nie czekająć na sygnał zegarowy.
SUBDESIGN 16xF
(
I[1..64] : INPUT;
K1[1..48] : INPUT;
K2[1..48] : INPUT;
K3[1..48] : INPUT;
K4[1..48] : INPUT;
K5[1..48] : INPUT;
K6[1..48] : INPUT;
K7[1..48] : INPUT;
K8[1..48] : INPUT;
K9[1..48] : INPUT;
K_10[1..48] : INPUT;
K_11[1..48] : INPUT;
K_12[1..48] : INPUT;
K_13[1..48] : INPUT;
K_14[1..48] : INPUT;
K_15[1..48] : INPUT;
K_16[1..48] : INPUT;
clk : INPUT;
WR : INPUT;
i_f[1..64] : INPUT;
PODKLUCZ[1..48]: OUTPUT;
o_f[1..64] : OUTPUT;
o[1..64] : OUTPUT;
)
VARIABLE
ss: MACHINE WITH STATES (s0,s1,s2,s3,s4,s5,s6,s7,s8,s9,s10,s11,s12,s13,s14,s15,s16);
BEGIN
ss.clk=clk;
CASE ss IS
WHEN s0 =>
IF WR THEN
podklucz[]=k1[];
o_f[] = i[];
ss = s1;
ELSE ss=s0;
END IF;
WHEN s1 => o_f[]=i_f[]; podklucz[]=k2[]; ss=s2;
WHEN s2 => o_f[]=i_f[]; podklucz[]=k3[]; ss=s3;
WHEN s3 => o_f[]=i_f[]; podklucz[]=k4[]; ss=s4;
WHEN s4 => o_f[]=i_f[]; podklucz[]=k5[]; ss=s5;
WHEN s5 => o_f[]=i_f[]; podklucz[]=k6[]; ss=s6;
WHEN s6 => o_f[]=i_f[]; podklucz[]=k7[]; ss=s7;
WHEN s7 => o_f[]=i_f[]; podklucz[]=k8[]; ss=s8;
WHEN s8 => o_f[]=i_f[]; podklucz[]=k9[]; ss=s9;
WHEN s9 => o_f[]=i_f[]; podklucz[]=k_10[]; ss=s10;
WHEN s10 => o_f[]=i_f[]; podklucz[]=k_11[]; ss=s11;
WHEN s11 => o_f[]=i_f[]; podklucz[]=k_12[]; ss=s12;
WHEN s12 => o_f[]=i_f[]; podklucz[]=k_13[]; ss=s13;
WHEN s13 => o_f[]=i_f[]; podklucz[]=k_14[]; ss=s14;
WHEN s14 => o_f[]=i_f[]; podklucz[]=k_15[]; ss=s15;
WHEN s15 => o_f[]=i_f[]; podklucz[]=k_16[]; ss=s16;
WHEN s16 => o[]=i_f[]; ss=s0;
END CASE;
END;
Będę wdzięczny za pomoc, bo siedzę nad tym od 15 godzin i nie mogę wymyśleć jak to poprawić...