Πώς να εργαστείτε με το vhdl χρησιμοποιώντας δωρεάν λογισμικό

Τα μαθήματα του ηλεκτρονική Μηχανική συνήθως υπαγορεύονται από τη χρήση δημοφιλή εργαλεία, οπότε περνάω μερικές ώρες ψάχνοντας να κάνω τη δουλειά μου ελεύθερο λογισμικό. Για αυτόν τον λόγο, αποφάσισα να μοιραστώ τα ακόλουθα οδηγός.

Αυτή είναι μια συμβολή του pandacris, καθιστώντας έτσι έναν από τους νικητές του εβδομαδιαίου διαγωνισμού μας: «Μοιραστείτε ό, τι γνωρίζετε για το Linux«. Συγχαρητήρια!

Εγκατάσταση του απαραίτητου

Για να καταρτίσουμε και να προσομοιώσουμε τα προγράμματά μας, θα χρησιμοποιήσουμε το GHDL, έναν δωρεάν μεταγλωττιστή που βασίζεται στο GCC. Για να δούμε τα αποτελέσματα της προσομοίωσης, θα χρησιμοποιήσουμε το GTKWAVE. Ως συντάκτης, προτείνω τον Geany αφού αναγνωρίζει σχεδόν όλες τις γλώσσες προγραμματισμού.

sudo apt-get εγκατάσταση ghdl gtkwave geany

Ένα παράδειγμα έργου

Ας χρησιμοποιήσουμε αυτό το συγκριτικό ως παράδειγμα:

Πριν δημιουργήσουμε ένα έργο, ας ξεκινήσουμε δημιουργώντας ένα φάκελο όπου θα φιλοξενηθούν όλα τα αρχεία. Σε αυτήν την περίπτωση, / home / user / vhdl. Εκεί θα αποθηκεύσουμε τον πηγαίο κώδικα των προγραμμάτων μας με επέκταση .vhd.

Στη συνέχεια γράφουμε το πρόγραμμά μας χρησιμοποιώντας το Geany, όπως φαίνεται στο στιγμιότυπο οθόνης.

Το αποθηκεύουμε ως membandingkan.vhd.

Μην ξεχάσετε να αποθηκεύσετε το πρόγραμμα με την επέκταση .vhd έτσι ώστε ο Geany να αναγνωρίζει τη μορφή και να χρωματίζει τις δεσμευμένες λέξεις.

Τώρα θα χρειαστεί να δημιουργήσουμε τα σήματα για την προσομοίωση. Για να γίνει αυτό, θα δημιουργήσουμε ένα στοιχείο που χρησιμοποιεί το προηγούμενο μπλοκ και θα καθορίσουμε τα σήματα.

Οι γραμμές A <= "0011" μετά από 0 ns, "0111" μετά από 5 ns, "0111" μετά από 10 ns; είναι αυτές που διαμορφώνουν τα σήματα εισόδου εγκαίρως

Αποθηκεύουμε τα αρχεία στο / home / user / vhdl. Στη συνέχεια, ανοίγουμε ένα τερματικό και συλλέγουμε:

ghdl -a membandingkan.vhd

Εάν δεν υπάρχουν μηνύματα σφάλματος, η συλλογή είναι επιτυχής.

Τώρα καταρτίζουμε το "συστατικό"

ghdl -a membandingkan_tb.vhd

Εάν δεν υπάρχουν σφάλματα, δημιουργούμε το εκτελέσιμο:

ghdl -e σύγκριση_tb

Τέλος, παραμένει η εκτέλεση της προσομοίωσης και η αποθήκευση των αποτελεσμάτων σε αυτήν που ονομάζεται "membandingkan.vcd"

ghdl -r membandingkan_tb --vcd = membandingkan.vcd

Για να δούμε τα αποτελέσματα θα χρησιμοποιήσουμε το gtkwave:

gtkwave membandingkan.vcd

Μόλις ανοίξει, χρησιμοποιήστε το πλήκτρο Ctrl και το ποντίκι για να δείξετε τα σήματα που μας ενδιαφέρουν και πατήστε το ένθετο. Στη συνέχεια, κάντε διπλό κλικ στα διανύσματα για να δείτε τα ξεχωριστά σήματα. Στη συνέχεια, κάντε δεξί κλικ στα σήματα για να επιλέξετε τη μορφή (δυαδικό, εξάγωνο, οκταδικό, δεκαδικό κ.λπ.)

