Zkušenosti s jazykem VHDL

Bartík Ondřej

Zkušenosti s jazykem VHDL
« kdy: 24. 10. 2010, 11:12:11 »
Dobrý den,

shánim někoho kdo má poměrně velké zkušenosti s jazykem VHDL pro FPGA Spartan3E.
Potřeboval bych pomoct s jedním projektem.

Děkuji za zájem
« Poslední změna: 24. 10. 2010, 11:40:37 od Petr Krčmář »


Re: Zkušenosti s jazykem VHDL
« Odpověď #1 kdy: 24. 10. 2010, 11:40:57 »
Bylo by vhodné rovnou ten konkrétní problém nastínit, jinak asi nikdo pomáhat nebude.

Geniv

Re: Zkušenosti s jazykem VHDL
« Odpověď #2 kdy: 24. 10. 2010, 14:43:23 »
hh, zadani projektu na FIT VUT Brno pro fitkit jsou vzdycky jedna veka vyzva ;)
GL

Bartík Ondřej

Re: Zkušenosti s jazykem VHDL
« Odpověď #3 kdy: 24. 10. 2010, 14:46:56 »
Dělám na maturitní práci "Měřič reakční doby" není to nic jiného než dětská hračka. Podle rozsvícení ledky stisknout příslušné tlačítko. Zatím pracuje jen se 4mi ledky a 4mi tlačítky(můj kit NEXYS2 více tlačítek nemá). Další příslušný modul zaručuje měření reakce. Tento modul není problém. Lámu si hlavu s modulem, který zaručuje náhodnou pozici ledky, náhodnou dobu rozsvícení ledky a také veškeré ovládání a všeo kolem toho. Tady je odkaz na zdrojový *.VHD soubor

http://www.uloz.to/6297370/nahoda-vhd

Program by měl fungovat tak, že pokud hodnota generátoru náhodného čísla (LSFR čítač) se rovná hodnotě čítače s frekvencí 1hz(hradlové pole pracuje s oscilačním obvodem 50Mhz a proto je použit další čítač, který funguje jako předdělička 50ti milióny), tento generátor náhody je zastaven pomocí signálů agrmnt a LSFRpwr a na ledky je poslána příslušná hodnota která rozsvítí jednu ledku podle dekodéru, který z prvních dvou bitů výše zmíněného generátoru udělá buď to 0001, nebo 0010, nebo 0100 a nebo 1000. V téhle chvíly program čeká na událost na tlačítcích, která je indikována získáním nabežných hran každého tlačítka zvlášť tímhle spůsobem

process (clk)
begin
   if clk'event and clk='1' then 
      if btn(0)='1' then   
         zDecka_0 <= '1';
      else
         zDecka_0 <= '0';
      end if;
   end if;
end process;


XOR_0 <= btn(0) xor zDecka_0;

RE0 <= XOR_0 and btn(0);

a poté porovnává stav na tlačítcích s hodnotou generátoru, který je zastaven. jestli hodnota není shodná prostřednictví signálu brzda je do výsledku dekodéru a na porty vyslány samé jedničky (s tímhle uživatel nemže nic udělat a musí restartovat hradlové pole, tedy teoreticky může pokud by ve stejnou chvíly stiskl všechna tlačitka na jednou a dosáhl by rovnosti toho výsledku a stavu na tlačítcích v jednu chvíly).
Pokud dojde ke shodě, ledky zhasnou a generátor je spuštěn a opět se generuje hodnota pro dekodér a čeká se na shodu s čítačem 1hz a generátorem a celý děj se opakuje. Jenže program si dělá co chce občas sám indikuje chybu ikdyž by žádná být neměla a pošle na ledky 1111 a pole se musí restartovat, nebo po stisknutí správného tlačítka na první pohled nic neudělá a při dalším stisknutí libovlných tlačítek dělá doslova co chce

Podle mne je problém u posledního procesu

děkuji za pomoc


a mimochodem nejsem stundetem vysoké školym lae střední :) proto ta maturitní práce. Nicméně plánuji nástup na VUT brno fakulta FEKT

