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 : sel = 3'b; case module res res res res == 0000000 000 == 0000000 00 == 0000000 00 == 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 : sel = 3'b; case module Υλοποίηςη με 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