Podobno w Cuplu to rzeznia zaimplementowac 8255 (tryb 0), za to w VHDL jest to wykonalne...Czy ktos slyszal o takim rozwiazaniu lub takowym dysponuje? Ewentualnie potrzebuje expresowego kursu VHDLa lub AHDLa (zeby napisac to cosik w Max+Plus). Prosze o pomoc.. Dziekuje i pozdrawiam Grzegorz.
8255 w VHDL...
Sep 21, 2004
6 Replies
Na ile znam cupla to umiarkowana ..
J.
Spróbuj tego:
formatting link
formatting link
Jarek
U¿ytkownik "Grzegorz" <w_o_d_e snipped-for-privacy@poczta.onet.pl> napisa³ w wiadomo¶ci news:X334d.302673$ snipped-for-privacy@news.chello.at...
Użytkownik Grzegorz napisał:
Bezproblemowa sprawa napisać coś takiego, tylko za ile ?
Adam
A tu leży dużo gotowców w VHDL - od procesorów do kontrolerów LAN czy USB. Łatwo z tego zmontować cały system, który wejdzie do jednej kostki FPGA i jeszcze soft da się pisać w C:
formatting link
A wiec tak... Znalazlem cos takiego:
formatting link
sie otwiera i w 90% jest po chinsku albo japonsku, ale chyba o to mi chodzilo. Tam jest implementacja 8255 w VHDLu (na to przynajmniej wygladalo). Niestety jak sie okazalo moja licencja na Max+Plus nie uwzglednia VHDLa, wiec postanowilem przeniesc to wszystko do AHDL. Kazda z czesci ukladu rozpisalem w AHDLu z niewielkimi modyfikacjami poniewaz potrzebny mi tylko tryb 0). Pó¼niej poszczególne czê¶ci polaczy³em w edytorze graficznym, tak jak na rysunku:
formatting link
Jako, ze jestem dosyc poczatkujacym zarowno w VHDLu, jak i Maxie++ i AHDLu, napotkalem kilka problemow...
Po pierwsze mialem problem z przerobieniem do AHDLa linijek typu: data_bus<="ZZZZZZZZ"; oraz a_port<=(others=>'Z'); Tutaj chodzi chyba o stan High Impedance, o ile dobrze wyczytalem, ale nie mam pojecia jak to zapisac w AHDLu
Po drugie, jesli mam skladnie CASE w VHDL, np: case rd_wr is when "01"=>
data_bus<=data_in; --Read data from v8255 when "10"=>
data_out<=data_bus; --Write data to v8255 data_bus<="ZZZZZZZZ"; when others=>
data_bus<="ZZZZZZZZ"; --Illegal condition or end case; -- Tri-state
W AHDLu miala ona postac: CASE rd_wr[1..0] IS WHEN B"01" =>
data_bus[7..0] = data_in[7..0]; WHEN B"10" =>
data_out[7..0] = data_bus[7..0]; data_bus[7..0] = B"00000000"; WHEN OTHERS =>
data_bus[7..0] = B"00000000"; END CASE; (zamiast 'ZZZZZZZZ' dalem B"00000000", poniewaz nie wiem, jak mozna to przedstawic). Jednak Save & Check zwraca 16 identycznych bledow, po dwa dla kazdego z pinow data_bus "BIDIR pin "data_bus[0]" cannot be asigned more than one value". Co mam zrobic w tej sytuacji? Jak inaczej przetlumaczyc to do AHDLa?.. Pomoglo tylko jak usunalem drugie i trzecie przypisanie do data_bus[7..0]...
Po trzecie - w edytorze graficznym (plik 8255.gdf) po umieszczeniu dwukierunkowego portu BIDIR, i skompilowaniu kompilator zwraca³ b³±d: "BIDIR pin <name> must be driven by TRI or OPNDRN buffer, but is driven by primitive". W takim razie doda³em elementy OPNDRN, choc nie wiem, czy to jest poprawne? Moze trzeba dodac elementy TRI, ale gdzie podlaczyc linie OE? (czym w ogole sa TRI i OPNDRN?)
Kolejne pytanie.. Po dodaniu OPNDRNow, ca³o¶æ siê kompilowa³a w porzadku, ale po skompilowaniu otrzymalem komunikat, ze kompilator zignorowa³ nieuzywane wejscia CS, A0, A1, RD, WR i RESET.. Dziwne, bo przeciez sa one wykorzystywane i wplywaja na stan wyjsc... co wiec jest powodem ich nie uwzglednienia? Robiac caly uklad od poczatku doszedlem do wniosku, ze problem ten pojawia sie po dodaniu elementu "data_sel"...
I ostatnie pytanie: ostatnia "czesc" implementacji w VHDLu zawiera entity n82550.. Nie do konca wiem jak to zaimplementowac.. Jego funkcja to chyba tylko obsluga linii Reset. W wyniku dostane nowy Default Symbol, ale jak go uwzglednic na moim calym schamacie nie wiem... Tutaj jest link do calego projektu..
formatting link
Moze ktos potrafi mi pomoc to skonczyc, lub przynajmniej odpowie na niektore nurtujace mnie problemy..?
Z gory dziekuje z pomoc Pozdrawiam Grzegorz
"Grzegorz"
czyta Pan jeszcze ten watek ?
for i in data_bus_length to 0 generate data_bus[i] = tri(tristate_gate_input_logic,tristate_control_line); end generate;
tu jest przyklad, jak zrobic tristate bus: [wiem, ze niedokladnie o to chodzi w przykladzie powyzej]
SUBDESIGN test ( in[3..1][3..0] :input; oe[3..1] :input; out[3..0] :output; )
VARIABLE
trs_bus[3..0] :tri_state_node;
BEGIN
for j in 3 to 1 generate for i in 3 to 0 generate trs_bus[i] = TRI(in[j][i], oe[1]); trs_bus[i] = TRI(in[j][i], oe[2]); trs_bus[i] = TRI(in[j][i], oe[3]); out[i] = trs_bus[i]; end generate; end generate;
END;
taki tri-state bus nie bardzo ma sens, bo compiler i tak to przeksztalci do jakiegos multipleksera, w Alterze nie ma linii trzystanowych, wiec ja osobiscie wole sam to zrobic;
w Panskim przykladzie trzystanowy bus w ogole nie powinien sie pojawic, bo 'data_bus' ma tylko jeden driver, ale pewnie w calosci tych driverow jest wiecej ?
przyklad na taki wewnetrzny mux w AHDL napisalbym tak:
SUBDESIGN test ( data_inA[7..0] :input; data_inB[7..0] :input; data_inC[7..0] :input; ctrl[2..0] :input; data_out[7..0] :bidir; )
variable out_disable :node;
BEGIN
out_disable = ctrl[] == 0; -- tri-state output when ctrl is 0
for i in 7 to 0 generate data_out[i] = tri( (data_inA[i] & ctrl[] == 1) # (data_inB[i] & ctrl[] == 2) # (data_inC[i] & ctrl[] == 3), !out_disable); end generate;
END;
AHDL przy VHDL przypomina troche assembler, dlatego nie da sie 'mechanicznie' przepisac VHDL na AHDL, ale mi to nie przeszkadza; tym bardziej, ze uzywam Verilog :)
nie uzywalem nigdy graficznego edytora ... tri to tri-state, opndrn to open drain; jesli deklaruje Pan pin jako BIDIR, to z definicji musi byc jakis sygnal, ktory definiuje kiedy pin steruje linie, a kiedy jest nieaktywny; ten sygnal to Panskie OE;
trudno cos powiedziec, bez zobaczenia calosci, kompilator musial dojsc do wniosku, ze stan tych linii nie ma wplywu na wyjscia; w kazdym razie, w miare mozliwosci, sluze pomoca przy max-plus i AHDL :)
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