`timescale 1ns / 1ps ////////////////////////////////////////////////////////////////////////////////// // Mátrixkijelző használata közvetlen bitkép üzemmódban // Az adatbemenet 35 párhuzamos vonal a teljes kijelzőmező számára // A kijelzőmező értelmezése oszlopfolytonosan történik, azaz legnagyobb helyiértékű // 7 bit az első oszlopnak felel meg, alulról felfelé, a következő 7 bit a másodiknak // és így tovább az uolsó 7 bitig, ami az 5. oszlop pontjait vezérli // A kijelzés időmultiplex módon történik, 1kHz körüli kapcsolási frekvenciával ////////////////////////////////////////////////////////////////////////////////// // LOGSYS IP alapmodulkönyvtár, a LOGSYS FPGA kártyák hardver elemeinek használatához // Készítette: Fehér Béla ////////////////////////////////////////////////////////////////////////////////// module LIP_5x7matrix( input clk16M, // 16MHz frekvenciájú órajel input rst, // Szinkron RESET jel input [34:0] data, // 35 bites adat bemenet (teljes bitkép) output [ 7:0] bitmap, // Oszlop bitminták output [ 4:0] col // Oszlop kiválasztó kimenetek ); /////////////////////////////////////////////////////////////////////////////////// // A léptetés frekvenciája megközelítően 1kHz, amit a 16MHz-es órajelből állítunk elő // A bináris osztó minden 16384-ik órajelben előállít egy léptető jelet /////////////////////////////////////////////////////////////////////////////////// reg [13:0] div; // Órajelosztó számláló wire rate = ÷ // Végérték pulzus kiadása, ha minden bit magas always @ (posedge clk16M) if (rst) div <= 14'b0; // Kezdőállapot beállítása else div <= div + 1; // Számlálás felfelé ////////////////////////////////////////////////////////////////////////////////// // Az időmultiplex vezérlést egy ötbites shiftregiszter vezérli, a bitkép megjelenítése oszloponként, // balról jobbra történik (A legnagyobb helyiértékű bit a bal alsó pontot vezérli, stb.) // Ha column=10000, akkor a column[4] vonal aktív és a data[34:28] biteken lévő érték jelenik meg a bal szélső oszlopon // Ha column=01000, akkor a column[3] vonal aktív és a data[27:21] biteken lévő érték jelenik meg a következő oszlopon // Ha column=00100, akkor a column[2] vonal aktív és a data[20:14] biteken lévő érték jelenik meg a következő oszlopon // Ha column=00010, akkor a column[1] vonal aktív és a data[13: 7] biteken lévő érték jelenik meg a következő oszlopon // Ha column=00001, akkor a column[0] vonal aktív és a data[ 6: 0] biteken lévő érték jelenik meg a jobb szélső oszlopon /////////////////////////////////////////////////////////////////////////////////// reg [4:0] column=5'b10000; always @ (posedge clk16M) if (rst) column <= 5'b10000; // Kezdőállapot, column[4] aktív else if (rate) column <= {column[0], column[4:1]}; //A szükséges ütemben az oszlop kiválasztás lép // A column jelekkel választhatunk bemeneti 35 bites adat bitmezői küzöl, az adott oszlopnak megfelelően assign bitmap =({7{column[4]}} & data[34:28]) | // Elosztott multiplexer hálózat, a hatékony erőforrás kihasználáshoz ({7{column[3]}} & data[27:21]) | // Egy 7 bites 5-1-be adatkiválasztást valósít meg, AND-OR hálózattal ({7{column[2]}} & data[20:14]) | ({7{column[1]}} & data[13: 7]) | ({7{column[0]}} & data[ 6: 0]); assign col = column; endmodule