przerzutnik RS w AHDL

Jun 13, 2006 6 Replies

Altera Flex 10k50 pod MAX+plus II (v. 9). Nie mogê znale¼æ zwyk³ego RS, bez zegara. W .gdf mogê postawiæ symbol dff (przerzutnik D) CLK i D podpi±æ np. do vcc i wej¶cia -R i -S u¿ywaæ - dzia³a, sprawdzone. Wyrzuca tylko ostrze¿enie "no clock transition". Ale potzrebujê u¿yæ RS w pliku tekstowym .tdf.


  1. { X[7..0] : INPUT; } VARIABLE G[7..0] : dff; a potem G[].clk = vcc; (gnd te¿ nic nie zmienia) G[].d = vcc; (-//-) G[].prn = vcc; G[].clrn = x[]; to kompilator wyrzuca seriê ostrze¿eñ "G0 stuck at GND" itd. do G7 I tak jest w rzeczywisto¶ci.


  1. Gdy na zewn±trz wystawiê set (.prn) G[].prn = x[]; G[].clrn = vcc; to komunikat "G0 stuck at VCC" x[] w projekcie to s± piny scalaka (na zewn±trz pull-up). Kompilator nie mo¿e wiedzieæ co na nich bêdzie. Dlaczego w 1. i 2. uznaje je za aktywne?

  2. Mo¿e set i reset przy definicji w pliku s± aktywne jedynk± (jak w starych w Lattice?). czyli np: G[].prn = gnd; G[].clrn = !x[]; Kompilator ostrzega "no clock transition", ale po zaprogramowaniu przerzutniki s± w stanie 0 a po podaniu na piny x[] "0" (czyli na clrn "1") siê ustawiaj±. a po zdjêciu zera wracaj± do "0"


  1. Jeszcze co¶ takiego: G[].prn = gnd; G[].clrn = x[]; Przerzutniki s± ustawione, po podaniu "0" na x[] siê zeruj±, po zdjêciu zera wracaj± do "1".



Je¿eli aktywne 0 to 3. i 4. by³oby jeszcze wyt³umaczalne - chocia¿ to stan zabroniony clear "wygra³" z set. Czyli jednak aktywne s± 0? Ale to ju¿ sprawdza³em - "G0 stuck at GND" Jak w pliku .tdf umie¶ciæ RS? Grafiki chcê unikn±æ. Funkcji przywo³uj±cej stare dobre 7474 i d³ubania w bramkach te¿.



Arek



napisalem cos takiego [quartus, nie mam maxplus]:

subdesign test_dff ( set[7..0], reset[7..0] : input; dff_out[7..0] : output; )

begin

for i in 7 to 0 generate dff_out[i] = dff(vcc,vcc,reset[i],set[i]); end generate;

end;

i to dziala, przynajmniej na symulatorze,

jesli przerzutnik ma wartosc 'default' zero [a zwykle ma], prn jest nieaktywne [vcc] i jedynie .clrn jest gdzies podlaczone, to wyjscie musi byc 'stuck at GND';

a w ogole to co chcesz zrobic ? uzywanie FF bez zegara za to z set i clr jest na ogol zlym pomyslem, jestes pewien, ze tak musi byc ?

JA

JA napisa³(a) w wiadomo¶ci: snipped-for-privacy@uni-berlin.de...

Takiego zapisu nie próbowa³em. Ale co¶ podobnego dzia³a G[].prn = wej; wej¶cie z pinu zewn. G[].clrn = x[];

Nie znalaz³em) ustawienia domy¶lnej warto¶ci przerzutników. Je¿eli chodzi o warto¶æ po "w³±czeniu" uk³adu (na razie po zaprogramowaniu .sof-em) to mo¿e o to chodzi, bo przerzutniki s± rzeczywi¶cie w stanie 0, co przy zablokowaniu set daje taki wynik bo kompilator o tym "wie" (tyle, ¿e przy u¿yciu symbolu dff w .gdf-ie, set=vcc pin->clear nie powoduje tego komunikatu). To nie t³umaczy sytuacji, gdy clear jest na VCC a set na pinach. Nie powinno byæ wtedy "stuck at VCC". W koñcu warto¶æ domy¶lna powinna byæ konkretna...

W projekcie by³o trochê RS asynchronicznych. Fragment pomys³u przenoszony z Lattice'owego Abla na inn± platformê. Zalecane nie zmieniaæ regu³ dzia³ania i raczej ma byæ w postaci tekstowej. Mo¿na te¿ inaczej i pewnie napiszê to po swojemu. Arek

*** z gory przepraszam, jesli odpowiedz *** ukazala sie dwukrotnie;

Arek napisał:

zapis jak zapis, preferowalem powyzszy jak jeszcze uzywalem ahdl, bo mniej pisania, oba zapisy sa rownowazne;

problem nie w zapisie a w tym, ze przerzutnik r-s nie moze miec jednego z wejsc polaczonego na stale do '1' czy '0', bo to nie ma sensu i kompilator to 'wie';

