ΗΥ220 Εργαστήριο Ψηφιακών Κυκλωµάτων

Σχετικά έγγραφα
Εργαστήριο Ψηφιακών Κυκλωμάτων

ΗΥ220 Εργαστήριο Ψηφιακών Κυκλωμάτων

HY430 Εργαστήριο Ψηφιακών Κυκλωμάτων. Πολυπλέκτες Καμπύλη Παρέτο. Κωδικοποιητές/Από-κωδικοποιητές D FF

ΗΥ220 Εργαστήριο Ψηφιακών Κυκλωμάτων

HY430 Εργαςτήριο Ψηφιακών Κυκλωμάτων. Πολυπλζκτεσ Καμπφλθ Παρζτο. Κωδικοποιθτζσ/Από-κωδικοποιθτζσ D FF

ΗΥ220 Εργαστήριο Ψηφιακών Κυκλωμάτων

ΗΥ220 Εργαστήριο Ψηφιακών Κυκλωµάτων

ΗΥ220 Εργαστήριο Ψηφιακών Κυκλωμάτων

ΗΥ220 Εργαστήριο Ψηφιακών Κυκλωμάτων

ΗΥ220 Εργαστήριο Ψηφιακών Κυκλωμάτων

ΗΥ-225. Verilog HDL. Τα βασικά...

ΗΥ220 Εργαστήριο Ψηφιακών Κυκλωμάτων

Εργαστήριο Ψηφιακών Κυκλωμάτων. Χειμερινό Εξάμηνο

ΗΥ220 Εργαστήριο Ψηφιακών Κυκλωµάτων

VERILOG. Γενικά περί γλώσσας

HY130 Ψηφιακή Σχεδίαση

«Σχεδιασμός Ολοκληρωμένων Κυκλωμάτων» Χειμερινό εξάμηνο Ακολουθιακός Κώδικας

ΗΥ220 Εργαστήριο Ψηφιακών Κυκλωμάτων

ΠΛΕ- 027 Μικροεπεξεργαστές 4ο μάθημα: γλώσσα περιγραφής υλικού Verilog

ΗΥ220 Εργαστήριο Ψηφιακών Κυκλωµάτων

Εισαγωγή στη Verilog

ΗΥ225 Οργάνωση Υπολογιστών. Εισαγωγή στη Verilog

Εργαστήριο Οργάνωσης Η/Υ. Δαδαλιάρης Αντώνιος

Σχεδίαση Ψηφιακών Συστημάτων

ΜΥΥ- 402 Αρχιτεκτονική Υπολογιστών Γλώσσα περιγραφής υλικού: Verilog

ΑΣΚΗΣΗ 2: Σχεδίαση και προσομοίωση κυκλωμάτων καταχωρητών και μετρητών

Εργαστήριο Ψηφιακών Κυκλωμάτων

Σχεδίαση Ψηφιακών Συστημάτων

Επιβεβαίωση ορθής λειτουργίας απλών ψηφιακών κυκλωμάτων

ΗΥ220 Εργαστήριο Ψηφιακών Κυκλωµάτων Τµήµα Επιστήµης Υπολογιστών Χειµερινό Εξάµηνο

ΗΥ220 Εργαστήριο Ψηφιακών Κυκλωμάτων

ΗΜΥ 210 ΣΧΕΔΙΑΣΜΟΣ ΨΗΦΙΑΚΩΝ ΣΥΣΤΗΜΑΤΩΝ. Χειµερινό Εξάµηνο 2016 Συµπληρωµατική ΔΙΑΛΕΞΗ 14: Περιγραφή Ακολουθιακών Κυκλωµάτων στη VHDL

Αρχιτεκτονική Υπολογιστών

Εισαγωγή στη Verilog με το ISE

Μετρητής Ριπής ΛΟΓΙΚΗ ΣΧΕΔΙΑΣΗ. Αναφορά 9 ης. εργαστηριακής άσκησης: ΑΦΡΟΔΙΤΗ ΤΟΥΦΑ Α.Μ.:

