`timescale 1ns / 1ps ////////////////////////////////////////////////////////////////////////////////// // Digitális technika 1 VIMIAA01 Üdvözlő Projekt // Kellemes Karácsonyi Ünnepeket és Boldog Új Évet Kívánunk! // We wish you a Merry Christmas and a Happy New Year!! ////////////////////////////////////////////////////////////////////////////////// module Merry_Christmas( input clk16M, input rstbt, output [7:0] seg_n, output [4:0] col_n, output [3:0] dig_n ); ////////////////////////////////////////////////////////////////////////////////////////////// // Általános ütemező jel generátor ////////////////////////////////////////////////////////////////////////////////////////////// reg [21:0] div; // 24 bites órajelosztó wire tc = ÷ // Végérték pulzus, ha minden bit magas always @ (posedge clk16M) if (rstbt) div <= 26'b0; // Kezdőállapot beállítása else div <= div + 1; // Számlálás felfelé ////////////////////////////////////////////////////////////////////////////////// // Komplex kijelző vezérlés, 5x7-es mátrix portré módban, és a 7 szegmenses // 4 digites kijelző általános karakterkép módban ////////////////////////////////////////////////////////////////////////////////// wire [0:34] bitmap, blink; // A blink a villogó fények helye reg [31:0] value; wire [7:0] seg; // Az üdvözlő futófény felirat wire [4:0] col; wire [3:0] dig; ////////////////////////////////////////////////////////////////////////////////// // Karácsonyfa sematikus képe, 5 villogó fénnyel (5x7, 35 bites változó) ////////////////////////////////////////////////////////////////////////////////// reg [8:0] b; always @ (posedge clk16M) if (rstbt) b <= 9'b000000001; else if (tc) b <= {b[0], b[8:1]}; // Egy gyűrűs számláló adja avillogó ütemezést assign blink = {2'b0, b[8], 4'b0, 3'b0, b[2],3'b0, 6'b0, (b[5] | b[0]), 3'b0, b[6],3'b0, 2'b0, b[4], 4'b0}; assign bitmap = {35'b0010000_0011100_1111111_0011100_0010000} ^ blink; ////////////////////////////////////////////////////////////////////////////////// // A We wish you a Merry Christmas and a Happy New Year futófény felirat és vezérlése ////////////////////////////////////////////////////////////////////////////////// reg [7:0] adr_ptr; always @ (posedge clk16M) // A címmutató lassan végigpásztázza if (rstbt) adr_ptr <= 7'b0; // a futófény karaktermemóriát else if (tc) adr_ptr <= adr_ptr + 1; reg [1:0] cnt; always @ (posedge clk16M) // Az aktuális karakter címe: if (rstbt) cnt <= 2'b0; // Pointer+index, ahol az index 0..3 else cnt <= cnt + 1; wire [5:0] adr = adr_ptr[5:0] + cnt; reg [7:0] char; ////////////////////////////////////////////////////////////////////////////////// // 64 bájt ROM memória táblázatos specifikálása ////////////////////////////////////////////////////////////////////////////////// always @(*) case (adr) 6'h00 : char <= 8'h00; 6'h01 : char <= 8'h00; 6'h02 : char <= 8'h00; 6'h03 : char <= 8'h00; 6'h04 : char <= 8'h00; 6'h05 : char <= 8'h00; 6'h06 : char <= 8'h00; 6'h07 : char <= 8'h00; 6'h08 : char <= 8'h3e; // W 6'h09 : char <= 8'h3e; // W 6'h0a : char <= 8'h79; // E 6'h0b : char <= 8'h00; 6'h0c : char <= 8'h3e; // W 6'h0d : char <= 8'h3e; // W 6'h0e : char <= 8'h30; // I 6'h0f : char <= 8'h6d; // S 6'h10 : char <= 8'h76; // H 6'h11 : char <= 8'h00; 6'h12 : char <= 8'h6e; // Y 6'h13 : char <= 8'h5c; // o 6'h14 : char <= 8'h1c; // u 6'h15 : char <= 8'h00; 6'h16 : char <= 8'h77; // A 6'h17 : char <= 8'h00; 6'h18 : char <= 8'h37; // M 6'h19 : char <= 8'h37; // M 6'h1a : char <= 8'h79; // E 6'h1b : char <= 8'h50; // r 6'h1c : char <= 8'h50; // r 6'h1d : char <= 8'h6e; // Y 6'h1e : char <= 8'h00; 6'h1f : char <= 8'h39; // C 6'h20 : char <= 8'h76; // H 6'h21 : char <= 8'h50; // r 6'h22 : char <= 8'h30; // I 6'h23 : char <= 8'h6d; // S 6'h24 : char <= 8'h78; // t 6'h25 : char <= 8'h37; // M 6'h26 : char <= 8'h37; // M 6'h27 : char <= 8'h77; // A 6'h28 : char <= 8'h6d; // S 6'h29 : char <= 8'h00; 6'h2a : char <= 8'h77; // A 6'h2b : char <= 8'h54; // n 6'h2c : char <= 8'h5e; // d 6'h2d : char <= 8'h00; 6'h2e : char <= 8'h77; // A 6'h2f : char <= 8'h00; 6'h30 : char <= 8'h76; // H 6'h31 : char <= 8'h77; // A 6'h32 : char <= 8'h73; // P 6'h33 : char <= 8'h73; // P 6'h34 : char <= 8'h6e; // Y 6'h35 : char <= 8'h00; 6'h36 : char <= 8'h54; // n 6'h37 : char <= 8'h79; // E 6'h38 : char <= 8'h3e; // W 6'h39 : char <= 8'h3e; // W 6'h3a : char <= 8'h00; 6'h3b : char <= 8'h6e; // Y 6'h3c : char <= 8'h79; // E 6'h3d : char <= 8'h77; // A 6'h3e : char <= 8'h50; // r 6'h3f : char <= 8'h00; default: char <= 8'h00; endcase reg [31:0] txt; ////////////////////////////////////////////////////////////////////////////////// // A kiolvasott karaktereket átmásljuk a txt szöveg változó egy-egy bájtjába ////////////////////////////////////////////////////////////////////////////////// always @ (posedge clk16M) if (rstbt) txt <= 32'b0; else case (cnt) 2'b00: txt[31:24] <= char; 2'b01: txt[23:16] <= char; 2'b10: txt[15: 8] <= char; 2'b11: txt[ 7: 0] <= char; endcase ////////////////////////////////////////////////////////////////////////////////// // A kimásolt 4 karaktert tartjuk a kjelző value bemenetén a szükséges ideig, // majd ha kész az új kiolvasás, frissítjük ////////////////////////////////////////////////////////////////////////////////// always @ (posedge clk16M) if (rstbt) value <= 32'b0; else if (cnt == 2'b11 & tc) value <= txt; ////////////////////////////////////////////////////////////////////////////////// // A kijelző vezérlő modul. A bimap és value változókat jelzi ki, valós időben ////////////////////////////////////////////////////////////////////////////////// LIP_disp_arb Disp(.clk16M(clk16M), .rst(rstbt), .value(value), .bitmap(bitmap), .seg(seg), .dig(dig),.col(col)); assign seg_n = ~seg; assign col_n = ~col; assign dig_n = ~dig; endmodule