Κατέβασμα παρουσίασης
Η παρουσίαση φορτώνεται. Παρακαλείστε να περιμένετε
ΔημοσίευσεNarella Vidales Τροποποιήθηκε πριν 9 χρόνια
1
V ERILOG 2. Μια πιο κοντινή ματιά
2
ΗΥ-220 – Μαυροειδής Ιάκωβος2 Δομή της γλώσσας Μοιάζει πολύ με τη C –Preprocessor –Keywords –Τελεστές Γλώσσα «event driven» `timescale 1ns / 1ns `define dh 2 `include “cwaves.h” `timescale 1ns / 1ns `define dh 2 `include “cwaves.h” & and | or ~ not ^ xor & and | or ~ not ^ xor = ==, !=, = && || ? : = ==, !=, = && || ? : always clk = #(`period / 2) ~clk; always @(posedge clk) a = b + 1; always @(posedge clk) b = c + 1; always clk = #(`period / 2) ~clk; always @(posedge clk) a = b + 1; always @(posedge clk) b = c + 1; t 0 + period t0t0 !
3
ΗΥ-220 – Μαυροειδής Ιάκωβος3 Events Κάθε έκφραση συνδέεται με έναν αρχικό χρόνο Initial και always: εσωτερικά σειριακά 0 10 2030 4050 initial begin a = 0; b = 0; end always begin clk = #10 1; clk = #10 0; end wire comb = a + b; always @(posedge clk) a = b + 1; always @(posedge clk) b = c + 1; always @(posedge clk) c = #5 c + 1; initial begin a = 0; b = 0; end always begin clk = #10 1; clk = #10 0; end wire comb = a + b; always @(posedge clk) a = b + 1; always @(posedge clk) b = c + 1; always @(posedge clk) c = #5 c + 1; 0 10, 30 15, 35 10, 20, 30, 40, 50 10 +, 30 +
4
ΗΥ-220 – Μαυροειδής Ιάκωβος4 Case … το γνωστό case Μόνο με σταθερές εκφράσεις Δεν χρειάζεται break Καλός κώδικας: –Μοναδικό αριστερό μέρος always @(posedge clk) begin case (opcode) 8’h0A: dstreg = #`dh inreg0; 8’h22: begin dstreg = #`dh a + 1; if (a | (b ^ (~c))) dstreg = #`dh inreg1; end 8’hFF: dstreg = #`dh inreg2; default: dstreg = #`dh 8’h00; endcase end always @(posedge clk) begin case (opcode) 8’h0A: dstreg = #`dh inreg0; 8’h22: begin dstreg = #`dh a + 1; if (a | (b ^ (~c))) dstreg = #`dh inreg1; end 8’hFF: dstreg = #`dh inreg2; default: dstreg = #`dh 8’h00; endcase end
5
ΗΥ-220 – Μαυροειδής Ιάκωβος5 Concatenation «Hardwired» πράξεις… … απαραίτητες σε μια HDL wire [2:0] a; wire [4:0] b; wire [7:0] c = {a, b}; wire [2:0] a; wire [4:0] b; wire [7:0] c = {a, b}; 3 5 8 a b c wire [7:0] unsigned; wire [15:0] sign_extend = { (unsigned[7] ? 8’hFF : 8’h0), unsigned }; wire [7:0] unsigned; wire [15:0] sign_extend = { (unsigned[7] ? 8’hFF : 8’h0), unsigned };
6
ΗΥ-220 – Μαυροειδής Ιάκωβος6 Μνήμες Αναδρομικά: array of array Συνήθως non- synthesizable Ειδική αρχικοποίηση wire [15:0] word_in; wire [15:0] word_out; wire [9:0] addr; reg [15:0] memory [1023:0]; always @(posedge clk) begin if (we) memory[addr] = word_in; else word_out = memory[addr]; end wire [15:0] word_in; wire [15:0] word_out; wire [9:0] addr; reg [15:0] memory [1023:0]; always @(posedge clk) begin if (we) memory[addr] = word_in; else word_out = memory[addr]; end always @(negedge reset_n) $readmemh(“memory.dat”, memory); always @(negedge reset_n) $readmemh(“memory.dat”, memory);
7
ΗΥ-220 – Μαυροειδής Ιάκωβος7 Τιμές σημάτων –Χ –1 και 0 – Ζ –… και άλλα Αρχικά όλα Χ Προσοχή στην αρχικοποίηση always @(posedge clk) if (reset)... else... always @(posedge clk) if (reset)... else... initial...
8
ΗΥ-220 – Μαυροειδής Ιάκωβος8 Τρικατάστατοι οδηγητές Εκμετάλλευση της κατάστασης Ζ module tristate(en, clk, data); input en, clk; inout [7:0] data; wire [7:0] data = (en) ? data_out : 8’bz; always @(posedge clk) begin if (!en) case (data)... endmodule module tristate(en, clk, data); input en, clk; inout [7:0] data; wire [7:0] data = (en) ? data_out : 8’bz; always @(posedge clk) begin if (!en) case (data)... endmodule Χρήση του τύπου inout wire [7:0] bus; tristate tr0(en0, clk, bus); tristate tr1(en1, clk, bus); tristate tr2(en2, clk, bus); wire [7:0] bus; tristate tr0(en0, clk, bus); tristate tr1(en1, clk, bus); tristate tr2(en2, clk, bus);
9
ΗΥ-220 – Μαυροειδής Ιάκωβος9 Παραμετρικά modules Μπορούμε να έχουμε παραμέτρους σε ένα module Default μέγεθος … πολύ βολικό! module RegLd(Q, D, load, clk); parameter N = 8; parameter dh = 2; input [N-1:0] Q; output [N-1:0] D; input load, clk; reg [N-1:0] D; always @(posedge clk) if (load) D = #dh Q; endmodule module RegLd(Q, D, load, clk); parameter N = 8; parameter dh = 2; input [N-1:0] Q; output [N-1:0] D; input load, clk; reg [N-1:0] D; always @(posedge clk) if (load) D = #dh Q; endmodule RegLd reg0(q0, d0, l, clk); RegLd #(16,2) reg1(q1, d1, l, clk); RegLd reg2(q2, d2, l, clk); defparam reg2.N = 4; defparam reg2.dh = 4; RegLd reg0(q0, d0, l, clk); RegLd #(16,2) reg1(q1, d1, l, clk); RegLd reg2(q2, d2, l, clk); defparam reg2.N = 4; defparam reg2.dh = 4;
10
ΗΥ-220 – Μαυροειδής Ιάκωβος10 Sensitivity lists Λογικές εκφράσεις με or, and posedge και negedge –Ρολόγια Προσοχή στο hardware που θέλουμε να περιγράψουμε… always @(posedge clk or negedge rst_)... always @(a or b or c) if (opcode == 32’h52A0234E) a = b ^ (~c); always @(posedge a or posedge b)... always @(posedge clk or negedge rst_)... always @(a or b or c) if (opcode == 32’h52A0234E) a = b ^ (~c); always @(posedge a or posedge b)... !
11
ΗΥ-220 – Μαυροειδής Ιάκωβος11 Τέλος! Preprocessor –`define –`timescale –`include Concatenations –{a, b, c} Case –case … endcase –default Μνήμες –reg [15:0] rf [7:0]; Tρικατάστατοι –wire a = (en) ? 1’b1 : 1’bz; Parameters –parameter N = 16; –Reg #8 r0(…); Sensitivity lists –always @(a or b); –always @(negedge rst_);
Παρόμοιες παρουσιάσεις
© 2024 SlidePlayer.gr Inc.
All rights reserved.