ΕΙΣΑΓΩΓΙΚΟ ΕΓΧΕΙΡΙ ΙΟ ΓΙΑ ΣΧΕ ΙΑΣΜΟ ΜΕ ΧΡΗΣΗ ΤΗΣ ΓΛΩΣΣΑΣ VHDL

«Σχεδιασμός Ολοκληρωμένων Κυκλωμάτων» Χειμερινό εξάμηνο Συντρέχων Κώδικας

Τέτοιες λειτουργίες γίνονται διαμέσου του

Κυριάκης - Μπιτζάρος Ευστάθιος Τμήμα Ηλεκτρονικών Μηχανικών Τ.Ε.

ΗΜΥ211 Εργαστήριο Ψηφιακών Συστημάτων

Library, package και subprograms

HY220 Pipelines and FSMs Χειμεριν Χειμερι ό Εξ άμη Εξ ν άμη ο

ΗΥ220 Εργαστήριο Ψηφιακών Κυκλωμάτων

ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ Ανώτατο Εκπαιδευτικό Ίδρυμα Πειραιά Τεχνολογικού Τομέα. Σχεδίαση Ψηφιακών Συστημάτων. Ενότητα: ΚΑΤΑΧΩΡΗΤΕΣ - ΑΠΑΡΙΘΜΗΤΕΣ

Εργαστήριο Αρχιτεκτονικής Υπολογιστών Ι. Εισαγωγή στη VHDL

7 η Θεµατική Ενότητα : Εισαγωγή στις Γλώσσες Περιγραφής Υλικού

Μοντέλα. χαρακτηριστικά χωρίς να συνοδεύεται από λεπτοµέρειες.

Επεξεργαστής Υλοποίηση ενός κύκλου μηχανής

Επεξεργαστής Υλοποίηση ενός κύκλου μηχανής

H γλώσσα περιγραφής κυκλωµάτων VHDL

ΗΜΥ 210 ΣΧΕΔΙΑΣΜΟΣ ΨΗΦΙΑΚΩΝ ΣΥΣΤΗΜΑΤΩΝ. Χειµερινό Εξάµηνο 2016 ΔΙΑΛΕΞΗ 15: Καταχωρητές (Registers)

8 η Θεµατική Ενότητα : Εισαγωγή στις Γλώσσες Περιγραφής Υλικού: Μοντέλα Συνδυαστικών Κυκλωµάτων

VHDL για Σχεδιασµό Ακολουθιακών Κυκλωµάτων

ΗΥ220: Εργαστήριο σχεδίασης ψηφιακών κυκλωμάτων Χριστόφορος Κάχρης

ΗΥ220 Εργαστήριο Ψηφιακών Κυκλωµάτων

«Σχεδιασμός Ολοκληρωμένων Κυκλωμάτων» Χειμερινό εξάμηνο Μηχανές Πεπερασμένων Καταστάσεων

ΗΥ220 Εργαστήριο Ψηφιακών Κυκλωµάτων Τµήµα Επιστήµης Υπολογιστών Χειµερινό Εξάµηνο

Ψηφιακή Σχεδίαση Ενότητα 10:

Ακολουθιακές εντολές. (Peter Ashenden, The Students Guide to VHDL)

Εργαστήριο Οργάνωσης Η/Υ. Δαδαλιάρης Αντώνιος

Μικροηλεκτρονική - VLSI

ΗΥ220 Εργαστήριο Ψηφιακών Κυκλωµάτων Τµήµα Επιστήµης Υπολογιστών Χειµερινό Εξάµηνο

Οδηγίες εγκατάστασης και χρήσης του Quartus

Behavioral & Mixed VHDL Architectures Finite State Machines in VHDL

Μελέτη και σχεδίαση µιας υποτυπώδους κεντρικής µονάδας επεξεργασίας στα 32 µπιτ.

ΗΥ220 Εργαστήριο Ψηφιακών Κυκλωµάτων

«Σχεδιασμός Ολοκληρωμένων Κυκλωμάτων» Χειμερινό εξάμηνο Προχωρημένα Θέματα Σχεδιασμού με VHDL

