`timescale 1ns / 1ps ////////////////////////////////////////////////////////////////////////////////////////////// // LIP_disp_arb: A LOGSYS Spartan 3E FPGA kártya teljes kijelző egységének együttes használata // közvetlen módban, tetszőleges mintázatok megjelenítésére. // A modul időmultiplex vezérléssel biztosítja az 5x7-es pontmátrix és a 4 digites 7 szegmenses // kijelző szimultán vezérlését. A pontmátrix kijelző tartalma a 35 biten megadható teljes // bitkép lehet. A bitpozíciók értelmezése az alábbi: // |0 1 2 3 4 5 6|7 8 9 10 11 12 13|14 15 16 17 18 19 20|...|28 29 30 31 32 33 34| // |1. oszl./sor | 2. oszlop/sor | 3. oszlop/sor |4. | 5. oszlop/sor | // Ennek megfeleleően a következő kijelzőkép értelemzések lehetségesek: // ( A folytonos vonalak a kártya körvonalai, az orientáció jelzéséhez) // Fekvő elrendezés: Álló elrendezés: // __________________________________ | // | | 6 13 20 27 34 // | 0 1 2 3 4 5 6 | 5 12 19 26 33 // | 7 8 9 10 11 12 13 | 4 11 18 25 32 // | 14 15 16 17 18 19 20 | 3 10 17 24 31 // | 21 22 23 24 25 26 27 | 2 9 16 23 30 // | 28 29 30 31 32 33 34 | 1 8 15 22 29 // | | 0 7 14 21 28 // |__________________________ // A fekvő elrendezésben a (0,0) indexű pixel a bal felső sarokelem, míg az álló // elrendezésben a bal alsó elem. Fekvő elrendezésnél a kijelzés soronként történik, // 1. sor, 2. sor, 3. sor, 4. sor, 5. sor, álló elrendezésben 1. oszlop, 2. oszlop, // 3. oszlop, 4. oszlop, 5. oszlop. A 7 szegmenses kijelző tartalma 32 biten megadható // tetszőleges szegmenskép lehet, (pl. a HELP felirat megjelenítéséhez), tizedespont // használatával. Ha numerikus értékeket szeretnénk megjeleníteni, akkor azokat is // szegmensképként adhatjuk meg vagy beépítünk 4 db hex2seg kódkonvertert vagy // 1 konvertert és 4 db regisztert. // A kijelzés ütemezése automatikus, a bitmap és value bemenetekre adott adattartalom // közvetlenül a kijelzőre kerül. A kijelzés időmultiplex módon történik, 1kHz körüli // kapcsolási frekvenciával, ami folytonos megjelenítést eredményez. // Megjegyzés: Az egység működési módjából következően az adatbemeneti vonalak értékének // változtatása a kijelzési állapothoz képest tetszőleges időpontban megtörténhet, az // adatbemenet szinkronizációjára nincs szükség. (Mivel másodpercenként kb. 1000x módosul a // kijelzés, egy-egy hibás adatátadás előfordulhat, azt a szemünk nem veszi észre, és a hibás // adat más módon nem kerül amúgy sem fedolgozásra. Más lenne a helyzet, ha ez alapján bármi // lényeges művelet indítását kellene eldöntenünk egy másik digitális egységben, mert ebben // az esetben szigorú szinkronizációt használnánk a megbízható adatátadás érdekében.) ////////////////////////////////////////////////////////////////////////////////////////////// // A modul beépítéséhez használható minta, a név és jelnevek aktualizálása szükséges // LIP_disp_arb akt_név( // Tetszőleges bitminták megjelenítése // .clk16M(clk16M), // 16MHz frekvenciájú órajel // .rst(rst), // Szinkron RESET jel // .value(value), // 32 bites bemenet // .bitmap(bitmap), // 35 bit bemenet // .seg(seg), // Szegmens kimenetek // .dig(dig), // Digit kimenetek // .col(col) // Oszlop kimenetek // ); ////////////////////////////////////////////////////////////////////////////////////////////// module LIP_disp_arb( // Tetszőleges bitminták megjelenítése input clk16M, // 16MHz frekvenciájú órajel input rst, // Szinkron RESET jel input [31:0] value, // 32 bites bemenet input [0:34] bitmap, // 35 bit bemenet az 5x7-es pontmátrixnak output [ 7:0] seg, // Szegmens kimenetek output [ 3:0] dig, // Digit kimenetek output [ 4:0] col // Oszlop 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 2^14 órajelben előállít egy léptető jelet, ez a rate jel ////////////////////////////////////////////////////////////////////////////////////////////// reg [13:0] div; // 14 bites órajelosztó wire tc = ÷ // Végérték pulzus, 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 kilencbites shiftregiszter (gyűrűs számláló) vezérli, // a bemeneti értékek megjelenítése balról jobbra történik. Először a pontmátrix oszlopai, // majd a 7 szegmenses kijelző karakterei választódnak ki a kijelzésre. ////////////////////////////////////////////////////////////////////////////////////////////// reg [8:0] sel; // A 9 bites shiftregiszter always @ (posedge clk16M) if (rst) sel <= 9'b100000000; // Kezdőállapot, sel[8] aktív else if (tc) sel <= {sel[0], sel[8:1]}; // A kijelzés a rate jel ütemében // vált, kijelzési egységenként, // balról jobbra, folytonosan átfordulva // A sel jelekkel választhatunk a bemeneti 32 bites adatbájtok közül assign seg = ({8{sel[8]}} & {1'b0, bitmap[ 0: 6]}) | ({8{sel[7]}} & {1'b0, bitmap[ 7:13]}) | ({8{sel[6]}} & {1'b0, bitmap[14:20]}) | ({8{sel[5]}} & {1'b0, bitmap[21:27]}) | ({8{sel[4]}} & {1'b0, bitmap[28:34]}) | ({8{sel[3]}} & value [31:24]) | ({8{sel[2]}} & value [23:16]) | ({8{sel[1]}} & value [15: 8]) | ({8{sel[0]}} & value [ 7: 0]); assign col = sel[8:4]; assign dig = sel[3:0]; endmodule