Paano magtrabaho kasama ang vhdl gamit ang libreng software

Ang mga klase ng elektronikong Engineering ay karaniwang idinidikta gamit tanyag na mga tool, kaya lagi akong gumugol ng ilang oras na naghahanap upang gawin ang aking trabaho libreng software. Dahil dito, napagpasyahan kong ibahagi ang sumusunod gabay.

Ito ay isang kontribusyon mula sa pandacris, kaya't naging isa sa mga nagwagi sa aming lingguhang kompetisyon: «Ibahagi ang alam mo tungkol sa Linux«. Binabati kita!

Pag-install ng kinakailangan

Upang maiipon at gayahin ang aming mga programa gagamitin namin ang GHDL, isang libreng tagatala batay sa GCC. Upang makita ang mga resulta ng simulation, gagamitin namin ang GTKWAVE. Bilang isang editor inirerekumenda ko ang Geany dahil kinikilala nito ang halos lahat ng mga wika ng programa.

sudo apt-get install ghdl gtkwave geany

Isang halimbawang proyekto

Gamitin natin ang kumpare na ito bilang isang halimbawa:

Bago lumikha ng isang proyekto, magsimula tayo sa pamamagitan ng paglikha ng isang folder kung saan ang lahat ng mga file ay mai-host. Sa kasong ito, / home / user / vhdl. Doon ay mai-save natin ang source code ng aming mga programa gamit ang isang .vhd extension.

Pagkatapos, nagsusulat kami ng aming programa gamit ang Geany, tulad ng nakikita sa screenshot.

Ini-save namin ito bilang ihambing.vhd.

Huwag kalimutang i-save ang programa gamit ang extension .vhd upang makilala ni Geany ang format at kulayan ang mga nakareserba na salita.

Ngayon kakailanganin naming lumikha ng mga signal para sa simulation. Upang magawa ito, lilikha kami ng isang sangkap na gumagamit ng nakaraang pag-block at tutukuyin namin ang mga signal.

Ang mga linya A <= "0011" pagkatapos ng 0 ns, "0111" pagkatapos ng 5 ns, "0111" pagkatapos ng 10 ns; ay ang mga nag-configure ng mga input signal sa oras

Nai-save namin ang mga file sa / home / user / vhdl. Pagkatapos, magbubukas kami ng isang terminal at mag-compile:

ghdl -kumpara.vhd

Kung walang mga mensahe ng error, matagumpay ang pagtitipon.

Pinagsasama-sama namin ang "sangkap"

ghdl -kumpara ang_tb.vhd

Kung walang mga pagkakamali, nilikha namin ang maipapatupad:

ghdl -e ihambing ang_tb

Sa wakas, nananatili itong upang maisagawa ang simulation at i-save ang mga resulta sa isang pinangalanang "Compare.vcd"

ghdl -r ihambing_tb --vcd = ihambing.vcd

Upang makita ang mga resulta gagamitin namin ang gtkwave:

gtkwave ihambing.vcd

Sa sandaling bukas, gamitin ang Ctrl key at ang mouse upang ituro ang mga signal na kinagigiliwan namin at pindutin ang insert. Pagkatapos mag-double click sa mga vector upang makita ang magkakahiwalay na signal. Pagkatapos, mag-right click sa mga signal upang piliin ang format (binary, hex, octal, decimal, atbp.)

Kung kinakailangan, ang pindutan ng magnifying glass na may parisukat sa gitna ay inaayos ang graph sa screen.

ALU: yunit ng aritmetika at lohika

Okay, ngayon gumawa tayo ng isang bagay na mas kawili-wili: isang ALU (aritmethic at lohika unit). Ito ay magiging isang lohikal na yunit, isang yunit ng aritmetika at isang multiplexer.

Logical drive (LoU.vhdl)

     LIBRARY ieee; GAMITIN ANG IEEE.STD_LOGIC_1164.lahat; GAMITIN IEEE.NUMERIC_STD.all;

ENTITY lou IS
PORT (op1: IN std_logic_vector (7 Pababa sa 0);
op2: SA std_logic_vector (7 Pababa 0);
proseso: SA std_logic_vector (3 Pababa 0);
res: OUT std_logic_vector (7 Pababa 0));
WAKAS lou;