ΠΛΕ- 027 Μικροεπεξεργαστές 5ο μάθημα: Αρχιτεκτονική πυρήνα: υλοποίηση ενός κύκλου

ΗΜΥ 210 ΣΧΕΔΙΑΣΜΟΣ ΨΗΦΙΑΚΩΝ ΣΥΣΤΗΜΑΤΩΝ. Χειµερινό Εξάµηνο 2016 ΔΙΑΛΕΞΗ 18: Διαδικασία Σχεδίασης Ψηφιακών Συστηµάτων - Επανάληψη

Περίληψη. ΗΜΥ-210: Λογικός Σχεδιασµός Εαρινό Εξάµηνο Παράδειγµα: Καταχωρητής 2-bit. Καταχωρητής 4-bit. Μνήµη Καταχωρητών

Χρονισμός και Απόδοση Υπολογιστικών Συστημάτων

Behavioral & Mixed VHDL Architectures Finite State Machines in VHDL

ΤΕΧΝΙΚΕΣ ΑΥΞΗΣΗΣ ΤΗΣ ΑΠΟΔΟΣΗΣ ΤΩΝ ΥΠΟΛΟΓΙΣΤΩΝ I

Σχεδίαση Ψηφιακών Συστημάτων

Πρόγραμμα Μεταπτυχιακών Σπουδών «Πληροφορική και Εφαρμογές»

ΗΥ 232 Οργάνωση και στον Σχεδίαση Η/Y. Διάλεξη 8. Concepts of Digital Design Introduction to Verilog

Καταχωρητες (Registers) Μετρητες (Counters)

Ενότητα ΑΡΧΕΣ ΑΚΟΛΟΥΘΙΑΚΗΣ ΛΟΓΙΚΗΣ LATCHES & FLIP-FLOPS

ΠΑΡΑΡΤΗΜΑ Β. Verification

ΗΜΥ 210: Σχεδιασμός Ψηφιακών Συστημάτων. VHDL για Ακολουθιακά Κυκλώματα 1

Χρονισμός Σύγχρονων Κυκλωμάτων, Καταχωρητές και Μανταλωτές. Χειμερινό Εξάμηνο

Περιγραφή Κυκλωμάτων με χρήση της VHDL. Εισαγωγικές έννοιες για σχεδιασμό με τη VHDL

26-Nov-09. ΗΜΥ 210: Λογικός Σχεδιασμός, Χειμερινό Εξάμηνο Καταχωρητές 1. Διδάσκουσα: Μαρία Κ. Μιχαήλ

Κυκλωμάτων» Χειμερινό εξάμηνο

Εργαστήριο Οργάνωσης Η/Υ. Δαδαλιάρης Αντώνιος

«Σχεδιασμός Ψηφιακών Συστημάτων σε FPGA» Εαρινό εξάμηνο Διάλεξη 8 η : Μηχανές Πεπερασμένων Κaταστάσεων σε FPGAs

VHDL Εισαγωγικές έννοιες

ΚΑΣΣΙΑΝΟΣ ΜΕΛΑΝΙΤΗΣ. Αποκωδικοποιητής ΛΟΓΙΚΗ ΣΧΕΔΙΑΣΗ. Αναφορά 8 ης εργαστηριακής άσκησης: Α.Μ.:

Αρχιτεκτονική Υπολογιστών

ΗΥ220: Εργαστήριο Ψηφιακών Κυκλωµάτων Τµήµα Επιστήµης Υπολογιστών Πανεπιστήµιο Κρήτης Χειµερινό Εξάµηνο

Μοντέλα Αρχιτεκτονικής στην Σύνθεση

ΗΜΥ 210: Λογικός Σχεδιασµός, Εαρινό Εξάµηνο Ένα συνδυαστικό κύκλωµα µπορεί να περιγραφεί από: Φεβ-05. n-είσοδοι

ΑΣΚΗΣΗ 7 FLIP - FLOP

Εισαγωγή στην πληροφορική -4

