ΚΑΤΑΣΚΕΥΑΖΟΝΤΑΣ ΜΙΑ ALU
Αυτό το παράδειγμα θα μας εισάγει στα βασικά της VHDL και θα μας δείξει την σχεδίαση ενός αρκετά σύνθετου συστήματος: μιας 8-bit ALU (Arithmetic Logic Unit). Η ALU είναι βασικό κατασκευαστικό τμήμα ενός ολοκληρωμένου υπολογιστικού συστήματος. Η ALU είναι υπεύθυνη για την εκτέλεση αριθμητικών πράξεων (όπως η πρόσθεση και η αφαίρεση) όπως επίσης και για την εκτέλεση λογικών πράξεων (όπως AND, XOR, OR).
Οι προδιαγραφές της ALU που θέλουμε να κατασκευάσουμε είναι:
Πράξη | Περιγραφή | Παράδειγμα | Κώδικας |
Πρόσθεση (+) | Προσθέτει δύο αριθμούς 8-bit | F = A + B | 000 |
Αφαίρεση (-) | Αφαιρεί δύο αριθμούς 8-bit | F = A – B | 001 |
AND | Προσθέτει τα bits δύο αριθμών | F = A AND B | 100 |
OR | Κάνει OR τα bits δύο αριθμών | F = A OR B | 101 |
NOT | Αρνητικοποιεί τα bits | NOT A | 110 |
XOR | Αποκλειστικό OR δύο αριθμών | C = A XOR B | 111 |
Ο κώδικας χρησιμοποιείται για την επιλογή της πράξης που θα εκτελέσει η ALU. Η έξοδος F είναι 8-bit όπως και οι είσοδοι Α και Β.
Ορίζοντας την ALU στην VHDL
Τώρα που έχουμε τις προδιαγραφές της ALU μπορούμε να αρχίσουμε να την περιγράφουμε στην VHDL.
Πρώτα ορίζουμε την οντότητα (entity) για την ALU. Η περιγραφή της οντότητας θα είναι κάπως έτσι:
library ieee ;
use ieee.std_logic_1164.all ;
use ieee.std_logic_arith.all ;
entity alu is
port ( A, B : in std_logic_vector(7 downto 0) ;
Code : in std_logic_vector(2 downto 0) ;
F : out std_logic_vector(7 downto 0) ) ;
end alu ;
Το όνομα της οντότητας είναι alu και όλες οι πόρτες ορίζονται μέσα στην οντότητα. Σε αυτό το παράδειγμα τα περισσότερα σήματα ορίζονται ως vectors. Επίσης πρέπει να καθορίσουμε την κατεύθυνση του κάθε σήματος. Οι είσοδοι είναι τύπου in και οι έξοδοι είναι τύπου out.
Οι τρεις πρώτες γραμμές είναι οδηγίες (directions) στον compiler και του λένε που βρίσκονται κάποιοι συγκεκριμένοι ορισμοί. Αυτό είναι κάτι ανάλογο με την #include της γλώσσας C.
Το επόμενο που χρειαζόμαστε είναι μία architecture για αυτήν την οντότητα. Η architecture είναι αυτό που στην πραγματικότητα περιγράφει την λειτουργικότητα της σχεδίασης. Στην πραγματικότητα υπάρχουν πολλοί τρόποι για να ορίσουμε την λειτουργικότητα αυτής της ALU. Ο σκοπός μας είναι να κάνουμε τα πράγματα να διαβάζονται από τους ανθρώπους αλλά και να είναι αρκετά λεπτομερή, έτσι ώστε αργότερα να μπορούμε να τρέξουμε τον κώδικα και να εξομοιώσουμε την σχεδίασή μας για να δούμε αν δουλεύει, όπως εμείς επιθυμούμε. Για αυτό το παράδειγμα θα χρησιμοποιήσουμε την Behavioral Description η οποία θα περιγράψει την λειτουργία του συστήματος, αλλά δεν θα μπει σε λεπτομέρειες του πως είναι στην πραγματικότητα φτιαγμένο.
Η VHDL μοιάζει στην σύνταξη με γλώσσες προγραμματισμού όπως είναι η C και η Pascal. Φυσικά υπάρχουν διαφορές, αλλά η βασική λογική κατασκευή πρέπει να είναι παρόμοια σε αυτούς που έχουν δει μία γλώσσα προγραμματισμού. Ας δούμε τώρα πως μπορούμε να γράψουμε την περιγραφή της ALU .
library std_developerskit ;
use std_developerskit.std_regpak.all ;
architecture behav of alu is
begin
with code select
F <= (A+B) after 5 ns when “000” ,
(A-B) after 5 ns when “001” ,
(A and B) after 5 ns when “100” ,
(A or B) after 5 ns when “101”,
not (A) after 5 ns when “110”,
(A xor B) after 5 ns when “111”,
A after 5 ns when others ;
end behav ;
Οι δύο πρώτες γραμμές χρησιμοποιούνται για να πουν στον compiler που βρίσκονται κάποιες στάνταρ βιβλιοθήκες. Μετά από αυτές αρχίζει η πραγματική δουλειά. Η δήλωση της αρχιτεκτονικής (architecture statement) μας λέει το όνομα αυτής της architecture, το οποίο είναι behav, καθώς επίσης και ποια οντότητα αυτή περιγράφει (και είναι η οντότητα alu). Μιας και έχει γίνει αυτό, μπορούμε να γράψουμε τον κώδικα που περιγράφει την λειτουργία του συστήματος.
Υπάρχουν πολλοί τρόποι για να γίνει αυτό. Μπορούμε να χρησιμοποιήσουμε τις δηλώσεις (statements) IF / THEN / ELSE για παράδειγμα, αλλά η δήλωση (statement) WITH / SELECT είναι πολύ συμπαγής και εύκολη να διαβαστεί. Ο κώδικας μας λέει ότι με την είσοδο Code επιλέγουμε η τιμή του F να είναι η πρόσθεση του Α και Β όταν το code είναι 000, η τιμή του F να είναι η διαφορά των Α και Β όταν το code είναι 001 , κ.ο.κ. . Μαζί με τον ορισμό της λειτουργίας της εξόδου υπάρχει και ένας ορισμός χρόνου. Αυτό είναι απλώς ένας τρόπος για να μοντελοποιήσουμε ότι το σύστημα έχει μία χρονική καθυστέρηση από την στιγμή που επιλέγουμε την πράξη μέχρι να αλλάξει η έξοδος. Σε αυτήν την περίπτωση η έξοδος θα αλλάξει 5 ns μετά την αλλαγή του code, άσχετα από την πράξη που επιλέχθηκε.
Μία σωστή VHDL σχεδίαση περιέχει μία οντότητα (entity) και μία αρχιτεκτονική (architecture) μαζί. Μπορούμε να εισάγουμε αυτές σε ξεχωριστά αρχεία ή στο ίδιο αρχείο. Αυτό είναι προσωπική επιλογή. Στο παράδειγμά μας υποθέτουμε ότι βρίσκονται σε διαφορετικά αρχεία. Αυτό μας επιτρέπει να αναπτύξουμε πολλές αρχιτεκτονικές για την ίδια οντότητα χωρίς την ανάγκη να κάνουμε compile τα πάντα κάθε φορά.