gdzies w logu kompilacji jest ta informacja, prawdopodobnie trzeba szukac hasla: 'power up';

sciagnij sobie quartus i skompiluj prosty kod:

====================================== subdesign ff_test ( reset, set : input; clk, d : input; ff_out_res, ff_out_set, ff_out_both : output; ff_clk_res, ff_clk_set : output; )

begin ff_out_res = dff(VCC,VCC,!reset,); ff_out_set = dff(VCC,VCC,,!set); ff_out_both = dff(VCC,VCC,!reset,!set);

ff_clk_res = dff(d,clk,!reset,); ff_clk_set = dff(d,clk,,!set);

end; =====================================

jako device wybierz cyclone lub pozniejsze fpga; po kompilacji zobacz wynik najpierw w rtl view, a pozniej w technology wiev ...

dowcip polega na tym, ze czy uzywasz set czy clear, flip-flop ma podlaczony port clear, na wyjsciu f-f pojawia sie inwerter, jesli w uzyciu jest port set; czyli: set zeruje przerzutnik, a inwerter robi z tego jedynke; negowane jest rowniez wejscie 'd'; wiec jest "stuck at VCC" jesli polaczysz set, "stuck at GND" jesli polaczysz clear;

to jest bardzo zly pomysl, trzeba miec duza praktyke, by zrobic pewnie dzialajacy, wiekszy projekt asynchroniczny;

jezeli set czy clear sa generowane przez jakis uklad kombinacyjny wewnatrz fpga, masz prawie pewne, ze od czasu do czasu pojawiac sie beda szpilki generowane przez rozny czas propagacji; przerob ten projekt na uklad synchroniczny jak bog przykazal, inaczej beda niekonczace sie problemy;

i zastanow sie, czy nie lepiej napisac to w verilogu [w ostatecznosci w vhdl ... :] bo ahdl to przywiazanie sie do kompilatora altery, trzeba bedzie znow zmienic platforme, to trzeba bedzie znow pisac od nowa;

JA

czekajac w robocie az mi sie skonczy dluga kompilacja, zrobilem i przesymulowalem taki set-reset 'przerzutnik';

========================== subdesign ff_test ( res, set : input; rs_out : output; )

variable nand1, nand2 : node; setDEL, resDEL : lcell; -- 'lcell' zapobiega wywaleniu -- logiki przez optymalizator set_del[3..0], res_del[3..0] : lcell; -- 'lancuszki' opozniajace set i reset

begin

set_del[0] = set; res_del[0] = res;

for i in 3 to 1 generate set_del[i] = set_del[i-1]; res_del[i] = res_del[i-1]; end generate;

setDEL = set & set_del[3]; -- to ma wyeliminowac krotkie szpilki resDEL = res & res_del[3]; -- na set i res

nand1 = !(!setDEL & nand2); nand2 = !(!resDEL & nand1);

rs_out = nand1;

end; ====================

JA

JA napisa³(a) w wiadomo¶ci: ...

No tak... Sprawdzê jeszcze, czy w przypadku u¿ycia pe³nego D co¶ takiego nie wystêpuje.

je¿eli tak to zrobiono równie¿ w starszych uk³adach - no có¿...

W poprzedniej wersji bardzo sprytnie powi±zano obs³ugê klawiatury (gaszenie drgañ klawiszy na RS) z czê¶ci± funkcji logicznych zw±zanych z klawiszmi. W innym miejscu korzystano z synchronicznych i asynchronicznych setów/resetów (wiem, mo¿na inaczej). Zapis w Ablu by³ wbrew pozorom dosyæ intuicyjny i dobrze oddawa³ funkcje poszczególnych fragmentów. Teraz z kilkunastu porozrzucanych ko¶ci trafia to do jednej z pewnymi zmianami. Ca³o¶æ w wiêkszo¶ci synchroniczna, zegarów kilkana¶cie, w tym kilka, miêdzy którymi zwi±zku nie ma. Przebiegów które trzeba "dosynchronizowaæ" (pêdzone ró¿nymi zegarami) te¿ trochê.

Tego ju¿ nikt nie bêdzie poprawiaæ... :) Ew. bêdzie robione inaczej. Dziêki.

Arek

nie do konca rozumiem :(

tak wlasnie bylo w starszych ukladach, tak jest w cyclone, jak jest w stratix juz nie wiem, moze tam dodano osobne wejscie 'set';

jesli chodzi o eliminacje drgan stykow na klawiszach, to moze tak:

---------------------------------- include "lpm_counter";

subdesign klawisz ( sys_clk : input; k_a, k_b : input; -- klawisze a i b a_out, b_out : output; )

variable res, count : lcell; del_cnt : lpm_counter with (lpm_width = 5);

begin count = a_out # b_out;

del_cnt.clock = sys_clk; del_cnt.sclr = del_cnt.q[4]; del_cnt.cnt_en = count;

res = !del_cnt.q[4];

a_out = dff(vcc,k_a,res,); b_out = dff(vcc,k_b,res,); end;

-------------------------------------

JA

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required