ΗΜΥ 210 ΣΧΕΔΙΑΣΜΟΣ ΨΗΦΙΑΚΩΝ ΣΥΣΤΗΜΑΤΩΝ. Χειµερινό Εξάµηνο 2016 ΔΙΑΛΕΞΗ 16: Μετρητές (Counters)

Εργαστήριο Οργάνωσης Η/Υ. Δαδαλιάρης Αντώνιος

UNIVERSITY OF CALIFORNIA. EECS 150 Fall ) You are implementing an 4:1 Multiplexer that has the following specifications:

και η µονάδα ελέγχου (control) O επεξεργαστής: Η δίοδος δεδοµένων (datapath) Εντολές διακλάδωσης (branch beq, bne) I Type Σχεδίαση datapath

ΗΜΥ 210: Σχεδιασμός Ψηφιακών Συστημάτων. Καταχωρητές 1

Σειρά Ασκήσεων 11: Βασική FSM Ελέγχου του Επεξεργαστή

Transcript:

ΗΥ220 Εργαστήριο Ψηφιακών Κυκλωµάτων Χειµερινό Εξάµηνο 2006-2007 Verilog: Στυλ Κώδικα και Synthesizable Verilog ΗΥ220 - Βασίλης Παπαευσταθίου 1

Τα στυλ του κώδικα Τρεις βασικές κατηγορίες Συµπεριφοράς -Behavioral Μεταφοράς Καταχωρητών - Register Transfer Level (RTL) οµικός - Structural Και εµάς τι µας νοιάζει; ιαφορετικός κώδικας για διαφορετικούς σκοπούς Synthesizable ή όχι; ΗΥ220 - Βασίλης Παπαευσταθίου 2

Behavioral (1/3) Ενδιαφερόµαστε για την συµπεριφορά των blocks Αρχικό simulation Επιβεβαίωση αρχιτεκτονικής Test benches Απο απλά µέχρι εκλεπτυσµένα initial begin begin reset reset everything always @(posedge clk) clk) begin begin case case (opcode) 8 hab: RegFile[dst] = #2 #2 in; in; 8 hef: dst dst = #2 #2 in0 in0 + in1; in1; 8 h02: Memory[addr] = #2 #2 data; data; case if if (branch) dst dst = #2 #2 br_addr; ΗΥ220 - Βασίλης Παπαευσταθίου 3

Behavioral (2/3) Περισσότερες εκφράσεις for / while functions tasks fork join Περισσότεροι τύποι integer real πίνακες! integer sum, sum, i; i; integer opcodes [31:0]; real real average; initial for for (i=0; (i=0; i<32; i<32; i=i+1) opcodes[i] = 0; 0; always @(posedge clk) clk) begin begin sum sum = sum sum + 1; 1; average = average + (c (c / sum); sum); opcodes[d] = sum; sum; $display( sum: %d, %d, avg: avg: %f, %f, sum, sum, average); ΗΥ220 - Βασίλης Παπαευσταθίου 4

Behavioral (3/3) module define period 20 test; test; 20 initial begin task begin task ShowValues; reset_ = 1 b0; input 1 b0; input [7:0] [7:0] data; data; reset_ = #(2*`period + 5) 5) 1 b1; $display(..., 1 b1; data); task @(branch); reset_ = 1 b0; 1 b0;...... reset_ = #(2*`period + 5) 5) 1 b1; 1 b1; always @(posedge clk) clk) ShowValues(counter);...... always module @(negedge reset_) begin begin fork fork a = #2 #2 8 h44; b = #(4*`period + 2) 2) 1 b0; 1 b0; c = #(16*`period + 2) 2) 8 h44; join join ΗΥ220 - Βασίλης Παπαευσταθίου 5

Register Transfer Level - RTL Το πιο διαδεδοµένο και υποστηριζόµενο µοντελο για synthesizable κώδικα Κάθε block κώδικα αφορά την είσοδο λίγων καταχωρητών Σχεδιάζουµε κύκλο-κύκλο µε «οδηγό» το ρολόι Εντολές: Λιγότερες όχι τόσο περιοριστικές Think Hardware! Combinatorial Logic ΗΥ220 - Βασίλης Παπαευσταθίου 6

