BEHAVIORAL DESCRIPTIONS
3. Ακολουθιακές Δηλώσεις (Sequential Statements)
Υπάρχουν κάποιες δηλώσεις (statements) που μπορούν να χρησιμοποιηθούν μόνο μέσα στο σώμα κάποιας διαδικασίας (process). Αυτές οι δηλώσεις καλούνται sequential statements επειδή εκτελούνται ακολουθιακά. Αυτό σημαίνει η μία μετά την άλλη, όπως αυτές εμφανίζονται στο σώμα της διαδικασίας, από την κορυφή ως το τέλος. Σε αυτή την ενότητα θα εξετάσουμε κάποιες από αυτές τις δηλώσεις (statements).
Το πρώτο παράδειγμα μας δείχνει την δήλωση if και μία κοινή χρήση ιδιότητας (attribute) της VHDL.
count : process (x)
variable cnt : integer :=0 ;
begin
if (x= ‘1’ and x’last_value= ‘0’ ) then
cnt := cnt+1;
end if;
end process;
Αυτή η δήλωση if έχει δύο κύρια μέρη, την συνθήκη (condition) και το σώμα της δήλωσης (statement body). Συνθήκη είναι κάθε έκφραση boolean (μία έκφραση που παίρνει τιμές TRUE ή FALSE , όπως είναι οι εκφράσεις που χρησιμοποιούν σχεσιακούς τελεστές). Η συνθήκη στο παράδειγμα χρησιμοποιεί την ιδιότητα (attribute) last_value , η οποία χρησιμοποιείται για να καθορίσει την τελευταία τιμή που είχε κάποιο σήμα. Οι ιδιότητες μπορούν να χρησιμοποιηθούν για να κρατήσουν αρκετές βοηθητικές πληροφορίες για τα σήματα. Η τιμή κάποιας ιδιότητας για ένα συγκεκριμένο σήμα αποκτάται με τον καθορισμό του ονόματος του σήματος ακολουθούμενο από ένα τικ ( ‘ ) και το όνομα της ιδιότητας που επιθυμούμε. Στο παράδειγμά μας η συνθήκη είναι TRUE μόνο αν η τρέχουσα τιμή του χ είναι ‘ 1 ‘ και η προηγούμενη τιμή του ήταν ‘ 0 ‘. Έκτοτε αυτή η δήλωση θα εκτελείται μόνο όταν συμβαίνει κάποιο γεγονός στο χ , η συνθήκη θα είναι true όταν μία υψωμένη πλευρά (rising edge) προκληθεί στο χ. Το σώμα των δηλώσεων (statement body) της δήλωσης if είναι μία λίστα από ακολουθιακές εντολές που εμφανίζονται μεταξύ των λέξεων κλειδιά then και end if .
Η εκτέλεση της if αρχίζει με τον υπολογισμό της συνθήκης. Αν η τιμή της συνθήκης είναι true τότε θα εκτελεστούν οι δηλώσεις που βρίσκονται στο σώμα των δηλώσεων. Αλλιώς η εκτέλεση θα συνεχιστεί μετά από το end if και το σώμα των δηλώσεων αγνοείται. Έτσι η δήλωση αποστολής (assignment statement) σε αυτό το παράδειγμα εκτελείται κάθε φορά που υπάρχει μία υψούμενη πλευρά στο σήμα χ και μετρά το πλήθος των υψούμενων πλευρών.
Ένα παράδειγμα μιάς άλλης φόρμας της if είναι :
….
if (inc = ‘1’) then
cnt := cnt+1 ;
else
cnt := cnt-1 ;
end if
…
Αυτή η φόρμα έχει δύο σώματα δηλώσεων. Αν η συνθήκη είναι true, η πρώτη λίστα δηλώσεων (ανάμεσα από το then και το else) εκτελείται ενώ η δεύτερη λίστα (ανάμεσα από το else και το end if ) δεν εκτελείται. Αν η συνθήκη είναι false εκτελείται η δεύτερη και όχι η πρώτη. Έτσι με αυτό το παράδειγμα θα αυξάνει η τιμή του cnt αν το cnt είναι ‘1’, ενώ θα μειώνεται η τιμή του cnt αν αυτό είναι ‘0’.
Μία άλλη δήλωση που θα δούμε είναι η loop. Θα εξετάσουμε μία φόρμα της δήλωσης αυτής, η οποία συχνά καλείται for statement. Η δήλωση for χρησιμοποιείται για να εκτελεστεί μία λίστα εντολών αρκετές φορές. Το παράδειγμα που ακολουθεί χρησιμοποιεί μία δήλωση loop για τον υπολογισμό της άρτιας ισοτιμίας (even parity) ενός bit vector.
signal x : bit_vector (7 downto 0) ;
…
process (x)
variable p : bit ;
begin
p:= ‘0’
for i in 7 downto 0 loop
p:= p xor x(i);
end loop;
end process;
Το σήμα x είναι ένα 8 bit σήμα που αναπαριστά ένα byte. Η μεταβλητή p χρησιμοποιείται για τον υπολογισμό του parity αυτού του byte. Το πρώτο μέρος του for loop “i in 7 downto 0 “ καλείται ορισμός παραμέτρων (parameter spefication). Αυτό ορίζει το πόσες φορές θα εκτελεστεί το σώμα του loop (loop body) και παράγει μία προσωρινή μεταβλητή. Αρχίζει με το όνομα της προσωρινής μεταβλητής που θα δημιουργηθεί, και στην περίπτωσή μας είναι η μεταβλητή i . Στην συνέχεια ακολουθεί η λέξη κλειδί in και ένα πεδίο τιμών όπως έχουμε και πιο πριν. Το σώμα του loop εκτελείται μία φορά για κάθε τιμή για το πεδίο τιμών που έχει ορισθεί. Η τιμή της προσωρινής μεταβλητής υπολογίζεται πρώτα για i=7, κατόπιν με i=6, ξανά με i=5 και συνεχίζει μέχρι το 0. Αυτή η εντολή loop συμπεριφέρεται το ίδιο με τις παρακάτω εντολές :
p := ‘0’ ;
p := p xor x(7) ;
p := p xor x(6) ;
p := p xor x(5) ;
p := p xor x(4) ;
p := p xor x(3) ;
p := p xor x(2) ;
p := p xor x(1) ;
p := p xor x(0) ;
Παρατηρούμε το πως η προσωρινή μεταβλητή χρησιμοποιείται στο σώμα εντολών του loop, για να λειτουργήσει σε διαφορετικά στοιχεία του vector (διανύσματος) x , κάθε φορά που εκτελείται το σώμα του loop. Αυτή είναι μία πολύ κοινή χρήση της loop statement. Αν και αυτό το loop περιέχει μόνο μία δήλωση, μπορεί να υπάρχουν πολλές δηλώσεις σε κάποιο loop body.