Geniv

Re: Zkušenosti s jazykem VHDL
« Odpověď #4 kdy: 24. 10. 2010, 15:05:05 »
aha, tak to pak jo... nevim jak probirajou VHDL na FEKTu ale na FITu do relativne hrotily, a to se mate na maturitu na stredni VHDL je fakt HC, my to meli na FITku... no a taky jsme z toho nebyli moc chytri...


Program

Re: Zkušenosti s jazykem VHDL
« Odpověď #5 kdy: 24. 10. 2010, 15:48:24 »
Zdravím.
Za prvé bych si troufnul tvrdit, že tato úloha je nevhodná na FPGA, spíš na nějaký MCU.

Za druhé doporučoval bych víc dodržovat syntetizovatelné šablony tady je občas docela těžké předvídat, co z toho vyleze a používat asynchronní reset jako vstup do registru (ano, tak se to dle mého názoru u toho procesu nastavující exam vysyntetizuje) nemyslím, že je úplně super. Jinak je krásné se zbavovat latchí tím, že se ze se všechno zabalí do flip-flopů... Ne. Třeba multiplexor (dekodér atd.) je kombinační obvod a hodinový signál tam nemá co dělat. Ono z toho něco vyleze, ale může to dělat ptákoviny a klidně se může stát, že něco bude mít několik taktů latenci, aniž to si toho člověk všimne. Takže doporučuji SYNTETIZOVATELNÉ ŠABLONY a striktně se jich držet.

Jinak, ošetřujete někde zákmity při stisknutí tlačítka? Dále by bylo možná lépe si stav tlačítka uložit do registru včetně ošetření stisknutí přes několik taktů (to je jen další registr) a až v dalším taktu nad tím přemýšlet.

Také mi připadá, že jste si vytvořil VHDL design (prosím ne program, ale design!) a ten jste nahrál do toho spartana... Takhle budete chyby hledat hoooooodne dlouho. Doporučuji použít simulátor, např. Modelsim. Jestli na škole děláte s FPGA, tak tam snad bude nějaká licence. U takhle jednoduchého designu najdete chybu rychle...



Bartík Ondřej

Re: Zkušenosti s jazykem VHDL
« Odpověď #6 kdy: 24. 10. 2010, 15:58:03 »
to Program: pokud dobře rozumím vy doporučujete asynchroní reset toho procesu který tvoří exam ?

a co se týče toho simulátoru používám xilinx 12.3 a ten nemá v sobě už tvorbu test bench wave form ale jen vhd test bench a s ním ja neumím

a k těm zakmitům ty by neměly vadit protže ty konstrukce by měly vzít jen první naběžnou hranu a nic víc takže jestli to zakmitá by vůbec nemělo vadit, tedy pokud ty konstrukce fungují tak jak mají

Program

Re: Zkušenosti s jazykem VHDL
« Odpověď #7 kdy: 24. 10. 2010, 16:11:55 »
Ad reset: Právěže ne... Tak se to vysyntetizuje, dejte tam nějaký multiplexor (if brzda...) a jake jeden ze vstupů bude ten dekodér, druhý (others => '1')

ISE v sobě simulátor pokud vím nemá. Modelsim je funkcionální simulace. Tuším verze SE je na nějaký 3 měsíce zdarma. Opravdu doporučuji funkcionální simulaci použít.

U těch zákmitů to podle mě nevezme jen první hranu, ale až do příchodu náběžné hrany CLK to bude kmitat (pokud bude ten registr zDecka (bylo by lépe to označit jako registr, resp opravdu oddělit registry (řízené hodinovým signálem) od kombinační logiky) v 0, tak to bude kmitat stejně, jako to tlačítko) a je dost otázkou jaký stav tam bude při náběžné hraně CLK (podle mě to bude naprosto nedeterministické).

Jo, ještě já jsem zapomněl, je konvence zapisovat vstupy do entity velkými písmeny a vnitřní signály malými písmeny.