Ο SSDecoder του Lab0 είναι RTL reg reg [7:0] [7:0] SegData; always @( @( i_numberin ) begin begin case case ( i_numberin ) 3'b000: SegData <= <= 8'h3F; 3'b001: SegData <= <= 8'h06;...... default: begin begin SegData <= <= 8'h80; case reg reg [7:0] [7:0] o_segdata_n; always @(posedge Clk) Clk) begin begin if if ( ~Rst_n ) begin begin o_segdata_n <= <= #`dh #`dh 8'hFF; else else begin begin o_segdata_n <= <= #`dh #`dh ~SegData; ΗΥ220 - Βασίλης Παπαευσταθίου 7

Structural Αυστηρότατο µοντέλο Μόνο module instantiations Συνήθως για το top-level module Καλύτερη η αυστηρή χρήση του module top; top; wire wire clk, clk, reset; wire wire [31:0] d_data, I_data; wire wire [9:0] [9:0] d_adr; wire wire [5:0] [5:0] i_adr; clock clock clk0(clk); processor pr0(clk, reset, d_adr, d_data, i_adr, i_data,...);...); memory #10 #10 mem0(d_adr, d_data); memory #6 #6 mem1(i_adr, i_data); tester tst0(reset,...);...); module ΗΥ220 - Βασίλης Παπαευσταθίου 8

και µερικές συµβουλές Ονοµατολογία Όχι πολύ µεγάλα / µικρά ονόµατα µενόηµα Συνδυαστική λογική Όχι όλα σε µια γραµµή Ο compiler ξέρει καλύτερα Αναγνωσιµότητα οµή Πολλές οντότητες Ε όχι και τόσες! Χρησιµοποιήστε indentation Καλύτερη οµαδοποίηση Αναγνωσιµότητα wire wire a, a, controller_data_now_ready; wire wire drc_rx_2, twra_malista; if if (~req (~req && && ((flag & prv_ack) ~set) ~set) && && (count-2 == == 0)) 0))...... ΗΥ220 - Βασίλης Παπαευσταθίου 9

περισσότερες συµβουλές ιευκολύνουν την ανάγνωση και την χρήση του κώδικα (filters, tools etc) Είσοδοι ξεκινούν µε i_* Οι έξοδοι µε o_* Οι τρικατάστατες µε io_* Εκτός από ρολόι και reset Τα active low σήµατα τελειώνουν µε *_n Συνδέσεις πορτών συσχετίζοντας ονόµατα module adder(o_sum, i_in1, i_in2); adder i0_adder ( instance names i0_adder, i1_adder.i_in2(b),.i_in1(a),.o_sum(c) ) o_sum = C, i_in1 = A, i_in2 = B ΗΥ220 - Βασίλης Παπαευσταθίου 10

Σχόλια Ακούγεται µονότονο, αλλά Κώδικας hardware πιο δύσκολος στην κατανόηση Ακόµα και ο σχεδιαστής ξεχνάει γρήγορα Αν δε µπουν στην αρχή, δε µπαίνουν ποτέ Σηµεία κλειδιά Σε κάθε module Σε κάθε block /*************************** * Comments on on module test: test: * Module test test comprises of of * the the following components **************************/ module test; test; Line Line comment ΗΥ220 - Βασίλης Παπαευσταθίου 11

Verilog and Synthesis Χρήσεις της Verilog Μοντελοποίηση και event-driven προσοµοίωση Προδιαγραφές κυκλώµατος για σύνθεση (logic synthesis) Logic Synthesis Μετατροπή ενός υποσυνόλου της Verilog σε netlist Register Inference, combinatorial logic Βελτιστοποίηση του netlist (area,speed) ΗΥ220 - Βασίλης Παπαευσταθίου 12

