Kuinka työskennellä vhdl: n kanssa ilmaisen ohjelmiston avulla

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.

Tämä on pandakristen panos, joten siitä tulee yksi viikoittaisen kilpailumme voittajista: «Jaa mitä tiedät Linuxista«. Onnittelut!

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.

Älä unohda tallentaa ohjelmaa laajennuksella .vhd, jotta Geany tunnistaa muodon ja värittää varatut sanat.

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


Jätä kommentti

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *

*

*

  1. Vastuussa tiedoista: Miguel Ángel Gatón
  2. Tietojen tarkoitus: Roskapostin hallinta, kommenttien hallinta.
  3. Laillistaminen: Suostumuksesi
  4. Tietojen välittäminen: Tietoja ei luovuteta kolmansille osapuolille muutoin kuin lain nojalla.
  5. Tietojen varastointi: Occentus Networks (EU) isännöi tietokantaa
  6. Oikeudet: Voit milloin tahansa rajoittaa, palauttaa ja poistaa tietojasi.

  1.   Nacho dijo

    Onko millään tavalla GTKWave antaa sinulle edustamansa porttipiiri?