Kako raditi s vhdl-om koristeći besplatni softver

Predavanja elektroničko inženjerstvo obično se diktiraju upotrebom popularni alati, tako da uvijek provedem nekoliko sati u potrazi za obavljanjem posla besplatan softver. Iz tog razloga sam odlučio podijeliti sljedeće vodič.

Ovo je doprinos pandacrisa, postajući tako jedan od pobjednika našeg tjednog natjecanja: «Podijelite ono što znate o Linuxu«. Čestitamo!

Instaliranje potrebnog

Za kompajliranje i simulaciju naših programa koristit ćemo GHDL, besplatni kompajler zasnovan na GCC. Da bismo vidjeli rezultate simulacije, koristit ćemo GTKWAVE. Kao urednik preporučujem Geany jer prepoznaje gotovo sve programske jezike.

sudo apt-get instalirati ghdl gtkwave geany

Primjer projekta

Koristimo ovaj komparator kao primjer:

Prije stvaranja projekta, krenimo sa stvaranjem mape u kojoj će biti smještene sve datoteke. U ovom slučaju, / home / user / vhdl. Tamo ćemo spremiti izvorni kod naših programa s .vhd nastavkom.

Zatim napišemo naš program koristeći Geany, kao što se vidi na snimku zaslona.

Spremamo ga kao compare.vhd.

Ne zaboravite spremiti program s nastavkom .vhd tako da Geany prepozna format i oboji rezervirane riječi.

Sada ćemo morati stvoriti signale za simulaciju. Da bismo to učinili, stvorit ćemo komponentu koja koristi prethodni blok i odrediti ćemo signale.

Linije A <= "0011" nakon 0 ns, "0111" nakon 5 ns, "0111" nakon 10 ns; su oni koji vremenski konfiguriraju ulazne signale

Datoteke spremamo u / home / user / vhdl. Zatim otvaramo terminal i kompajliramo:

ghdl -a usporedba.vhd

Ako nema poruka o grešci, kompilacija je uspješna.

Sada kompajliramo "komponentu"

ghdl -a compare_tb.vhd

Ako nema grešaka, kreiramo izvršnu datoteku:

ghdl -e usporedba_tb

Konačno, ostaje izvršiti simulaciju i sačuvati rezultate u onom nazvanom "compare.vcd"

ghdl -r compare_tb --vcd = compare.vcd

Da bismo vidjeli rezultate, poslužit ćemo se gtkwave:

gtkwave compare.vcd

Jednom otvoreni, koristite tipku Ctrl i miš da pokažete na signale koji nas zanimaju i pritisnite insert. Zatim dvaput kliknite na vektore da biste vidjeli zasebne signale. Zatim desnom tipkom miša kliknite signale za odabir formata (binarni, heksadecimalni, oktalni, decimalni itd.)

Ako je potrebno, dugme povećala s kvadratom u sredini prilagođava graf ekranu.

ALU: aritmetička i logička jedinica

U redu, učinimo sada nešto zanimljivije: ALU (aritmetička i logička jedinica). To će biti logička jedinica, aritmetička jedinica i multiplekser.

Logički pogon (LoU.vhdl)

     BIBLIOTEKA ieee; USE IEEE.STD_LOGIC_1164.all; USE IEEE.NUMERIC_STD.all;

ENTITY lou JE
LUKA (op1: U std_logic_vector (7 DOLJE 0);
op2: U std_logic_vector (7 DOLJE 0);
proces: U std_logic_vector (3 DOLJE 0);
res: OUT std_logic_vector (7 DOLJE 0));
END loud;