ARCHITECTURE synth2 NG lou IS
SIGNAL a, b: UNSIGNED (op1'range);
SIGNAL c: UNSIGNED (muling pagbabago);
BEGIN
PAMAMARAAN (a, b, proseso)
BEGIN
Ang proseso ng Kaso AY
KAPAG "0000" => c <= RESIZE ((not a), c'length);
KAPAG "0001" => c <= RESIZE ((a at b), c'length);
KAPAG "0010" => c <= RESIZE ((a o b), c'length);

KAPAG "0011" => c <= RESIZE ((a xor b), c'length);
KAPAG "0100" => c <= RESIZE ((a nand b), c'length);
KAPAG "0101" => c <= RESIZE ((a nor b), c'length);
KAPAG IBA => null;
KATAPUSANG KASO;
PROSESO NG PAGTATAPOS;

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

WAKAS synth2;

Yunit ng Arithmetic (ArU.vhd)

     LIBRARY ieee; GAMITIN ANG IEEE.STD_LOGIC_1164.lahat; GAMITIN IEEE.NUMERIC_STD.all;

ENTITY aru AY
PORT (op1: IN std_logic_vector (7 Pababa sa 0);
op2: SA std_logic_vector (7 Pababa 0);
proseso: SA std_logic_vector (3 Pababa 0);
res: OUT std_logic_vector (7 Pababa 0));
WAKAS aru;

ARCHITECTURE synth NG aru AY
SIGNAL a, b: UNSIGNED (op1'range);
SIGNAL c: UNSIGNED (muling pagbabago);
BEGIN
PAMAMARAAN (a, b, proseso)
BEGIN
Ang proseso ng Kaso AY
KAPAG "0000" => c <= RESIZE ((a + b), c'length);
KAPAG "0001" => c <= RESIZE ((a - b), c'length);
KAPAG "0010" => c <= RESIZE ((a * b), c'length);

KAPAG "0011" => c <= RESIZE ((a / b), c'length);
KAPAG "0100" => c <= RESIZE ((a + "1"), c'length);
KAPAG "0101" => c <= RESIZE ((b + "1"), c'length);
KAPAG IBA => null;
KATAPUSANG KASO;
PROSESO NG PAGTATAPOS;

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

Tapusin ang synth;

Multiplexer (muxVector.vhd)

     LIBRARY ieee; GAMITIN ANG IEEE.STD_LOGIC_1164.lahat; GAMITIN IEEE.NUMERIC_STD.all;

ENTITY muxVector AY
PORT (mula sa ARU: IN std_logic_vector (7 Pababa sa 0);
fromLOU: SA std_logic_vector (7 Pababa 0);
switch: IN std_logic;
output: out std_logic_vector (7 Pababa 0));
WAKAS muxVector;

Pagbabago ng ARKITEKTO NG muxVector AY
BEGIN
may switch select
output <= mula sa ARU kapag '0', mula sa LOU kapag ang iba;
Tapusin ang pagbabago;

ALU Component (aluComponent.vhd)

     LIBRARY ieee; GAMITIN ANG IEEE.STD_LOGIC_1164.lahat; GAMITIN IEEE.NUMERIC_STD.all;

ENTITY alu Component AY
WAKAS aluComponent;

Mga input ng ARCHITECTURE_aluComponent NG aluComponent AY

KONSEENTO aru
PORT (op1: IN std_logic_vector (7 Pababa sa 0);
op2: SA std_logic_vector (7 Pababa 0);
proseso: SA std_logic_vector (3 Pababa 0);
res: OUT std_logic_vector (7 Pababa 0));
WAKAS NA KOMPONEN;

COMPONENT lou
PORT (op1: IN std_logic_vector (7 Pababa sa 0);
op2: SA std_logic_vector (7 Pababa 0);
proseso: SA std_logic_vector (3 Pababa 0);
res: OUT std_logic_vector (7 Pababa 0));
WAKAS NA KOMPONEN;

Kumpanya muxVector
PORT (mula sa ARU: IN std_logic_vector (7 Pababa sa 0);
fromLOU: SA std_logic_vector (7 Pababa 0);
switch: IN std_logic;
output: out std_logic_vector (7 Pababa 0));
WAKAS NA KOMPONEN;

SIGNAL outputARU: std_logic_vector (7 Pababa sa 0);
SIGNAL outputLOU: std_logic_vector (7 Pababa sa 0);
signal Switch: std_logic;
proseso ng signal: std_logic_vector (3 Pababa sa 0);
output output: std_logic_vector (7 Pababa 0);
SIGNAL A: std_logic_vector (7 Pababa sa 0);
SIGNAL B: std_logic_vector (7 Pababa sa 0);

BEGIN
u0: aru PORT MAP (A, B, proseso, exit na ARU);
u1: lou PORT MAP (A, B, proseso, LOU output);
u2: muxVector PORT MAP (outputARU, outputLOU, switch, output);

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

Upang hindi masayang ang oras sa pag-iipon ng utos sa pamamagitan ng utos habang nagtatrabaho sa programa, nagse-save kami ng isang file na tinatawag na compilar.sh kasama ang sumusunod na nilalaman sa parehong folder:

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

Magbukas ng isang terminal, ipasok ang folder at patakbuhin ang script:

cd / home / user / vhdl sh compile.sh

Kung walang mga error ay magbubukas ang gtkwave at makikita namin ang mga signal:

Ang mga tool na ito ay naging lubhang kapaki-pakinabang at mas madaling gamitin kaysa sa mga pagmamay-ari na tool na ginagamit namin sa klase, na kahina-hinala na masyadong tumatagal upang maipon. Sa ghdl mas matagal ang paglipat ng windows kaysa sa compile.

Higit pang impormasyon tungkol sa VHDL

Para sa mga bago sa vhdl, dito mayroon silang pangunahing halimbawa ng isang nagtatanggi.

Isang halimbawang video:
http://www.youtube.com/watch?v=feVMXsyLSOU

Tandaan na ang pinakabagong mga bersyon ng Ubuntu ay walang GHDL sa kanilang mga repository. Maaari itong ma-download para sa Linux / Windows mula sa pahina ng proyekto:
http://ghdl.free.fr/site/pmwiki.php?n=Main.Download


Iwanan ang iyong puna

Ang iyong email address ay hindi nai-publish. Mga kinakailangang patlang ay minarkahan ng *

*

*

  1. Responsable para sa data: Miguel Ángel Gatón
  2. Layunin ng data: Kontrolin ang SPAM, pamamahala ng komento.
  3. Legitimation: Ang iyong pahintulot
  4. Komunikasyon ng data: Ang data ay hindi maiparating sa mga third party maliban sa ligal na obligasyon.
  5. Imbakan ng data: Ang database na naka-host ng Occentus Networks (EU)
  6. Mga Karapatan: Sa anumang oras maaari mong limitahan, mabawi at tanggalin ang iyong impormasyon.

  1.   Nacho dijo

    Mayroon bang anumang paraan na bibigyan ka ng GTKWave ng gate circuit na kinakatawan nito?