Luokat sähkötekniikka yleensä sanellaan suosittuja työkaluja, joten vietän aina muutaman tunnin työn tekemiseen vapaa ohjelmisto. Tästä syystä olen päättänyt jakaa seuraavan opastaa. |
Tarvittavien asentaminen
Ohjelmien kokoamiseen ja simulointiin käytämme GHDL: ää, ilmaista GCC-pohjaista kääntäjää. Simulointitulosten tarkastelemiseksi käytämme GTKWAVE: ta. Toimittajana suosittelen Geanya, koska se tunnistaa melkein kaikki ohjelmointikielet.
sudo apt-get install ghdl gtkwave geany
Esimerkkiprojekti
Käytetään tätä vertailua esimerkkinä:
Ennen projektin luomista aloitetaan luomalla kansio, jossa kaikkia tiedostoja isännöidään. Tässä tapauksessa / home / user / vhdl. Siellä tallennamme ohjelmiemme lähdekoodin .vhd-laajennuksella.
Sitten kirjoitamme ohjelmamme käyttämällä Geanya, kuten kuvakaappauksesta näkyy.
Tallennamme sen vertailuna. Vhd.
Nyt meidän on luotava signaalit simulointia varten. Tätä varten luomme komponentin, joka käyttää edellistä lohkoa, ja määritämme signaalit.
Viivat A <= "0011" 0 ns jälkeen, "0111" 5 ns jälkeen, "0111" 10 ns jälkeen; ovat niitä, jotka konfiguroivat tulosignaalit ajoissa
Tallennamme tiedostot hakemistoon / home / user / vhdl. Sitten avataan pääte ja kootaan:
ghdl -a vertaa. vhd
Jos virheilmoituksia ei ole, kokoaminen onnistuu.
Nyt kootaan "komponentti"
ghdl -a vertaa_tb.vhd
Jos virheitä ei ole, luomme suoritettavan tiedoston:
ghdl -e vertaa_tb
Lopuksi on jäljellä simulaation suorittaminen ja tulosten tallentaminen "salīdz.vcd" -nimiseen
ghdl -r vertaa_tb --vcd = vertaa.vcd
Tulosten saamiseksi käytämme gtkwave:
gtkwave vertaa. vcd
Kun se on avattu, käytä Ctrl-näppäintä ja hiirtä osoittamaan meidät kiinnostaviin signaaleihin ja paina insert. Kaksoisnapsauta sitten vektoreita nähdäksesi erilliset signaalit. Napsauta sitten hiiren kakkospainikkeella signaaleja valitaksesi muodon (binääri, heksadesimaali, oktaali, desimaali jne.)
Tarvittaessa suurennuslasinappi, jonka keskellä on neliö, säätää kuvaajan näytölle.
ALU: aritmeettinen ja logiikkayksikkö
Okei, nyt tehdään jotain mielenkiintoisempaa: ALU (aritmeettinen ja looginen yksikkö). Se on looginen yksikkö, aritmeettinen yksikkö ja multiplekseri.
Looginen asema (LoU.vhdl)
KIRJASTO ieee; KÄYTÄ IEEE.STD_LOGIC_1164.all; KÄYTÄ IEEE.NUMERIC_STD.all;
ENTITY lou IS
PORTTI (op1: IN std_logic_vector (7 ALAS 0);
op2: IN std_logic_vector (7 ALAS 0);
prosessi: IN std_logic_vector (3 ALAS 0);
res: OUT std_logic_vector (7 ALAS 0));
LOPETA äänekkäästi;
Lou IS -arkkitehtuurin syntetisaatio2
SIGNAALI a, b: allekirjoittamaton (op1'-alue);
SIGNAALI c: ALLEKIRJOITETTU (järjestä uudelleen);
ALKAA
PROSESSI (a, b, prosessi)
ALKAA
CASE-prosessi ON
KUN "0000" => c <= KOKO ((ei a), c'pituus);
KUN "0001" => c <= KOKO ((a ja b), c'pituus);
KUN "0010" => c <= KOKO ((a tai b), c'pituus);
KUN "0011" => c <= KOKO ((a xor b), c'pituus);
KUN "0100" => c <= KOKO ((a nand b), c'pituus);
KUN "0101" => c <= KOKO ((a tai b), c'pituus);
WHEN OTHERS => null;
LOPPUKAUSI;
LOPETA PROSESSI;
a <= allekirjoittamaton (op1);
b <= allekirjoittamaton (op2);
res <= std_logic_vector (c);
END synth2;
Aritmeettinen yksikkö (ArU.vhd)
KIRJASTO ieee; KÄYTÄ IEEE.STD_LOGIC_1164.all; KÄYTÄ IEEE.NUMERIC_STD.all;
KOKOONARU ON
PORTTI (op1: IN std_logic_vector (7 ALAS 0);
op2: IN std_logic_vector (7 ALAS 0);
prosessi: IN std_logic_vector (3 ALAS 0);
res: OUT std_logic_vector (7 ALAS 0));
LOPPU aru;
ARKITEHTUURI syntetisaattori aru IS
SIGNAALI a, b: allekirjoittamaton (op1'-alue);
SIGNAALI c: ALLEKIRJOITETTU (järjestä uudelleen);
ALKAA
PROSESSI (a, b, prosessi)
ALKAA
CASE-prosessi ON
KUN "0000" => c <= KOKO ((a + b), c'pituus);
KUN "0001" => c <= KOKO ((a - b), c'pituus);
KUN "0010" => c <= KOKO ((a * b), c'pituus);
KUN "0011" => c <= KOKO ((a / b), c'pituus);
KUN "0100" => c <= KOKO ((a + "1"), c'pituus);
KUN "0101" => c <= KOKO ((b + "1"), c'pituus);
WHEN OTHERS => null;
LOPPUKAUSI;
LOPETA PROSESSI;
a <= allekirjoittamaton (op1);
b <= allekirjoittamaton (op2);
res <= std_logic_vector (c);
END-syntetisaattori;
Multiplekseri (muxVector.vhd)
KIRJASTO ieee; KÄYTÄ IEEE.STD_LOGIC_1164.all; KÄYTÄ IEEE.NUMERIC_STD.all;
ENTITY muxVector IS
PORTTI (ARU: sta: std_logic_vector (7 ALAS 0);
fromLOU: IN std_logic_vector (7 ALAS 0);
kytkin: IN std_logic;
output: out std_logic_vector (7 ALAS 0));
END muxVector;
MuxVector IS: n ARKITEHTUURIN muutos
ALKAA
kytkimen valinnalla
lähtö <= ARU: lta, kun '0', LOU: lta, kun muut;
END-muutos;
ALU-komponentti (aluComponent.vhd)
KIRJASTO ieee; KÄYTÄ IEEE.STD_LOGIC_1164.all; KÄYTÄ IEEE.NUMERIC_STD.all;
ENTITY alu-komponentti IS
END aluKomponentti;
ARKITEHTUURI input_aluComponent OF aluComponent IS
KOMPONENTTI aru
PORTTI (op1: IN std_logic_vector (7 ALAS 0);
op2: IN std_logic_vector (7 ALAS 0);
prosessi: IN std_logic_vector (3 ALAS 0);
res: OUT std_logic_vector (7 ALAS 0));
LOPPUKOMPONENTTI;
KOMPONENTTI lou
PORTTI (op1: IN std_logic_vector (7 ALAS 0);
op2: IN std_logic_vector (7 ALAS 0);
prosessi: IN std_logic_vector (3 ALAS 0);
res: OUT std_logic_vector (7 ALAS 0));
LOPPUKOMPONENTTI;
KOMPONENTTI muxVector
PORTTI (ARU: sta: std_logic_vector (7 ALAS 0);
fromLOU: IN std_logic_vector (7 ALAS 0);
kytkin: IN std_logic;
output: out std_logic_vector (7 ALAS 0));
LOPPUKOMPONENTTI;
SIGNAL outputARU: std_logic_vector (7 ALAS 0);
SIGNAL outputLOU: std_logic_vector (7 ALAS 0);
signaalikytkin: std_logic;
signaaliprosessi: std_logic_vector (3 ALAS 0);
signaalin ulostulo: std_logic_vector (7 ALAS 0);
SIGNAALI A: std_logic_vector (7 ALAS 0);
SIGNAALI B: std_logic_vector (7 ALAS 0);
ALKAA
u0: aru PORT MAP (A, B, prosessi, ARU-poistuminen);
u1: lou PORT MAP (A, B, prosessi, LOU-lähtö);
u2: muxVector PORT MAP (lähtöARU, lähtöLOU, kytkin, lähtö);
A <= "00000011" 0 ns jälkeen, "00000111" 5 ns jälkeen, "00000111" 10 ns jälkeen, "00001001" 15 ns jälkeen, "00000000" 20 ns jälkeen, "00000101" 25 ns jälkeen, "00001111" 30 jälkeen 00000101 ns ns, "35" XNUMX ns: n jälkeen;
B <= "00000010" 0 ns jälkeen, "00000100" 5 ns jälkeen, "00000010" 10 ns jälkeen, "00000011" 15 ns jälkeen, "00000100" 20 ns jälkeen, "00000110" 25 ns jälkeen, "00001111" 30 ns jälkeen, "00000011" 35 jälkeen ns, "XNUMX" XNUMX ns jälkeen;
kytkin <= '1' 0 ns jälkeen, '0' 5 ns jälkeen, '1' 10 ns jälkeen, '0' 15 ns jälkeen, '1' 20 ns jälkeen, '0' 25 ns jälkeen, '1' 30 jälkeen 0 ns ns, '35' 1 ns jälkeen, '40' XNUMX ns jälkeen;
prosessi <= "0000" 0 ns jälkeen, "0001" 5 ns jälkeen, "0010" 10 ns jälkeen, "0011" 15 ns jälkeen, "0100" 20 ns jälkeen, "0101" 25 ns jälkeen, "0110" 30 ns jälkeen, "XNUMX" XNUMX jälkeen XNUMX ns ns;
END input_aluComponent;
Jotta ei tuhlata aikaa komennon kokoamisella komennolla työskennellessäsi ohjelmassa, tallennamme tiedoston nimeltä compilar.sh, jolla on seuraava sisältö samaan kansioon:
ghdl -a lou.vhd && ghdl -a aru.vhd && ghdl -a muxVector.vhd && ghdl -a aluComponente.vhd && ghdl -e aluComponent && ghdl -r aluComponent --vcd = alu & ghdlwave
Avaa pääte, kirjoita kansio ja suorita komentosarja:
cd / home / user / vhdl sh compile.sh
Jos virheitä ei ole, gtkwave avautuu ja voimme nähdä signaalit:
Nämä työkalut ovat olleet erittäin hyödyllisiä ja helpompia käyttää kuin omat työkalut, joita käytämme luokassa, joiden kääntäminen kestää epäilemättä liian kauan. Ghdl: n avulla ikkunoiden vaihto kestää kauemmin kuin kääntäminen.
Lisätietoja VHDL: stä
Niille, jotka ovat uusia VHDL: lle, täällä heillä on perusesimerkki denieristä.
Esimerkkivideo:
http://www.youtube.com/watch?v=feVMXsyLSOU
Muista, että Ubuntun uusimmissa versioissa ei ole GHDL-arkistoja. Tämän voi ladata Linuxille / Windowsille projektisivulta:
http://ghdl.free.fr/site/pmwiki.php?n=Main.Download
Onko millään tavalla GTKWave antaa sinulle edustamansa porttipiiri?