Synthesizable Verilog Constructs Construct Type Keywords Notes ports parameters input, output and inout parameter module definition module, module signals and variables wire, reg, tri instantiations module instances, primitive gates e.g. mymux(o,i0,i1,s) e.g. nand(out,a,b) procedural always, if, else, case initial not supported procedural blocks begin, data flow assign Delay ignored Operators +,-, &,, ~,!=, ==, etc Caution: *, /, % functions / tasks function, task Limited support(simple CL) Loops for, while, Limited support(assigns) ΗΥ220 - Βασίλης Παπαευσταθίου 13

Register D Flip Flop module Reg(Q, D, Clk); parameter N = 16; input Clk; input [N-1:0] D; output [N-1:0] Q; reg [N-1:0] Q; always @(posedge Clk) Q <= #`dh D; module ΗΥ220 - Βασίλης Παπαευσταθίου 14

Register with Asynchronous Reset module RegRst(Q, D, Reset_n, Clk); parameter N = 16; input Reset_n, Clk; input [N-1:0] D; output [N-1:0] Q; reg [N-1:0] Q; always @(posedge Clk or negedge Reset_n) begin if (~Reset_n) Q <= #`dh 0; else Q <= #`dh D; module ΗΥ220 - Βασίλης Παπαευσταθίου 15

Register with Synchronous Reset module RegRst(Q, D, Reset_n, Clk); parameter N = 16; input Reset_n, Clk; input [N-1:0] D; output [N-1:0] Q; reg [N-1:0] Q; always @(posedge Clk) begin if (~Reset_n) Q <= #`dh 0; else Q <= #`dh D; module ΗΥ220 - Βασίλης Παπαευσταθίου 16

Register with Load Enable module RegLd(Q, D, Ld, Clk); parameter N = 16; input Ld, Clk; input [N-1:0] D; output [N-1:0] Q; reg [N-1:0] Q; always @(posedge Clk) if (Ld) Q <= #`dh D; module ΗΥ220 - Βασίλης Παπαευσταθίου 17

Set Clear flip-flop with Strong Clear module scff(out, Set, Clear, Clk); output Out; input Set, Clear, Clk; reg Out; always @(posedge Clk) Out <= #`dh (Out Set) & ~Clear; module ΗΥ220 - Βασίλης Παπαευσταθίου 18

Set Clear flip-flop with Strong Set module Scff(Out, Set, Clear, Clk); output Out; input Set, Clear, Clk; reg Out; always @(posedge Clk) Out <= #`dh Set (Out & ~Clear); module ΗΥ220 - Βασίλης Παπαευσταθίου 19

T Flip Flop module Tff(Out, Toggle, Clk); output Out; input Toggle, Clk; reg Out; always @(posedge Clk) if (Toggle) Out <= #`dh ~Out; module ΗΥ220 - Βασίλης Παπαευσταθίου 20

Multiplexor 2 to 1 module mux2(out, In1, In0, Sel); parameter N = 16; output [N-1:0] Out; input [N-1:0] In1, In0; input Sel; wire [N-1:0] Out = Sel? In1 : In0; module ΗΥ220 - Βασίλης Παπαευσταθίου 21

Multiplexor 4 to 1 module mux4(out, In3, In2, In1, In0, Sel); parameter N = 32; input [ 1:0] Sel; input [N-1:0] In3, In2, In1, In0; output [N-1:0] Out; reg [N-1:0] Out; always @(In0 or In1 or In2 or In3 or Sel) begin case ( Sel ) 2'b00 : Out <= In0; 2'b01 : Out <= In1; 2'b10 : Out <= In2; 2'b11 : Out <= In3; case module ΗΥ220 - Βασίλης Παπαευσταθίου 22

Positive Edge Detector module PosEdgDet(Out, In, Clk); input In, Clk; output Out; reg Tmp; always @(posedge Clk) Tmp <= #`dh In; wire Out = ~Tmp & In; module ΗΥ220 - Βασίλης Παπαευσταθίου 23

Tristate Driver module Tris(TrisOut, TrisIn, TrisOen_n); parameter N = 32; input [N-1:0] TrisIn; input TrisOen_n; output [N-1:0] TrisOut; wire [N-1:0] TrisOut = ~TrisOen_n? TrisIn : bz; module ΗΥ220 - Βασίλης Παπαευσταθίου 24

