HY430 Εργαστήριο Ψηφιακών Κυκλωμάτων Διδάσκων: Χ. Σωτηρίου, Βοηθός: (θα ανακοινωθεί) http://inf-server.inf.uth.gr/courses/ce430/ Περιεχόμενα Περιγραφές και Συνθέσιμες Δομές Πολυπλέκτες Καμπύλη Παρέτο Κωδικοποιητές/Από-κωδικοποιητές D FF Κωδικοποίηση με Προτεραιότητες Σύγχρονη, ασύγχρονη αρχικοποίηση Με ενεργοποίηση (enable) T FF Μετρητές Με ανάθεση τιμής Πάνω/Κάτω Αθροιστές Συγκριτές D Latch Σύγχρονη, Ασύγχρονη Μνήμη Ολισθητές Σειριακή είσοδος, Παράλληλη έξοδος Παράλληλη είσοδος, Σειριακή έξοδος Πολλαπλασιαστής/Διαιρέτης Ολισθητής «Βαρέλι» (Barrel) 2
Περιεχόμενα Περιγραφές και Συνθέσιμες Δομές Καμπύλη Παρέτο D FF Σύγχρονη, ασύγχρονη αρχικοποίηση Με ενεργοποίηση (enable) T FF Μετρητές Με ανάθεση τιμής Πάνω/Κάτω Ολισθητές Σειριακή είσοδος, Παράλληλη έξοδος Παράλληλη είσοδος, Σειριακή έξοδος Πολλαπλασιαστής/Διαιρέτης Ολισθητής «Βαρέλι» (Barrel) Πολυπλέκτες Κωδικοποιητές/Από-κωδικοποιητές Κωδικοποίηση με Προτεραιότητες Αθροιστές Συγκριτές D Latch Σύγχρονη, Ασύγχρονη Μνήμη 3 Τύποι Μοντελοποίησης Verilog Δομική module_name instance_name [instance_array_range] (signal, signal,... ); (Structural) Ροή Δεδομένων (Dataflow) Συμπεριφοράς ή Διαδικαστική (Behavioural, Procedural) 4 module_name instance_name [instance_array_range] (.port_name(signal), (.port_name(signal),...); counter counter_( clk, enable, count_out); dff u2 (.clk(clock),.q(q[]),.data(d[])); gate_type #(delay) instance_name [instance_array_range] (terminal, terminal, ); wire = (a & b) (c & d); initial always @ (sensitivity list) -- always @(a or b or ci) sum = a + b + ci; initial bus = 6'h0000; #0 bus = 6'hC5A5; #20 bus = 6'hFFAA; 2
Περιγραφή Συμπεριφοράς Χρήση Διαδικασιών always ή initial Διαθέσιμες προτάσεις for while Συναρτήσεις Διεργασίες fork join Διαθέσιμοι Τύποι 5 reg και πίνακες reg integer real initial // reset everything always @(posedge clk) case (opcode) 8 hab: RegFile[dst] = #2 in; 8 hef: dst = #2 in0 + in; 8 h02: Memory[addr] = #2 data; case if (branch) dst = #2 br_addr; Περιγραφή Συμπεριφοράς Απεικόνιση στο υλικό;;; Το εργαλείο σύνθεσης κάνει αντιστοιχία Μπορεί να ελαχιστοποιήσει την δυαδική λογική Υπακούει όμως την δομική συμπεριφορά της περιγραφής! integer sum, i; integer opcodes [3:0]; real average; initial for (i=0; i<32; i=i+) opcodes[i] = 0; always @(posedge clk) sum = sum + ; average = average + (c / sum); opcodes[d] = sum; $display( sum: %d, avg: %f, sum, average); 6 3
Επιρροή Δομής module COMB_LOGIC_STRUCT(a, b, c, d, a2, b2, c2, d2, y, y2); input [8:0] a, b, c, d, a2, b2, c2, d2; output [0:0] y, y2; reg [0:0] y, y; always @(a or b or c or d or a2 or b2 or c2 or d2) y = a + b + c + d; y2 = (a2 + b2) + (c2 + d2); module a[8:0] b[8:0] c[8:0] d[8:0] + + + y[0:0] a[8:0] b[8:0] c[8:0] d[8:0] + + + y2[0:0] 7 Παραδείγματα Περιγραφής Συμπεριφοράς module test; task ShowValues; input [7:0] data; $display(..., data); task... always @(posedge clk) ShowValues(counter);... module define period 20 initial reset_ = b0; reset_ = #(2*`period + 5) b; @(branch); reset_ = b0; reset_ = #(2*`period + 5) b; always @(negedge reset_) fork a = #2 8 h44; b = #(4*`period + 2) b0; c = #(6*`period + 2) 8 h44; join 8 4
Περιγραφή RTL (Register Transfer Level Μεταβίβασης μεταξύ Καταχωρητών) Το κάθε τμήμα always κάνει αναθέσεις από καταχωρητές σε καταχωρητές Σχεδιάζουμε Κύκλο προς κύκλο Με οδηγό το ρολόι ος κύκλος:... 2 ος κύκλος: Συνδυαστική Λογική 9 Δομική Περιγραφή Μόνο εμφανίσεις τμημάτων Μορφή Πλαισίου Δοκιμής Μορφή μετά από Σύνθεση module top; wire clk, reset; wire [3:0] d_data, I_data; wire [9:0] d_adr; wire [5:0] i_adr; clock clk0(clk); processor pr0(clk, reset, d_adr, d_data, i_adr, i_data,...); memory mem0(d_adr, d_data); memory mem(i_adr, i_data) ; tester tst0(reset,...); module 0 5
Καλές Πρακτικές Ονόματα Συνοχή Νόημα Ευανάγνωστα Συνδυαστική Λογική Δομή Ευανάγνωστη Φυσική και όχι Λογική Ιεράρχηση του σχεδίου Συνδεσμολογία Κατά όνομα αντί Κατά θέση Χρήση κενών/tabs για ευθυγράμμιση του κώδικα wire a, memory_data_write_enable; wire mem_wr_en, if (~req && ((flag & prv_ack) ~set) && (count-2 == 0))... Καλές Πρακτικές Σχόλια Κώδικας υλικού γενικά πιο δύσκολος στην κατανόηση Ακόμα και ο ίδιος ο σχεδιαστής σε 2 εβδομάδες δεν θυμάται απόλυτα την λειτουργία του κώδικα Αν δεν χρησιμοποιηθούν εν γένει δεν θα μπουν αργότερα Καλή πρακτική Σε κάθε μονάδα Σε κάθε τμήμα always /*************************** * Comments on module test: * Module test comprises of * the following components **************************/ module test; // Line comment 2 6
Περιεχόμενα Περιγραφές και Συνθέσιμες Δομές Καμπύλη Παρέτο D FF Σύγχρονη, ασύγχρονη αρχικοποίηση Με ενεργοποίηση (enable) T FF Μετρητές Με ανάθεση τιμής Πάνω/Κάτω Ολισθητές Σειριακή είσοδος, Παράλληλη έξοδος Παράλληλη είσοδος, Σειριακή έξοδος Πολλαπλασιαστής/Διαιρέτης Ολισθητής «Βαρέλι» (Barrel) Πολυπλέκτες Κωδικοποιητές/Από-κωδικοποιητές Κωδικοποίηση με Προτεραιότητες Αθροιστές Συγκριτές D Latch Σύγχρονη, Ασύγχρονη Μνήμη 3 Verilog και Λογική Σύνθεση Η διαδικασία Σύνθεσης μετατρέπει την περιγραφή Verilog σε:. Περιγραφή σε επίπεδο πυλών 2. Απεικόνιση σε βιβλιοθήκη πυλών επιλογή μεγεθών Η διαδικασία ακολουθεί μια καμπύλη Παρέτο Πολλαπλά σημεία (Εμβαδού, Καθυστέρησης) ανάλογα με τους περιορισμούς Εμβαδό (μm 2 ) Καμπύλη Παρέτο (Pareto) Μη ΒέλτιστηΛύση Βέλτιστες Λύσεις Καθυστέρηση (ns) 4 7
Συνθέσιμο Υποσύνολο της Verilog Εκφράσεις Λέξεις Κλειδιά Σχόλια Ορισμός θυρών Παράμετροι Ορισμός Μονάδων Σήματα και Μεταβλητές Εμφανίσεις input, output, inout parameter module -- module wire, reg Εμφανίσεις Μονάδων, Θεμελιώδεις Πύλες Προτάσεις Διαδικασιών always, if, else, case Όχι initial Τμήματα Διαδικασιών -- mymux(sel, a, b, out); nand nand4_i (out, a, b, c, d); Ροή Δεδομένων assign Αγνοούνται οι Καθυστερήσεις Τελεστές +, -, ~, &, ^, ==,!= Προσοχή: *, /, % Συναρτήσεις, Διαδικασίες function, task Μόνο Συνδυαστική Λογική Βρόχοι for, while Μόνο για αναθέσεις, 5 εμφανίσεις Περιεχόμενα Περιγραφές και Συνθέσιμες Δομές Καμπύλη Παρέτο D FF Σύγχρονη, ασύγχρονη αρχικοποίηση Με ενεργοποίηση (enable) T FF Μετρητές Με ανάθεση τιμής Πάνω/Κάτω Ολισθητές Σειριακή είσοδος, Παράλληλη έξοδος Παράλληλη είσοδος, Σειριακή έξοδος Πολλαπλασιαστής/Διαιρέτης Ολισθητής «Βαρέλι» (Barrel) Πολυπλέκτες Κωδικοποιητές/Από-κωδικοποιητές Κωδικοποίηση με Προτεραιότητες Αθροιστές Συγκριτές D Latch Σύγχρονη, Ασύγχρονη Μνήμη 6 8
Καταχωρητές module Reg(Q, D, Clk); parameter N = 6; input Clk; input [N-:0] D; output [N-:0] Q; reg [N-:0] Q; D[N-:0] D Q Q[N-:0] always @(posedge Clk) Q <= D; module Clk 7 Καταχωρητές module RegRst(Q, D, CLR, Clk); parameter N = 6; input CLR, Clk; input [N-:0] D; output [N-:0] Q; reg [N-:0] Q; always @(posedge Clk or posedge CLR) if (CLR) Q <= 0; else Q <= D; module D[N-:0] D Q RST CLR Clk Q[N-:0] 8 9
Καταχωρητές module Reg(Q, D, CLK, Clk); parameter N = 6; input Clk; input [N-:0] D; output [N-:0] Q; reg [N-:0] Q; always @(posedge Clk) if (CLR) Q <= 0; else Q <= D; module D[N-:0] N b0 CLR 0 D Clk Q Q[N-:0] 9 Καταχωρητές module RegLd(Q, D, CE, Clk); parameter N = 6; input CE, Clk; input [N-:0] D; output [N-:0] Q; reg [N-:0] Q; always @(posedge Clk) if (CE) Q <= D; module CE 0 D[N-:0] D Q Clk Q[N-:0] 20 0
Καταχωρητές module RegLd(Q, D, CE, Clk); parameter N = 6; input CE, Clk; input [N-:0] D; output [N-:0] Q; reg [N-:0] Q; always @(posedge Clk) if (CE) Q <= D; module D[N-:0] D Q CE EN Clk Q[N-:0] 2 Καταχωρητές module Reg(Q, D, CLK, SET, Clk); parameter N = 6; input Clk; input [N-:0] D; output [N-:0] Q; reg [N-:0] Q; always @(posedge Clk) if (CLR) Q <= 0; else if (SET) Q <= ; else Q <= D; module 22 D[N-:0] N b N b0 SET 0 CLR 0 Q[N-:0] D Q Clk
Περιεχόμενα Περιγραφές και Συνθέσιμες Δομές Καμπύλη Παρέτο D FF Σύγχρονη, ασύγχρονη αρχικοποίηση Με ενεργοποίηση (enable) T FF Μετρητές Με ανάθεση τιμής Πάνω/Κάτω Ολισθητές Σειριακή είσοδος, Παράλληλη έξοδος Παράλληλη είσοδος, Σειριακή έξοδος Πολλαπλασιαστής/Διαιρέτης Ολισθητής «Βαρέλι» (Barrel) Πολυπλέκτες Κωδικοποιητές/Από-κωδικοποιητές Κωδικοποίηση με Προτεραιότητες Αθροιστές Συγκριτές D Latch Σύγχρονη, Ασύγχρονη Μνήμη 23 Καταχωρητές module Tff(Out, Toggle, Clk); output Out; input Toggle, Clk; reg Out; always @(posedge Clk or posedge reset) if (reset) Out <= 0; else if (Toggle) Out <= ~Out; module TOGGLE reset D Q RST Clk Out 24 2
Περιεχόμενα Περιγραφές και Συνθέσιμες Δομές Πολυπλέκτες Καμπύλη Παρέτο Κωδικοποιητές/Από-κωδικοποιητές D FF Κωδικοποίηση με Προτεραιότητες Σύγχρονη, ασύγχρονη αρχικοποίηση Με ενεργοποίηση (enable) T FF Μετρητές Με ανάθεση τιμής Πάνω/Κάτω Αθροιστές Συγκριτές D Latch Σύγχρονη, Ασύγχρονη Μνήμη Ολισθητές Σειριακή είσοδος, Παράλληλη έξοδος Παράλληλη είσοδος, Σειριακή έξοδος Πολλαπλασιαστής/Διαιρέτης Ολισθητής «Βαρέλι» (Barrel) 25 Μετρητής module counter (C, CLR, Q); input C, CLR; output [3:0] Q; reg [3:0] tmp; always @(posedge C) if (CLR) tmp <= 4'b0000; else tmp <= tmp + 'b; 4 b 4 b0 + CLR 0 D Q Q[3:0] assign Q = tmp; module 4 26 3
Μετρητής module counter(c, D, LOAD, Q); input C, D, LOAD; output [3:0] Q; reg [3:0] tmp; always @(posedge C or posedge CLR) if (LOAD) tmp <= D; else tmp <= tmp + 'b; D 4 b + LOAD 0 CLR 4 D RST Q Q[3:0] assign Q = tmp; module 27 Μετρητής module counter(c, D, LOAD, CLR, Q); input C, D, LOAD; output [3:0] Q; reg [3:0] tmp; always @(posedge C) if (CLR) tmp = 4 b0; else if (LOAD) tmp <= D; else tmp <= tmp + 'b; assign Q = tmp; module D 4 b + 4 b0 LOAD 0 CLR 0 4 D Q Q[3:0] 28 4
Μετρητής module counter(c, D, UP, CLR, Q); input C, D, LOAD; output [3:0] Q; reg [3:0] tmp; always @(posedge C) if (CLR) tmp = 4 b0; else if (UP) tmp <= tmp + b; else tmp <= tmp - 'b; assign Q = tmp; Endmodule 4 b- 4 b + + CLR 4 b0 0 0 UP 4 D Q Q[3:0] 29 Μετρητής module Cnt(Out, Zero, En, Clear, Clk); parameter N = 32; parameter MaxCnt = 00; input En, Clear, Clk; output Zero; output [N-:0] Out; reg [N-:0] Out; reg Zero; always @(posedge Clk) if(clear) Out <= 0; Zero <= 0; else if (En) if (Out == MaxCnt) Out <= 0; Zero <= ; else Out <= Out + ; Zero <= 0; module 30 Τι λειτουργία έχει αυτό το κύκλωμα; Τι κυκλωματική μορφή; 5
Περιεχόμενα Περιγραφές και Συνθέσιμες Δομές Πολυπλέκτες Καμπύλη Παρέτο Κωδικοποιητές/Από-κωδικοποιητές D FF Κωδικοποίηση με Προτεραιότητες Σύγχρονη, ασύγχρονη αρχικοποίηση Με ενεργοποίηση (enable) T FF Μετρητές Με ανάθεση τιμής Πάνω/Κάτω Αθροιστές Συγκριτές D Latch Σύγχρονη, Ασύγχρονη Μνήμη Ολισθητές Σειριακή είσοδος, Παράλληλη έξοδος Παράλληλη είσοδος, Σειριακή έξοδος Πολλαπλασιαστής/Διαιρέτης Ολισθητής «Βαρέλι» (Barrel) 3 module counters (C, CLR, Q); input C, CLR; output [3:0] Q; reg [3:0] tmp; always @(posedge C) if (CLR) tmp <= 4'b0000; else tmp <= tmp + d; d 4 b0 + CLR 0 D Q Q[3:0] assign Q = tmp; module 4 32 6
Περιεχόμενα Περιγραφές και Συνθέσιμες Δομές Καμπύλη Παρέτο D FF Σύγχρονη, ασύγχρονη αρχικοποίηση Με ενεργοποίηση (enable) T FF Μετρητές Με ανάθεση τιμής Πάνω/Κάτω Ολισθητές Σειριακή είσοδος, Παράλληλη έξοδος Παράλληλη είσοδος, Σειριακή έξοδος Πολλαπλασιαστής/Διαιρέτης Ολισθητής «Βαρέλι» (Barrel) Πολυπλέκτες Κωδικοποιητές/Από-κωδικοποιητές Κωδικοποίηση με Προτεραιότητες Αθροιστές Συγκριτές D Latch Σύγχρονη, Ασύγχρονη Μνήμη 33 Ολισθητής module shift(clk, SI, SO); input C, SI; output SO; reg [7:0] tmp; always @(posedge CLK) tmp = {tmp[6:0], SI}; assign SO = tmp[7]; module tmp[7] SO tmp[0] SI 34 7
Ολισθητής module SIPO(CLK, SI, PO); input C, SI; output SO; reg [7:0] tmp; always @(posedge CLK) tmp = {tmp[6:0], SI}; assign PO = temp; module tmp[7] PO[7:0] tmp[0] SI 35 Ολισθητής module PISO(CLK, D, LOAD, SI, SO); input C, LOAD; input [7:0] D; output SO; reg [7:0] tmp; always @(posedge CLK) if (LOAD) tmp = D; else tmp = {tmp[6:0], SI}; assign SO = temp[7]; module LOAD LOAD tmp[7] SO tmp[0] SI PI[7:0] 36 8
Ολισθητής Περιγραφή με συνένωση module SHIFT2(CLK, MULT, LOAD, D, F); input C, MULT, LOAD; input [7:0] D; output [7:0] F; reg [7:0] tmp; always @(posedge CLK) if (LOAD) tmp = D; else if (MULT) tmp = {tmp[5:0], 2 b00}; else tmp = {2 b00, tmp[7:2]}; assign F = tmp; module 37 Περιγραφή με τελεστή ολίσθησης module SHIFT2(CLK, MULT, LOAD, D, F); input C, MULT, LOAD; input [7:0] D; output [7:0] F; reg [7:0] tmp; always @(posedge CLK) if (LOAD) tmp = D; else if (MULT) tmp = tmp << 2; else tmp = tmp >> 2; assign F = tmp; module Ολισθητής module SHIFT(DI, SEL, SO); input [7:0] DI; output [:0] SEL; reg [7:0] SO; always @(DI or SEL) case (SEL) 2 b00 : SO = DI; 2 b0 : SO = DI << ; 2 b0 : SO = DI << 2; default : SO = DI << 3; case module DI[0] DI[] DI[2] DI[7] SEL[:0] SO[0] SO[] SO[2] SO[3] SO[7] 38 9
Περιστροφικός Ολισθητής (Barrel Shift) module BARRELSHIFT(CLK, D, LOAD, SI, SO); input C, LOAD; input [7:0] D; output SO; reg [7:0] tmp; always @(posedge CLK or posedge reset) if (reset) tmp = 8 b0; else if (LOAD) tmp = D; else tmp = {tmp[6:0], temp[7]}; module LOAD tmp[7] LOAD tmp[0] PI[7:0] 39 Παραμετρικός Περιστροφικός Ολισθητής module BarShiftReg(Out, In, Ld, Shift, Clk, Reset); parameter N = 32; input Ld, Shift, Clk, Reset; input [N-:0] In; output [N-:0] Out; reg [N-:0] Out; always @(posedge Clk) if (~Reset) Out <= 0; else if (Ld) Out <= In; else if (Shift) Out <= {Out[N-2:0],Out[N-]}; Endmodule 40 20
Περιεχόμενα Περιγραφές και Συνθέσιμες Δομές Καμπύλη Παρέτο D FF Σύγχρονη, ασύγχρονη αρχικοποίηση Με ενεργοποίηση (enable) T FF Μετρητές Με ανάθεση τιμής Πάνω/Κάτω Ολισθητές Σειριακή είσοδος, Παράλληλη έξοδος Παράλληλη είσοδος, Σειριακή έξοδος Πολλαπλασιαστής/Διαιρέτης Ολισθητής «Βαρέλι» (Barrel) Πολυπλέκτες Κωδικοποιητές/Από-κωδικοποιητές Κωδικοποίηση με Προτεραιότητες Αθροιστές Συγκριτές D Latch Σύγχρονη, Ασύγχρονη Μνήμη 4 Πολυπλέκτης module mux2(out, In, In0, Sel); parameter N = 6; output [N-:0] Out; input [N-:0] In, In0; input Sel; wire [N-:0] Out = Sel? In : In0; In[N:0] In2[N:0} Sel 0 Out[N:0] module 42 2
Πολυπλέκτης module mux4(out, In3, In2, In, In0, Sel); parameter N = 32; input [ :0] Sel; input [N-:0] In3, In2, In, In0; output [N-:0] Out; reg [N-:0] Out; always @(In0 or In or In2 or In3 or Sel) case ( Sel ) 2'b00 : Out <= In0; 2'b0 : Out <= In; 2'b0 : Out <= In2; 2'b : Out <= In3; case module In0[N:0] In[N:0} In2[N:0} In3[N:0} Sel 00 0 0 Out[N:0] 43 Πολυπλέκτης module mux4(out, In3, In2, In, In0, Sel); parameter N = 32; input [ :0] Sel; input [N-:0] In3, In2, In, In0; output [N-:0] Out; reg [N-:0] Out; always @(In0 or In or In2 or In3 or Sel) case ( Sel ) 2'b00 : Out <= In0; 2'b0 : Out <= In; default : Out <= In2; case module Sel In0[N:0] In[N:0} 00 In2[N:0} 0 In2[N:0} 0 Out[N:0] 44 22
Περιεχόμενα Περιγραφές και Συνθέσιμες Δομές Καμπύλη Παρέτο D FF Σύγχρονη, ασύγχρονη αρχικοποίηση Με ενεργοποίηση (enable) T FF Μετρητές Με ανάθεση τιμής Πάνω/Κάτω Ολισθητές Σειριακή είσοδος, Παράλληλη έξοδος Παράλληλη είσοδος, Σειριακή έξοδος Πολλαπλασιαστής/Διαιρέτης Ολισθητής «Βαρέλι» (Barrel) Πολυπλέκτες Κωδικοποιητές/Από-κωδικοποιητές Κωδικοποίηση με Προτεραιότητες Αθροιστές Συγκριτές D Latch Σύγχρονη, Ασύγχρονη Μνήμη 45 Κωδικοποιητής module encoder (sel, res); input [7:0] res; output [2:0] sel; reg [7:0] sel; always @(res) case (res) 8'b0000000 : sel = 3'b000; 8'b0000000 : sel = 3'b00; 8'b0000000 : sel = 3'b00; 8'b0000000 : sel = 3'b0; 8'b0000000 : sel = 3'b00; 8'b0000000 : sel = 3'b0; 8'b0000000 : sel = 3'b0; default case module : sel = 3'b; res == 0000000 000 res == 0000000 00 res == 0000000 00 res == 0000000 0 3 3 3 3 sel 46 23
Από-κωδικοποιητής module decoder (sel, res); input [2:0] sel; output [7:0] res; reg [7:0] res; always @(sel) case (sel) 3'b000 : res = 8'b0000000; 3'b00 : res = 8'b0000000; 3'b00 : res = 8'b0000000; 3'b0 : res = 8'b0000000; 3'b00 : res = 8'b0000000; 3'b0 : res = 8'b0000000; 3'b0 : res = 8'b0000000; default : res = 8'b0000000; case module res == 000 0000000 res == 00 0000000 res == 00 0000000 res == 0 0000000 000000 8 8 8 8 sel 47 Κωδικοποιητής Υλοποίηση με case module encoder (sel, res); input [7:0] res; output [2:0] sel; reg [7:0] sel; always @(res) case (res) 8'b0000000 : sel = 3'b000; 8'b0000000 : sel = 3'b00; 8'b0000000 : sel = 3'b00; 8'b0000000 : sel = 3'b0; 8'b0000000 : sel = 3'b00; 8'b0000000 : sel = 3'b0; 8'b0000000 : sel = 3'b0; default case module : sel = 3'b; Υλοποίηση με for module encoder(in, Out); input [7:0] In; output [2:0] Out; reg [2:0] Out; integer i; always @(In) Out = 0; for (i=0; i<8; i=i+) if (In[i]) Out=i; module 48 24
Περιεχόμενα Περιγραφές και Συνθέσιμες Δομές Καμπύλη Παρέτο D FF Σύγχρονη, ασύγχρονη αρχικοποίηση Με ενεργοποίηση (enable) T FF Μετρητές Με ανάθεση τιμής Πάνω/Κάτω Ολισθητές Σειριακή είσοδος, Παράλληλη έξοδος Παράλληλη είσοδος, Σειριακή έξοδος Πολλαπλασιαστής/Διαιρέτης Ολισθητής «Βαρέλι» (Barrel) Πολυπλέκτες Κωδικοποιητές/Από-κωδικοποιητές Κωδικοποίηση με Προτεραιότητες Αθροιστές Συγκριτές D Latch Σύγχρονη, Ασύγχρονη Μνήμη 49 Από-κωδικοποιητής Υλοποίηση με case module decoder (sel, res); input [2:0] sel; output [7:0] res; reg [7:0] res; always @(sel) case (sel) 3'b000 : res = 8'b0000000; 3'b00 : res = 8'b0000000; 3'b00 : res = 8'b0000000; 3'b0 : res = 8'b0000000; 3'b00 : res = 8'b0000000; 3'b0 : res = 8'b0000000; 3'b0 : res = 8'b0000000; default : res = 8'b0000000; case module Υλοποίηση με for module decoder(in, Out); input [2:0] In; output [7:0] Out; reg [7:0] Out; reg [7:0] tmp; integer i; always @(In) tmp = 0; for (i=0; i<8; i=i+) if (In == i) tmp[i]=; Out = tmp; module 50 25
Κωδικοποιητής με if Λογική με Προτεραιότητες module encoder(i, e); input [3:0] i; output [:0] e; reg [:0] e; always @(i) if (i[0]) e = 2 b00; else if (i[]) e = 2 b0; else if (i[2]) e = 2 b0; else if (i[3]) e = 2 b; else e = 2 bxx; module 2 b00 2 b 2 b0 2 b0 2 b00 0 0 0 0 i[3] i[2] i[] i[0] e[:0] 5 Κωδικοποιητής με if Λογική με Προτεραιότητες module encoder(i, e); input [3:0] i; output [:0] e; reg [:0] e; always @(i) if (i == 4 b000) e = 2 b00; else if (i == 4 b000) e = 2 b0; else if (i == 4 b000) e = 2 b0; else if (i == 4 b000) e = 2 b; else e = 2 bxx; module i i3 i3 i2 e[0] e[] 52 26
Περιεχόμενα Περιγραφές και Συνθέσιμες Δομές Καμπύλη Παρέτο D FF Σύγχρονη, ασύγχρονη αρχικοποίηση Με ενεργοποίηση (enable) T FF Μετρητές Με ανάθεση τιμής Πάνω/Κάτω Ολισθητές Σειριακή είσοδος, Παράλληλη έξοδος Παράλληλη είσοδος, Σειριακή έξοδος Πολλαπλασιαστής/Διαιρέτης Ολισθητής «Βαρέλι» (Barrel) Πολυπλέκτες Κωδικοποιητές/Από-κωδικοποιητές Κωδικοποίηση με Προτεραιότητες Αθροιστές Συγκριτές D Latch Σύγχρονη, Ασύγχρονη Μνήμη 53 Αθροιστής module adder(a, b, sum); input [7:0] a, b; output [7:0] sum; assign sum = a + b; module a[7:0] b[7:0] + sum[7:0] 54 27
Αθροιστής με κρατούμενο module adder(a, b, sum); input [7:0] a, b; output [7:0] sum; output co; wire [8:0] temp; a[7:0] assign temp = a + b; assign sum = temp[7:0]; assign co = temp[8]; b[7:0] + sum[7:0] co module 55 Αθροιστής με πρόσημο module adder(a, b, sum); input signed [7:0] a, b; output signed [7:0] sum; assign sum = a + b; module a[7:0] b[7:0] + sum[7:0] 56 28
Περιεχόμενα Περιγραφές και Συνθέσιμες Δομές Καμπύλη Παρέτο D FF Σύγχρονη, ασύγχρονη αρχικοποίηση Με ενεργοποίηση (enable) T FF Μετρητές Με ανάθεση τιμής Πάνω/Κάτω Ολισθητές Σειριακή είσοδος, Παράλληλη έξοδος Παράλληλη είσοδος, Σειριακή έξοδος Πολλαπλασιαστής/Διαιρέτης Ολισθητής «Βαρέλι» (Barrel) Πολυπλέκτες Κωδικοποιητές/Από-κωδικοποιητές Κωδικοποίηση με Προτεραιότητες Αθροιστές Συγκριτές D Latch Σύγχρονη, Ασύγχρονη Μνήμη 57 Συγκριτής module comparator(a, b, cmp); input [7:0] a,b; output cmp; assign cmp = (a>b)? b : b0; module a[7:0] b[7:0] - 0 cmp 58 29
Περιεχόμενα Περιγραφές και Συνθέσιμες Δομές Πολυπλέκτες Καμπύλη Παρέτο Κωδικοποιητές/Από-κωδικοποιητές D FF Κωδικοποίηση με Προτεραιότητες Σύγχρονη, ασύγχρονη αρχικοποίηση Με ενεργοποίηση (enable) T FF Μετρητές Με ανάθεση τιμής Πάνω/Κάτω Αθροιστές Συγκριτές D Latch Σύγχρονη, Ασύγχρονη Μνήμη Ολισθητές Σειριακή είσοδος, Παράλληλη έξοδος Παράλληλη είσοδος, Σειριακή έξοδος Πολλαπλασιαστής/Διαιρέτης Ολισθητής «Βαρέλι» (Barrel) 59 module posedgdet(out, In, Clk); input In, Clk; output Out; reg Tmp; always @(posedge Clk) Tmp <= In; In D Q Tmp Out wire Out = ~Tmp & In; module 60 30
Περιεχόμενα Περιγραφές και Συνθέσιμες Δομές Καμπύλη Παρέτο D FF Σύγχρονη, ασύγχρονη αρχικοποίηση Με ενεργοποίηση (enable) T FF Μετρητές Με ανάθεση τιμής Πάνω/Κάτω Ολισθητές Σειριακή είσοδος, Παράλληλη έξοδος Παράλληλη είσοδος, Σειριακή έξοδος Πολλαπλασιαστής/Διαιρέτης Ολισθητής «Βαρέλι» (Barrel) Πολυπλέκτες Κωδικοποιητές/Από-κωδικοποιητές Κωδικοποίηση με Προτεραιότητες Αθροιστές Συγκριτές D Latch Σύγχρονη, Ασύγχρονη Μνήμη 6 Μανταλωτής module Latch(In, Out, Ld); parameter N = 6; input [N-:0] In; input Ld; output [N-:0] Out; In[N-:0] D Q Out[N-:0] reg [N-:0] Out; always @(In or Ld) if (Ld) Out = In; module G Ld 62 3
Περιεχόμενα Περιγραφές και Συνθέσιμες Δομές Καμπύλη Παρέτο D FF Σύγχρονη, ασύγχρονη αρχικοποίηση Με ενεργοποίηση (enable) T FF Μετρητές Με ανάθεση τιμής Πάνω/Κάτω Ολισθητές Σειριακή είσοδος, Παράλληλη έξοδος Παράλληλη είσοδος, Σειριακή έξοδος Πολλαπλασιαστής/Διαιρέτης Ολισθητής «Βαρέλι» (Barrel) Πολυπλέκτες Κωδικοποιητές/Από-κωδικοποιητές Κωδικοποίηση με Προτεραιότητες Αθροιστές Συγκριτές D Latch Σύγχρονη, Ασύγχρονη Μνήμη 63 Σύγχρονη RAM module ramsync (clk,we,addr, di, do); input clk, we, en; input [5:0] addr; input [5:0] di; output [5:0] do; reg [5:0] do; reg [5:0] RAM [63:0]; always @(posedge clk) if (we) RAM[addr]<=di; do <= RAM[addr]; module we di addr clk RAM[63:0] x [5:0] do 64 32
Ασύγχρονη RAM ως προς την ανάγνωση module ramsync (clk,we,addr, di, do); input clk, we, en; input [5:0] addr; input [5:0] di; output [5:0] do; wire [5:0] do; reg [5:0] RAM [63:0]; always @(posedge clk) if (we) RAM[addr]<=di; assign do <= RAM[addr]; module 65 we di addr clk RAM[63:0] x [5:0] do Synthesis Tool Manual Διαβάστε τι υποστηρίζει και τι όχι το synthesis tool 66 33