Bartík Ondřej

Re: Zkušenosti s jazykem VHDL
« Odpověď #8 kdy: 24. 10. 2010, 16:47:31 »
To s tím plexerem dostatečně  nechápu, prosím o podrobnější popis.

A co se týče těch zákmitů, pokusím se použít nějakou ošetřující konstrukci.

Děkuji za váš čas. Jen smím li se zeptat co jste zač ? zda učitele nebo se tím živíte, nebo student?

Program

Re: Zkušenosti s jazykem VHDL
« Odpověď #9 kdy: 24. 10. 2010, 17:22:11 »
No, co se mě týče jsem doktorand na FIT VUT v Brně a člen hardwarové skupiny jednoho nejmenovaného univerzitního projektu.

S těma zákmitama, to by chtělo zjistit, jestli to je, či není ošetřené už na tom kitu. Jinak tady by asi stačilo to přečíst několik taktů a dle toho se rozhodnout. Jako při nějakých 50MHz máte času fůru.

Jinak měl jsem na mysli něco takového:

LSFRregCUT_decp: process(LSFRregCUT)
begin
  case LSFRregCUT is
    when "00" => LSFRregCUT_dec <= "0001";
    when "01" => LSFRregCUT_dec <= "0010";
    when "10" => LSFRregCUT_dec <= "0100";
    when "11" => LSFRregCUT_dec <= "1000";
    when others => LSFRregCUT_dec <= (others => '0'); -- toto tu vubec nemusi byt, vsechny moznosti jsou vycerpany, ale taky to tam davam pro poradek
  end case;
end process;

exam_mxp:process(brzda,LSFRregCUT_dec)
begin
  case brzda is
    when '0' => exam_mx <= LSFRregCUT_dec;
    when '1' => exam_mx <= (others => '1');
  end case;
end process;

exam_regp: process(clk)
begin
  if clk'event and clk='1' then
    if reset='1' then
      exam_reg <= (others => '0');  --bacha na ignorovani resetu, muze se to poradne vymstit
    elsif
      exam_reg <= exam_mx;
    end if;
  end if;
end process;

Ta Vaše konstrukce se podle mě přeloží jako FF s použitím asynchronního resetu (ten druhý if) a možná i něco jiného. Ono XST sežere skoro vše, ale může vymyslet něco, co dělá úplně něco jiného,,než by mělo.

Psal jsem to z patra, tak netvrdím, že v tom nemůže být chybka. Ale takhle by ten kód měl vypadat...



Bartík Ondřej

Re: Zkušenosti s jazykem VHDL
« Odpověď #10 kdy: 25. 10. 2010, 09:50:13 »
Tak po aplikaci téhle konstrukce problémy neustaly, pro jistotu zda jsem tu konstrukci aplikoval správně, tady je odkaz na upraveny VHD src.

http://www.uloz.to/6304988/nahoda-vhd

Dekuji za odpověď.

Program

Re: Zkušenosti s jazykem VHDL
« Odpověď #11 kdy: 25. 10. 2010, 10:45:45 »
To se nedivím, to byl jen jeden příklad, že tam používáte špatné konstrukce. To může dělat problémy, ale nemusí. Často to omezuje frekvenci a občas to dělá i chyby, ale zejména se v tom člověk nevyzná (klidně se Vám tam může ztratit takt a můžete měsíce hledat, proč vám to nefunguje a důvod bude jen takt latence, díky kterému se to rozsype). Tam jsou další věci, například ty countery nejsou resetovány (ta implicitní hodnota má smysl tak pro simulaci, ale v HW musí být reset), XST to v takovém případě má tendenci nulovat (jinak by tam byl po nahrání designu nedefinovaný stav a co je nedef stav+1?), ale jakým způsobem to udělá a jestli vůbec?... Jako sám jsem v létě opravoval právě zapomenutý reset v counteru, který dělal neplechu a nikdo nevěděl, proč se to takhle chová.