ARHITEKTURA synth2 OF lou IS
SIGNAL a, b: NEPOTPISAN (op1'range);
SIGNAL c: NEPOTPISAN (res'range);
BEGIN
PROCES (a, b, proces)
BEGIN
CASE postupak JE
KADA je "0000" => c <= VELIČINA ((ne a), c'dužina);
KADA je "0001" => c <= VELIČINA ((a i b), c'dužina);
KADA je "0010" => c <= VELIČINA ((a ili b), c'dužina);

KADA je "0011" => c <= VELIČINA ((a xor b), c'dužina);
KADA je "0100" => c <= VELIČINA ((a i b), duljina);
KADA "0101" => c <= VELIČINA ((a ni b), c'dužina);
KADA OSTALO => null;
ENDCASE;
ZAVRŠI PROCES;

a <= NEPOTPISAN (op1);
b <= NEPOTPISAN (op2);
res <= std_logic_vector (c);

END synth2;

Aritmetička jedinica (ArU.vhd)

     BIBLIOTEKA ieee; USE IEEE.STD_LOGIC_1164.all; USE IEEE.NUMERIC_STD.all;

ENTITET aru IS
LUKA (op1: U std_logic_vector (7 DOLJE 0);
op2: U std_logic_vector (7 DOLJE 0);
proces: U std_logic_vector (3 DOLJE 0);
res: OUT std_logic_vector (7 DOLJE 0));
END aru;

ARHITEKTURA sint of Aru IS
SIGNAL a, b: NEPOTPISAN (op1'range);
SIGNAL c: NEPOTPISAN (res'range);
BEGIN
PROCES (a, b, proces)
BEGIN
CASE postupak JE
KADA je "0000" => c <= VELIČINA ((a + b), c'dužina);
KADA je "0001" => c <= VELIČINA ((a - b), duljina);
KADA je "0010" => c <= VELIČINA ((a * b), c'dužina);

KADA je "0011" => c <= VELIČINA ((a / b), c'dužina);
KADA je "0100" => c <= VELIČINA ((a + "1"), c'dužina);
KADA je "0101" => c <= VELIČINA ((b + "1"), duljina);
KADA OSTALO => null;
ENDCASE;
ZAVRŠI PROCES;

a <= NEPOTPISAN (op1);
b <= NEPOTPISAN (op2);
res <= std_logic_vector (c);

END synth;

Multiplexer (muxVector.vhd)

     BIBLIOTEKA ieee; USE IEEE.STD_LOGIC_1164.all; USE IEEE.NUMERIC_STD.all;

ENTITY muxVector JE
LUKA (iz ARU: U std_logic_vector (7 DOLJE 0);
fromLOU: U std_logic_vector (7 DOLJE 0);
prekidač: IN std_logic;
izlaz: out std_logic_vector (7 DOLJE 0));
END muxVector;

ARHITEKTURA promjena muxVector IS
BEGIN
sa prekidačem za odabir
izlaz <= iz ARU kada je '0', iz LOU kada drugi;
END promjena;

ALU komponenta (aluComponent.vhd)

     BIBLIOTEKA ieee; USE IEEE.STD_LOGIC_1164.all; USE IEEE.NUMERIC_STD.all;

ENTITY alu komponenta JE
END aluComponent;

ARHITEKTURA inputs_aluComponent of aluComponent IS

KOMPONENTA aru
LUKA (op1: U std_logic_vector (7 DOLJE 0);
op2: U std_logic_vector (7 DOLJE 0);
proces: U std_logic_vector (3 DOLJE 0);
res: OUT std_logic_vector (7 DOLJE 0));
KONAČNA KOMPONENTA;

KOMPONENTA lou
LUKA (op1: U std_logic_vector (7 DOLJE 0);
op2: U std_logic_vector (7 DOLJE 0);
proces: U std_logic_vector (3 DOLJE 0);
res: OUT std_logic_vector (7 DOLJE 0));
KONAČNA KOMPONENTA;

KOMPONENTA muxVector
LUKA (iz ARU: U std_logic_vector (7 DOLJE 0);
fromLOU: U std_logic_vector (7 DOLJE 0);
prekidač: IN std_logic;
izlaz: out std_logic_vector (7 DOLJE 0));
KONAČNA KOMPONENTA;

SIGNAL outputARU: std_logic_vector (7 DOLJE 0);
SIGNAL outputLOU: std_logic_vector (7 DOLJE 0);
Prekidač signala: std_logic;
signalni proces: std_logic_vector (3 DOLJE 0);
izlaz signala: std_logic_vector (7 DOLJE 0);
SIGNAL A: std_logic_vector (7 DOLJE 0);
SIGNAL B: std_logic_vector (7 DOLJE 0);

BEGIN
u0: aru PORT MAPA (A, B, proces, ARU izlaz);
u1: lou PORT MAPA (A, B, proces, LOU izlaz);
u2: muxVector PORT MAP (izlaz ARU, izlaz LOU, prekidač, izlaz);

A <= "00000011" nakon 0 ns, "00000111" nakon 5 ns, "00000111" nakon 10 ns, "00001001" nakon 15 ns, "00000000" nakon 20 ns, "00000101" nakon 25 ns, "00001111" nakon 30 ns, "00000101" nakon 35 ns;
B <= "00000010" nakon 0 ns, "00000100" nakon 5 ns, "00000010" nakon 10 ns, "00000011" nakon 15 ns, "00000100" nakon 20 ns, "00000110" nakon 25 ns, "00001111" nakon 30 ns, "00000011" nakon 35 ns;
prebacite <= '1' nakon 0 ns, '0' nakon 5 ns, '1' nakon 10 ns, '0' nakon 15 ns, '1' nakon 20 ns, '0' nakon 25 ns, '1' nakon 30 ns, '0' nakon 35 ns, '1' nakon 40 ns;
proces <= "0000" nakon 0 ns, "0001" nakon 5 ns, "0010" nakon 10 ns, "0011" nakon 15 ns, "0100" nakon 20 ns, "0101" nakon 25 ns, "0110" nakon 30 ns;
END inputs_aluComponent;

Da ne bismo trošili vrijeme na sastavljanje naredbi po naredbama dok smo radili na programu, u istu mapu spremamo datoteku koja se zove compilar.sh sa sljedećim sadržajem:

ghdl -a lou.vhd && ghdl -a aru.vhd && ghdl -a muxVector.vhd && ghdl -a aluComponente.vhd && ghdl -e aluComponente && ghdl -r aluComponent --vcd = alu & komponente.

Otvorite terminal, unesite mapu i pokrenite skriptu:

cd / home / user / vhdl sh compile.sh

Ako nema grešaka, gtkwave će se otvoriti i moći ćemo vidjeti signale:

Ovi su alati bili vrlo korisni i lakši za upotrebu od vlasničkih alata koje koristimo u nastavi, a kojima se sumnjivo predugo kompajlira. S ghdl je potrebno više vremena za promjenu prozora nego za kompajliranje.

Više informacija o VHDL-u

Za one koji su novi u vhdl, ovdje oni imaju osnovni primjer poricanja.

Primjer videozapisa:
http://www.youtube.com/watch?v=feVMXsyLSOU

Imajte na umu da najnovije verzije Ubuntua nemaju GHDL u svojim spremištima. Ovo se može preuzeti za Linux / Windows sa stranice projekta:
http://ghdl.free.fr/site/pmwiki.php?n=Main.Download


Komentar, ostavi svoj

Ostavite komentar

Vaša e-mail adresa neće biti objavljena. Obavezna polja su označena sa *

*

*

  1. Za podatke odgovoran: Miguel Ángel Gatón
  2. Svrha podataka: Kontrola neželjene pošte, upravljanje komentarima.
  3. Legitimacija: Vaš pristanak
  4. Komunikacija podataka: Podaci se neće dostavljati trećim stranama, osim po zakonskoj obavezi.
  5. Pohrana podataka: Baza podataka koju hostuje Occentus Networks (EU)
  6. Prava: U bilo kojem trenutku možete ograničiti, oporaviti i izbrisati svoje podatke.

  1.   Nacho rekao je

    Postoji li način na koji će vam GTKWave dati sklop vrata koji predstavlja?