Mux4t1 RegLd Tris module MuxRegTris(Out, In0, In1, In2, In3, Select, Ld, TrisEn, Clk); parameter N = 32; input Ld, TrisEn, Clk; input [ 1:0] Select; input [N-1:0] In0, In1, In2, In3; output [N-1:0] Out; reg [N-1:0] MuxReg; always @(posedge Clk) begin if(ld) begin case(select) 0 : MuxReg <= In0; 1 : MuxReg <= In1; 2 : MuxReg <= In2; 3 : MuxReg <= In3; case wire [N-1:0] Out = TrisEn? MuxReg : 'bz; module ΗΥ220 - Βασίλης Παπαευσταθίου 25

Up Counter Divider module Cnt(Out, Zero, En, Clear, Clk); parameter N = 32; parameter MaxCnt = 100; input En, Clear, Clk; output Zero; output [N-1:0] Out; reg [N-1:0] Out; reg Zero; always @(posedge Clk) begin if(clear) begin Out <= #`dh 0; Zero <= #`dh 0; else if (En) begin if (Out==MaxCnt) begin Out <= #`dh 0; Zero <= #`dh 1; else begin Out <= #`dh Out + 1; Zero <= #`dh 0; module ΗΥ220 - Βασίλης Παπαευσταθίου 26

Parallel to Serial Shift Register module P2Sreg(Out, In, Ld, Shift, Clk, Reset_); parameter N = 32; input Ld, Shift, Clk, Reset_; input [N-1:0] In; output Out; reg [N-1:0] TmpVal; always @(posedge Clk or negedge Reset_) begin if (~Reset_) TmpVal <= #`dh 0; else begin if (Ld) TmpVal <= #`dh In; else if(shift) TmpVal <= #`dh TmpVal>>1; wire Out = TmpVal[0]; module ΗΥ220 - Βασίλης Παπαευσταθίου 27

Serial to Parallel Shift Register module S2Preg(Out, In, Shift, Clear, Clk); parameter N = 32; input In, Shift, Clear, Clk; output [N-1:0] Out; reg [N-1:0] Out; wire [N-1:0] Tmp = {Out[N-2:0],In}; always @(posedge Clk) begin if (Clear) Out <= #`dh 0; else if (Shift) Out <= #`dh Tmp; module ΗΥ220 - Βασίλης Παπαευσταθίου 28

Barrel Shift Register module BarShiftReg(Out, In, Ld, Shift, Clk, Reset_); parameter N = 32; input Ld, Shift, Clk, Reset_; input [N-1:0] In; output [N-1:0] Out; reg [N-1:0] Out; always @(posedge Clk) begin if (~Reset_) Out <= #`dh 0; else begin if (Ld) Out <= #`dh In; else if (Shift) begin Out <= #`dh {Out[N-2:0],Out[N-1]}; module ΗΥ220 - Βασίλης Παπαευσταθίου 29

3 to 8 Binary Decoder module Dec(In, Out); input [2:0] In; output [7:0] Out; reg [7:0] Out; integer i; reg [7:0] tmp; always @(In) begin tmp = 0; for (i=0; i<8; i=i+1) if (In==i) tmp[i]=1; Out = tmp; module ΗΥ220 - Βασίλης Παπαευσταθίου 30

8 to 3 Binary Encoder module Enc(In, Out); input [7:0] In; output [2:0] Out; reg [2:0] Out; integer i; always @(In) begin Out = x; for (i=0; i<8; i=i+1) if (In[i]) Out=i; module ΗΥ220 - Βασίλης Παπαευσταθίου 31

Priority Enforcer Module Priority is right -> left (MS) module PriorEnf(In, Out, OneDetected); parameter N = 8; input [N-1:0] In; output [N-1:0] Out; output OneDetected; reg [N-1:0] Out; reg OneDetected; integer i; Temporary registers reg DetectNot; Temporary registers always @(In) begin DetectNot=1; for (i=0; i<n; i=i+1) if (In[i] & DetectNot) begin Out[i]=1; DetectNot=0; else Out[i]=0; OneDetected =!DetectNot; module ΗΥ220 - Βασίλης Παπαευσταθίου 32