Řeknu to jinak HW se píše tak, že si namalujete schémátko a to schémátko přepíšete do VHDL (nebo verilogu). HW není program, je to skládačka, kde kostičky jsou registry, mx, dec, enc, FSM atd. Pokud budete vytvářet vlastní konstrukce, tak nikdy nevíte, co z toho vyleze a pokud to nebudete skládat podle schématu, tak se v tom sám ztratíte. Jukněte na http://merlin.fit.vutbr.cz/FITkit/docs/navody/synth_templates.html

Taky mě teď napadá, že místo toho signálu brzda by bylo lépe tam hodit FSM (konečný automat) se 2 stavy. Opět to neupraví funkčnost, ale zpřehlední to kód a snáze se pak hledají chyby. Omlouvám se, že Vám ten kód tak drbu, ale je to vlastní zkušenost.

Jinak si fakt zjistěte, jak je to s těma zákmitama, na ošetření se dá použít např. RS klopný obvod (http://cs.wikipedia.org/wiki/Klopn%C3%BD_obvod#RS), ale zpětnovazební smyčky dělají ve VHDL někdy problémy, takže bych se k tomu uchýlil, až pokud nebude zbytí.

A nakonec hlavně: Nainstalujte si Modelsim (nebo něco podobného), a tam si to odsimulujte.

Hezký den a GL ;-)

Bartík Ondřej

Re: Zkušenosti s jazykem VHDL
« Odpověď #12 kdy: 25. 10. 2010, 12:13:37 »
Neomlouvejte se, ja sem to chápal jako klasické programování, což je po přečtení vašeho příspěvku zřejmě chyba. Někdo říká že se nemusí striktně dodržovat syntetizovatelné šablony a někdo zase tvrdí opak. To že říkáte, že se první navrhne schéma a pak se přepíše do kódu, tak sem myslel že takovéto jazyky slouží přímo proto aby se to schéma nemuselo navrhovat ručně.

K tomu simulátoru 12.3 neumožňují tvorbu VHD test bench wave form, ktery umožnoval jednoduché navoleni stavů vstupů v určitém okamžiku, ale jen VHD test bench, což je VHD soubor do kterého se to musí napsat v podobě kódu a poté se to nahraje do simulátoru. A právě příslušnou úpravu toho test bench kódu ja neznám a nikdy sem s tím ani nedělal. Takže simulace lze, lae velmi těžko až skoro vůbec. Pokud stím máte zkušenosti budu jenom rád.

Jak už jsem zmínil jsem studentem střední školy kde tenhle obor není nijak rozjetý a není moc velký prostor pro něj a tak se učíme od každého trochu a ti co mají zájem se vzdělávají SAMI dál. Chci tím říct že mé znalosti a zkušenosti nejsou až tak široké a konstrukce jako konéčný stavový automat (FSM) neznám... Leda PicoBlaze pro  který už mám něco napsáno

každopádně děkuji za váš čas a za vaše odpovědi které mě obohatili určitě je využiji

Program

Re: Zkušenosti s jazykem VHDL
« Odpověď #13 kdy: 25. 10. 2010, 13:13:28 »
Jo jo, brát to jako klasické programování je nejčastější chyba. Hodně lidí to nedokáže pochopit ani na výšce. Proto taky kolega výše psal, že VHDL je vždy výzva, HC atd. Není, jen se nad tím musí jinak přemýšlet.

Základní problém je totiž, že program pro procesor je sekvenční záležitost, protože procesor sekvenčně vykonává instrukce. U HW je to přesně naopak, všechno pracuje souběžně, proto se to píše úplně jinak.

S těma šablonama. Ono jde o to, že syntetizátor tu konstrukci musí pochopit, což není zrovna lehká úloha. Třeba XST se docela snaží (jenže otázkou je, co vymyslí, často to není to, co člověk chce), ale například Precision (jiný syntetizátor, dříve podporovaný Xilinxem) se Vám na to často prostě vykašle.

