14. TARTALOM FUTTATÁSA A FEJLESZTŐLAP HÉTSZEGMENSES KIJELZŐJÉN A digitális berendezések kijelzőjének kezelésénél gyakori feladat a kijelzett tartalom mozgatása valamilyen szabály szerint. Ebben a példában erre látunk megoldást. 1
14.2. FELADAT DEFINIÁLÁSA A Basys2 fejlesztőlap kijelző egysége négy darab hétszegmenses LED kijelzőből áll, ahogyan azt a 11. fejezetben láttuk. A szegmensek egymástól függetlenül vezérelhetők, így nem csak decimális/ hexadecimális számjegyek jeleníthetők meg, hanem minden más szegmens kombináció is. A vezérlő vonalak számának csökkentése érdekében a vezérlés időmultiplex segítségével történik, ahogy ezt a 11.2 pontban láthattuk. 2
A jelen feladat az, hogy bizonyos rögzített tartalmat fél másodpercenként balra léptessünk, a bal szélen kieső számjegyet viszont visszatápláljuk a jobb szélső kijelzőre. A konkrét tartalom az 1, 2, 3, 4 számok és négy üres hely (sötét kijelző). Nem szükséges a tartalom változtatása vagy más beavatkozás a működés során. 3
14.3. TERV HDL LEÍRÁSA Az időmultiplex megvalósítása és a tartalom léptetése olyan feladatok, amelyek sorrendi hálózat megépítését teszik szükségessé. A sorrendi hálózat működtetéséhez órajel generátort kell építenünk (DCM_Module). Az időmultiplex megvalósítása és a tartalom lassú léptetés az órajel megfelelő arányú leosztásával oldható meg. A kijelző működtetését egy további Verilog modul (DisplayDriver) írja le. 4
A vezérlést végző logikai automatának két állapota van, ezeket a következő konstansokkal jelöltük: S_RESET, S_WAIT_HALF_SEC. Az automata a konfigurálást követően az S_RESET állapotból indul, itt töltődik be az előírt tartalom a Seg0...Seg7 regiszterekbe. Ezt követően az automata a S_WAIT_HALF_SEC állapotba lép, ahol az első feladat egy számláló üzemeltetése, ezzel állítjuk be a fél másodpercenkénti léptetést. 5
Nulláról indulva a számláló a 3,125,000/2 értéket fél másodperc alatt éri el, mivel a számláló léptetésének frekvenciája 3,125MHz. A megfelelő tartalom elérése után megtörténik a tartalom eltolása, majd reszeteljük a számlálót. A főmodul Verilog kódja a következő:
6
module Rotation( output [7:0] DisplaySegments, output AN0, AN1, AN2, AN3, input iClk50MHz); DCM_Module DCM_Module_inst(iClk50MHz, Clk3MHz125, buf_Clk50MHz, Clk50MHz); reg [ 7:0] Seg0, Seg1, Seg2, Seg3, Seg4, Seg5, Seg6, Seg7;
7
DisplayDriver DisplayDriver_inst( .DisplaySegments(DisplaySegments), .AN0(AN0), .AN1(AN1), .AN2(AN2), .AN3(AN3), .DSP0_To_Display(Seg0), .DSP1_To_Display (Seg1), .DSP2_To_Display(Seg2), .DSP3_To_Display(Seg3), .Clk3MHz125 (Clk3MHz125)); 8
localparam [3:0] S_RESET = 4'd0, S_WAIT_HALF_SEC = 4'd1; reg[ 3:0] State = S_RESET; reg[21:0] cnt_Wait_Half_Sec; always@(posedge Clk3MHz125) begin case(State) S_RESET: begin Seg0 <= ~(8'b0000_0110); Seg1 <= ~(8'b0101_1011); 9
Seg2 <= ~(8'b0100_1111); Seg3 <= ~(8'b0110_0110); Seg4 <= 8'hFF; Seg5 <= 8'hFF; Seg6 <= 8'hFF; Seg7 <= 8'hFF; State <= S_WAIT_HALF_SEC; end S_WAIT_HALF_SEC: begin cnt_Wait_Half_Sec <= cnt_Wait_Half_Sec + 1'd1; 10
if(cnt_Wait_Half_Sec == (22'd3_125_000 >> 1)) begin Seg0 <= Seg7; Seg1 <= Seg0; Seg2 <= Seg1; Seg3 <= Seg2; Seg4 <= Seg3; Seg5 <= Seg4; Seg6 <= Seg5; Seg7 <= Seg6; cnt_Wait_Half_Sec <= 0; end 11
end endcase end Endmodule Az 3,125MHz-es órajelet előállító órajel modul HDL leírását megtaláljuk a 12.3 pontban. A kijelzőt vezérlő Verilog modul (DisplayDriver) a megfelelő regiszterek (Seg_0...Seg_3) tartalmát kiküldi az FPGA megfelelő kivezetéseire (DisplaySegments). 12
Az időmultiplex megvalósításához szükséges egy számláló (cnt_5ms), amely egymás után, periódikusan, 5 - 5ms időre felvillantja az egyes számjegyeket. Mivel a számláló 3,125MHz frekvenciájú órajelet kap, az 5ms-os időzítéshez 0-tól 15624-ig kell számlálnia (3,125,000·5·10-3 = 15625). A kijelző modul működését egy logikai automata vezérli. 13
Ez a konfigurálást követő S_RESET állapotban elvégzi az AN0...AN3 regiszterek beállítását, hogy egyszerre csak egy számjegy villanjon fel, majd áttér az S_COUNTING állapotba, ahonnan nem lép ki sohasem. Ez utóbbi állapotban történik a tartalom megjelenítése. A megfelelő Verilog kód a következő:
14
module DisplayDriver( output reg [7:0] output reg input [7:0] input [7:0] input [7:0] input [7:0] input localparam [3:0]
DisplaySegments, AN3, AN2, AN1, AN0, DSP3_To_Display, DSP2_To_Display, DSP1_To_Display, DSP0_To_Display, Clk3MHz125); S_RESET = 4'd0, S_COUNTING = 4'd1; 15
reg [3:0] State = S_RESET; reg [13:0] cnt_5ms = 0; always@(posedge Clk3MHz125) begin case(State) S_RESET: begin cnt_5ms <= 0; AN0 <= 0; AN1 <= 1'd1; AN2 <= 1'd1; AN3 <= 1'd1; 16
State <= S_COUNTING; end S_COUNTING: begin cnt_5ms <= cnt_5ms + 1'd1; if(cnt_5ms == 14'd15624) begin cnt_5ms <= 0; {AN3, AN2, AN1, AN0} <= {AN2, AN1, AN0,AN3}; end end endcase 17 end
always@(*) begin case({AN3, AN2, AN1, AN0}) 4'b0111:DisplaySegments = DSP3_To_Display; 4'b1011:DisplaySegments = DSP2_To_Display; 4'b1101:DisplaySegments = DSP1_To_Display; 4'b1110:DisplaySegments =DSP0_To_Display; default: DisplaySegments = 0; endcase end endmodule 18
14.4. FELHASZNÁLÓI MEGKÖTÉSEK BEÁLLÍTÁSA Az FPGA eszköz tizenhárom kivezetését kell összekötni a tervezett logikai hálózattal. Ezek a következők: az 50 MHz-es órajel bemenet, a kijelző négy anódja, a kijelző nyolc katódkivezetése (hét szegmens és a tizedes pont). 19
A
20