Εάν είναι απαραίτητο, το κουμπί μεγεθυντικού φακού με ένα τετράγωνο στο κέντρο προσαρμόζει το γράφημα στην οθόνη.

ALU: αριθμητική και λογική μονάδα

Εντάξει, τώρα ας κάνουμε κάτι πιο ενδιαφέρον: μια ALU (μονάδα aritmethic και logic). Θα είναι μια λογική μονάδα, μια αριθμητική μονάδα και ένας πολυπλέκτης.

Λογική μονάδα δίσκου (LoU.vhdl)

     ΒΙΒΛΙΟΘΗΚΗ ieee; ΧΡΗΣΗ IEEE.STD_LOGIC_1164.all; ΧΡΗΣΗ IEEE.NUMERIC_STD.all;

ΟΛΟΚΛΗΡΩΜΕΝΟ ΕΙΝΑΙ
PORT (op1: IN std_logic_vector (7 ΚΑΤΩ 0);
op2: IN std_logic_vector (7 ΚΑΤΩ 0);
διαδικασία: IN std_logic_vector (3 ΚΑΤΩ 0);
res: OUT std_logic_vector (7 ΚΑΤΩ 0));
ΤΕΛΟΣ lou;

ΑΡΧΙΤΕΚΤΟΝΙΚΗ synth2 OF lou IS
ΣΗΜΑΤΟΣ α, β: ΑΝΕΞΑΓΩΓΗ (op1'range);
SIGNAL c: UNSIGNED (αναδιάταξη);
ΑΡΧΙΖΟΥΝ
ΔΙΑΔΙΚΑΣΙΑ (α, β, διαδικασία)
ΑΡΧΙΖΟΥΝ
Η διαδικασία CASE ΕΙΝΑΙ
ΟΤΑΝ "0000" => c <= ΑΝΤΙΜΕΤΩΠΙΣΗ ((όχι a), c'length);
ΠΟΤΕ "0001" => c <= ΑΝΤΙΜΕΤΩΠΙΣΗ ((a και b), c'length);
ΟΤΑΝ "0010" => c <= ΑΝΤΙΜΕΤΩΠΙΣΗ ((a ή b), c'length);

ΠΟΤΕ "0011" => c <= ΑΝΤΙΜΕΤΩΠΙΣΗ ((a xor b), c'length);
ΟΤΑΝ "0100" => c <= ΑΝΤΙΜΕΤΩΠΙΣΗ ((a nand b), c'length);
ΠΟΤΕ "0101" => c <= ΑΝΤΙΜΕΤΩΠΙΣΗ ((a ούτε b), c'length);
ΠΟΤΕ ΑΛΛΑ => null;
ΤΕΛΟΣ ΠΕΡΙΠΤΩΣΗ
ΤΕΛΙΚΗ ΔΙΑΔΙΚΑΣΙΑ;

a <= ΑΠΟΣΤΟΛΗ (op1);
b <= ΑΠΟΣΤΟΛΗ (op2);
res <= std_logic_vector (γ);

ΤΕΛΟΣ synth2;

Αριθμητική μονάδα (ArU.vhd)

     ΒΙΒΛΙΟΘΗΚΗ ieee; ΧΡΗΣΗ IEEE.STD_LOGIC_1164.all; ΧΡΗΣΗ IEEE.NUMERIC_STD.all;

ENTITY aru ΕΙΝΑΙ
PORT (op1: IN std_logic_vector (7 ΚΑΤΩ 0);
op2: IN std_logic_vector (7 ΚΑΤΩ 0);
διαδικασία: IN std_logic_vector (3 ΚΑΤΩ 0);
res: OUT std_logic_vector (7 ΚΑΤΩ 0));
ΤΕΛΟΣ aru;

ARCHITECTURE synth OF aru είναι
ΣΗΜΑΤΟΣ α, β: ΑΝΕΞΑΓΩΓΗ (op1'range);
SIGNAL c: UNSIGNED (αναδιάταξη);
ΑΡΧΙΖΟΥΝ
ΔΙΑΔΙΚΑΣΙΑ (α, β, διαδικασία)
ΑΡΧΙΖΟΥΝ
Η διαδικασία CASE ΕΙΝΑΙ
ΠΟΤΕ "0000" => c <= ΑΝΤΙΜΕΤΩΠΙΣΗ ((a + b), c'length);
ΠΟΤΕ "0001" => c <= ΑΝΤΙΜΕΤΩΠΙΣΗ ((a - b), c'length);
ΠΟΤΕ "0010" => c <= ΑΝΤΙΜΕΤΩΠΙΣΗ ((a * b), c'length);

ΠΟΤΕ "0011" => c <= ΑΝΤΙΜΕΤΩΠΙΣΗ ((a / b), c'length);
ΠΟΤΕ "0100" => c <= ΑΝΤΙΜΕΤΩΠΙΣΗ ((a + "1"), c'length);
ΠΟΤΕ "0101" => c <= ΑΝΤΙΜΕΤΩΠΙΣΗ ((b + "1"), c'length);
ΠΟΤΕ ΑΛΛΑ => null;
ΤΕΛΟΣ ΠΕΡΙΠΤΩΣΗ
ΤΕΛΙΚΗ ΔΙΑΔΙΚΑΣΙΑ;

a <= ΑΠΟΣΤΟΛΗ (op1);
b <= ΑΠΟΣΤΟΛΗ (op2);
res <= std_logic_vector (γ);

ΤΕΛΟΣ synth;

Πολυπλέκτης (muxVector.vhd)

     ΒΙΒΛΙΟΘΗΚΗ ieee; ΧΡΗΣΗ IEEE.STD_LOGIC_1164.all; ΧΡΗΣΗ IEEE.NUMERIC_STD.all;

ENTITY muxVector ΕΙΝΑΙ
Θύρα (από ARU: IN std_logic_vector (7 ΚΑΤΩ 0);
απόLOU: IN std_logic_vector (7 DOWNTO 0);
διακόπτης: IN std_logic;
έξοδος: out std_logic_vector (7 ΚΑΤΩ 0));
ΤΕΛΟΣ muxVector;

ΑΡΧΙΤΕΚΤΟΝΙΚΗ αλλαγή του muxVector IS
ΑΡΧΙΖΟΥΝ
με διακόπτη επιλογή
έξοδος <= από ARU όταν '0', από LOU όταν άλλοι?
ΑΛΛΑΓΗ ΤΕΛΟΣ;

Συστατικό ALU (aluComponent.vhd)

     ΒΙΒΛΙΟΘΗΚΗ ieee; ΧΡΗΣΗ IEEE.STD_LOGIC_1164.all; ΧΡΗΣΗ IEEE.NUMERIC_STD.all;

ENTITY alu Component IS
ΤΕΛΟΣ aluComponent;

ARCHITECTURE inputs_aluComponent του aluComponent IS

ΣΥΣΤΑΤΙΚΟ aru
PORT (op1: IN std_logic_vector (7 ΚΑΤΩ 0);
op2: IN std_logic_vector (7 ΚΑΤΩ 0);
διαδικασία: IN std_logic_vector (3 ΚΑΤΩ 0);
res: OUT std_logic_vector (7 ΚΑΤΩ 0));
ΤΕΛΟΣ ΣΥΣΤΑΤΙΚΟ

ΣΥΣΤΑΤΙΚΟ lou
PORT (op1: IN std_logic_vector (7 ΚΑΤΩ 0);
op2: IN std_logic_vector (7 ΚΑΤΩ 0);
διαδικασία: IN std_logic_vector (3 ΚΑΤΩ 0);
res: OUT std_logic_vector (7 ΚΑΤΩ 0));
ΤΕΛΟΣ ΣΥΣΤΑΤΙΚΟ

Συστατικό muxVector
Θύρα (από ARU: IN std_logic_vector (7 ΚΑΤΩ 0);
απόLOU: IN std_logic_vector (7 DOWNTO 0);
διακόπτης: IN std_logic;
έξοδος: out std_logic_vector (7 ΚΑΤΩ 0));
ΤΕΛΟΣ ΣΥΣΤΑΤΙΚΟ

Έξοδος SIGNALARU: std_logic_vector (7 DOWNTO 0);
SIGNAL outputLOU: std_logic_vector (7 ΚΑΤΩ 0);
Διακόπτης σήματος: std_logic;
διαδικασία σήματος: std_logic_vector (3 ΚΑΤΩ 0);
έξοδος σήματος: std_logic_vector (7 ΚΑΤΩ 0);
ΣΗΜΑ Α: std_logic_vector (7 ΚΑΤΩ 0);
ΣΗΜΑ Β: std_logic_vector (7 ΚΑΤΩ 0);

ΑΡΧΙΖΟΥΝ
u0: aru PORT MAP (Α, Β, διεργασία, έξοδος ARU);
u1: lou PORT MAP (Α, Β, διαδικασία, έξοδος LOU);
u2: muxVector PORT MAP (έξοδος ARU, έξοδος LOU, διακόπτης, έξοδος);

A <= "00000011" μετά 0 ns, "00000111" μετά από 5 ns, "00000111" μετά από 10 ns, "00001001" μετά από 15 ns, "00000000" μετά από 20 ns, "00000101" μετά από 25 ns, "00001111" μετά από 30 ns, "00000101" μετά από 35 ns;
B <= "00000010" μετά 0 ns, "00000100" μετά 5 ns, "00000010" μετά από 10 ns, "00000011" μετά από 15 ns, "00000100" μετά από 20 ns, "00000110" μετά από 25 ns, "00001111" μετά από 30 ns, "00000011" μετά από 35 ns;
εναλλαγή <= "1" μετά 0 ns, "0" μετά από 5 ns, "1" μετά από 10 ns, "0" μετά από 15 ns, "1" μετά από 20 ns, "0" μετά από 25 ns, "1" μετά από 30 ns, "0" μετά από 35 ns, "1" μετά από 40 ns.
διαδικασία <= "0000" μετά 0 ns, "0001" μετά από 5 ns, "0010" μετά από 10 ns, "0011" μετά από 15 ns, "0100" μετά από 20 ns, "0101" μετά από 25 ns, "0110" μετά από 30 ns;
ΤΕΛΟΣ inputs_aluComponent;

Προκειμένου να μην χάσουμε χρόνο σύνταξης εντολής με εντολή ενώ εργαζόμαστε στο πρόγραμμα, αποθηκεύουμε ένα αρχείο που ονομάζεται compilar.sh με το ακόλουθο περιεχόμενο στον ίδιο φάκελο:

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

Ανοίξτε ένα τερματικό, εισαγάγετε το φάκελο και εκτελέστε το σενάριο:

cd / home / user / vhdl sh compile.sh

Εάν δεν υπάρχουν σφάλματα, το gtkwave θα ανοίξει και θα δούμε τα σήματα:

Αυτά τα εργαλεία ήταν πολύ χρήσιμα και ευκολότερα στη χρήση από τα ιδιόκτητα εργαλεία που χρησιμοποιούμε στην τάξη, τα οποία απαιτούν ύποπτα πολύ χρόνο για τη συλλογή. Με το ghdl απαιτείται περισσότερος χρόνος για την εναλλαγή των παραθύρων παρά για τη μεταγλώττιση.

Περισσότερες πληροφορίες σχετικά με το VHDL

Για όσους είναι νέοι στο vhdl, Aquí έχουν ένα βασικό παράδειγμα ενός denier.

Ένα παράδειγμα βίντεο:
http://www.youtube.com/watch?v=feVMXsyLSOU

Να θυμάστε ότι οι τελευταίες εκδόσεις του Ubuntu δεν διαθέτουν GHDL στα αποθετήρια τους. Αυτό μπορείτε να το κατεβάσετε για Linux / Windows από τη σελίδα του έργου:
http://ghdl.free.fr/site/pmwiki.php?n=Main.Download


Αφήστε το σχόλιό σας

Η διεύθυνση email σας δεν θα δημοσιευθεί. Τα υποχρεωτικά πεδία σημειώνονται με *

*

*

  1. Υπεύθυνος για τα δεδομένα: Miguel Ángel Gatón
  2. Σκοπός των δεδομένων: Έλεγχος SPAM, διαχείριση σχολίων.
  3. Νομιμοποίηση: Η συγκατάθεσή σας
  4. Κοινοποίηση των δεδομένων: Τα δεδομένα δεν θα κοινοποιούνται σε τρίτους, εκτός από νομική υποχρέωση.
  5. Αποθήκευση δεδομένων: Βάση δεδομένων που φιλοξενείται από τα δίκτυα Occentus (ΕΕ)
  6. Δικαιώματα: Ανά πάσα στιγμή μπορείτε να περιορίσετε, να ανακτήσετε και να διαγράψετε τις πληροφορίες σας.

  1.   Nacho dijo

    Υπάρχει τρόπος που το GTKWave θα σας δώσει το κύκλωμα πύλης που αντιπροσωπεύει;