Latch module Latch(In, Out, Ld); parameter N = 16; input [N-1:0] In; input Ld; output [N-1:0] Out; reg [N-1:0] Out; always @(In or Ld) if (Ld) Out = #`dh In; module ΗΥ220 - Βασίλης Παπαευσταθίου 33

Combinatorial Logic and Latches (1/3) module mux3(out, In2, In1, In0, Sel); parameter N = 32; input [ 1:0] Sel; input [N-1:0] In2, In1, In0; output [N-1:0] Out; reg [N-1:0] Out; always @(In0 or In1 or In2 or Sel) begin case ( Sel ) 2'b00 : Out <= In0; 2'b01 : Out <= In1; 2'b10 : Out <= In2; case module Γιατί είναι λάθος; ΗΥ220 - Βασίλης Παπαευσταθίου 34

Combinatorial Logic and Latches (2/3) module mux3(out, In2, In1, In0, Sel); parameter N = 32; input [ 1:0] Sel; input [N-1:0] In2, In1, In0; output [N-1:0] Out; reg [N-1:0] Out; always @(In0 or In1 or In2 or Sel) begin case ( Sel ) 2'b00 : Out <= In0; 2'b01 : Out <= In1; 2'b10 : Out <= In2; default : Out <= x; case module Το σωστό!!! ΗΥ220 - Βασίλης Παπαευσταθίου 35

Combinatorial Logic and Latches (3/3) Όταν φτιάχνουµε συνδυαστική λογική µε always blocks και regs τότε πρέπει να αναθέτουµε τιµές στις εξόδους της λογικής για όλες τις πιθανές περιπτώσεις εισόδων (κλήσεις του always)!!! Για κάθε if ένα else Για κάθε case ένα default Παραλείψεις δηµιουργούν latches κατά τη σύνθεση Οι περιπτώσεις που δεν καλύπτουµε χρησιµοποιούνται για το «σβήσιµο» του load enable του latch. (θυµάται την παλιά τιµή) ΗΥ220 - Βασίλης Παπαευσταθίου 36

Λογική µε προτεραιότητες (1/3) ΗΥ220 - Βασίλης Παπαευσταθίου 37

Λογική µε προτεραιότητες (2/3) Μάλλον δεν θέλαµε αυτό: ΗΥ220 - Βασίλης Παπαευσταθίου 38

Λογική µε προτεραιότητες (3/3) Πολύ Καλύτερο!!! ΗΥ220 - Βασίλης Παπαευσταθίου 39

Ο NumberGenerator (1/2) module NumberGenerator ( o_numberout, Clk, Rst_n ); output [2:0] o_numberout; input Clk; input Rst_n; This is a counter (register + adder ) that counts cycles it wraps-around to zero alone reg [23:0] cycle_counter; always @(posedge Clk) begin if ( ~Rst_n ) begin Reset value 1 cycle_counter <= #`dh 1; else begin cycle_counter <= #`dh cycle_counter + 1; Generates a pulse every time the cycle counter goes to zero hence every 2^24 cycles in a 18 MHz clock (55,55 ns period) 2^24 * 55,55 ns which is approximatelly 0,93 sec wire NextNumber = ( cycle_counter == 0 ); wire NextNumber = ~ ( cycle_counter );... ΗΥ220 - Βασίλης Παπαευσταθίου 40

Ο NumberGenerator (2/2)... Output register reg [2:0] o_numberout; always @(posedge Clk) begin if ( ~Rst_n ) begin o_numberout <= #`dh 0; else begin It changes value when the pulse comes if ( NextNumber ) o_numberout <= #`dh o_numberout + 1; else The else is not needed since it is a register o_numberout <= #`dh o_numberout; module ΗΥ220 - Βασίλης Παπαευσταθίου 41