Ohledně těch schémat. Zatím je to třeba, rozhodně ve VHDL. Existují jiné jazyky, často odvozené od C (Handle-C, Catapult-C), které se více podobají klasickému programování, ale Handle-C je mrtvé (pokud vím) a celý tento segment je dost v plenkách. Snad někdy, ale zatím se musí postupovat dle schématu.

Jinak ten simulátor v ISE neznám (používám Modelsim), ale psaní testbenche je standard. Ono na tom není nic těžkého. Testbench je vlastně komponenta která nemá žádné vstupy a má v sobě vloženou testovanou komponentu, které posílá data. Tady se žádné šablony nepoužívají, dělá se to většinou v jednom, či několika málo procesech (jeden samostatný na generování hodin, prostě clk <='0' wait 5 ns; clk <= '1' wait 5 ns; nebo něco takového) A vždy nastavit signály a wait, nastavit signály a wait atd. Na wave se pak podíváte, jak se vaše jednotka chová.

Jinak na střední školu to může být obtížnější. Ale věřte mi, že není. Je to jen o tom se to naučit dělat jinak a zejména čistě. V C (C++, PHP atd.) to vždycky nějak spachtlíte, ale tady je každá špinavost hodně problém.

Jelikož nevím, jestli máte na škole po ruce odborníka, tak Vám zkusím vysvětlit konečný automat. Je to trochu ukecaná konstrukce, ale hodně, hodně důležitá. Uznejte sám, co je lepší: 1) Je nastaven signál xy, který zablokuje jednotku. 2) Jednotka je ve stavu blocked. Je to naprosto jednoduché a jak to zapsat máte v šablonách. Konečný automat má konečný počet stavů mezi kterými se přepíná vždy s náběžnou hranou clk (prostě se to zapíše do registru :-D ). Ve vašem případě budete mít například 2 stavy: running a blocked. Když bude aktivní reset, tak se přepnete do running (pokud v něm nejste), když se stiskne špatné tlačítko, přepnete se do blocked. Doporučuji to zkusit, je to opravdu jednoduché (ale fakt :-) ). Neděste se konečným automatem z teoretické informatiky...

Nechci, aby to vypadalo, jako moc teorie, je to praxe. Takhle se to dělá. Třeba s KA to řekl pěkně John Lockwood ze Stanfordu: "Například Pentium4 není nic víc, než kupa konečných automatů." A měl do značné míry pravdu.

Mějte se a nenechte se odradit :-)





D.E.X.

Re: Zkušenosti s jazykem VHDL
« Odpověď #14 kdy: 25. 10. 2010, 13:35:08 »
V ISE je možné syntetizovatelné šablony najit v Edit->Language Templates.
Pro přehled o základních konstrukcích je vhodné např. http://esd.cs.ucr.edu/labs/tutorial/

Jak v Modelsimu tak v ISE se při psaní testbenchů nevyhneš. Krátký tutoriálek najdeš na http://vhdlguru.blogspot.com/2010/03/how-to-write-testbench.html Hodně pokročilé informace najdeš v http://www.stefanvhdl.com/. Pro velké projekty je už psaní testbenchů tímto způsobem značně komplikované a proto se používá SystemVerilog.

Případně můžeš skusit automatické generování testbenchů http://www.questatechnologies.com/VHDLTestbenchGenerator.html. Nezkoušel jsem to, takže neručím za to, že to k něčemu bude.

Na zapomenuté resety dávej hodně velký bacha jsou to škaredý mršky.

Vynechávání návrhu (rozkreslení designu, ...) se v této oblasti nevyplácí ještě víc, než v klasickém programování. Sice můžete začít rovnou bušit kód, ale výsledek bude hodně špatný (nepřehledný kód, designy stylu "vše v jednom procesu", nefungující/podivně fungující těžko opravitelný kód, apod.).
Tj. nakreslení schématu by mělo být vždy základní krok. Sílu HDL jazyků poznáš, když budeš navrhovat nějaký větší projekt a už budeš mít připravené komponenty a schéma už bude vysokoúrovňové (na úrovni komponent - FIFO, procesor, ...).