A 2005.tavasz zh mintakérdései
Ez az oldal a korábbi SCH wikiről lett áthozva.
Ha úgy érzed, hogy bármilyen formázási vagy tartalmi probléma van vele, akkor, kérlek, javíts rajta egy rövid szerkesztéssel!
Ha nem tudod, hogyan indulj el, olvasd el a migrálási útmutatót.
vissza a Mérés 1 tárgyhoz
az oldal frissítés, szerkesztés alatt
A 2005 tavaszi útmutató alapján
Az 5. mérésre alkalmas mérőhelyen
Verilog nyelven tervezzen egy szinkron hálózatot, amely az alant specifikált funkciót valósítja meg. A WebPACK rendszer segítségével készítse el a leírást! A leírás elkészítésénél a WebPACK sablonjait (Language Templates) is használhatja. Nem szükséges hierarchikus tervezést végezni. (Szimulációval ellenőrizze a működést!) A leírást fordítsa le, és töltse le az FPGA mérőpanelbe! Demonstrálja a helyes működést!
5-1 Funkció:
Az SW5-SW8 kapcsolók állását átírja egy regiszterbe, amíg a BTN1 gomb meg van nyomva. A regiszter a BTN2 gombbal vihető alapállapotba, az alapállapot 4'b1111. A regiszter órajele az FPGA panel 50 MHz-es órajele. A regiszter kimeneteinek állapotát az LD5-8 LED-ek jelzik.
Megoldás:
A megoldás hibáit lásd a kód után - direkt nem javítottam át, mert így többet lehet belőle tanulni.
module gyak1(CLK,BTN1,BTN2,SW5,SW6,SW7,SW8,LED5,LED6,LED7,LED8); input CLK; input BTN1; input BTN2; input SW5; input SW6; input SW7; input SW8; output LED5; output LED6; output LED7; output LED8; reg [3:0] Q; reg LED5, LED6, LED7, LED8; always @(posedge CLK) begin if (BTN1) begin if (BTN2) Q = 4'b1111; else begin Q[3] = SW5; Q[2] = SW6; Q[1] = SW7; Q[0] = SW8; end end if (BTN2) Q = 4'b1111; LED5 = Q[3]; LED6 = Q[2]; LED7 = Q[1]; LED8 = Q[0]; end endmodule
Always blokkban blokkoló ('=') értékadást csak indokolt esetben szabad használni, mivel mérés laboron nem tanítjuk, hogy ez mi, always-en belül ne írjatok ilyet, helyette a nem blokkolót ('<=') kell használni! Ellenőrző ZH-n 3 pont levonás járt a hibáért.
A LED-ekre kikötni ennél sokkal elegánsabban is lehet, de ha már így kötöd ki, akkor is használj inkább assign-t. A dupla regiszterezést a kimeneten felejtsd el, semmi értelme, hogy késleltesd egy órajellel - ez a hiba mondjuk csak onnantól jelentkezik, hogy áttérsz nem blokkoló értékadásra; a szintézer ebben a kódban LED5-8 regisztereit automatikusan eldobja ("kombinációs hálózat procedurális leírása").
-- Bandita - 2006.05.17.
5-2 Funkció:
A hálózat egy 4 bites Johnson számláló (léptető regiszter, melynek soros kimenete invertálva van visszavezetve a soros bemenetre). A számláló a BTN2 gombbal vihető alapállapotba, az alapállapot 4'b0000. A hálózat órajele az FPGA panel 50 MHz-es órajele. A számláló léptetését egy kb. másodpercenként érkező, 1 órajel szélességű engedélyező jel végzi. Ezt a jelet is a hálózat állítja elő. A számláló kimeneteinek állapotát az LD5-8 LED-ek jelzik.
Megoldás:
module gyak2(CLK,BTN2,LED5,LED6,LED7,LED8,PUSH); input CLK; input BTN2; output LED5; output LED6; output LED7; output LED8; output PUSH; reg [25:0] Q = 26'd0; reg [3:0] J = 4'b0000; reg PUSH; reg TMP; reg LED5, LED6, LED7, LED8; always @(posedge CLK) begin // PUSH = (Q == 26'd1); // ModelSimben teszteléshez PUSH = (Q == 26'd49999999); if (BTN2) J = 4'b0000; if (PUSH) begin TMP = ~J[0]; J[0] = J[1]; J[1] = J[2]; J[2] = J[3]; J[3] = TMP; Q <= 0; end else Q <= Q+1; LED5 = J[3]; LED6 = J[2]; LED7 = J[1]; LED8 = J[0]; end endmodule |
Javított változat: module gyak2(CLK,BTN2,LED); input CLK; input BTN2; output reg [3:0] LED; reg [25:0] Q = 26'd0; always @(posedge CLK) begin if (BTN2) LED <= 4'b0000; else begin // if (Q == 26'd3) // Modelsimben teszteléshez if (Q == 26'd49999999) begin LED[2:0] <= LED[3:1]; LED[3] <= ~LED[0]; Q <= 0; end else Q <= Q + 1; end end endmodule |
'=' vs '<=' ld. előző feladat, viszont ha csak szimplán lecseréled az értékadás-jeleket, akkor azzal baj van, mert úgy öt bitessé válik a számláló; megoldás a TMP eldobása, hiszen nem blokkoló értékadásnál a jobboldalak értékelődnek ki először, és a baloldalak csak az összes kiértékelés után (órajelre) kapnak új értéket.
A nem blokkoló értékadásnál a nem reset állapotot else ágba kell tenni, különben hibásan működik.
Mivel van kijelölt reset (BTN2), értelmetlen a szimulációhoz értékadás a J regiszter deklarációjában.
A J-k shiftelése rövidebben is történhet a LED[2:0] <= LED[3:1] sorral.
LED-ekre kivezetés itt is hibás, ld. első feladat. A busz kivezetéseire az UCF fájlban LED<3>, LED<2>...-vel hivatkozhatsz.
A Q számláló külön always blokkban opcionális, nagyobb design esetén jó ha szétválasztod az egymástól független funkciókat, a szintézer is hatékonyabban kezeli és jobban átlátható, itt nem feltétlenül növeli az olvashatóságot, ezért bennhagytam.
A szintézis során az eredeti és az általam leírt megoldás kb. ugyanannyira jók, de a kód kicsit áttekinthetőbb.
-- Bandita - 2006.05.17.
5-3 Funkció:
A hálózat egy 4 bites bináris felfelé számláló. A hálózat az SW1 kapcsoló 0 állásában alapállapotba kerül. A számláló alapállapota 4'b0000. A hálózat órajele az FPGA panel 50 MHz-es órajele. Az SW1 kapcsoló 1 állásában számláló számol. A számlálást egy kb. másodpercenként érkező, 1 órajel szélességű engedélyező jel ütemezi. Ezt a jelet is a hálózat állítja elő. A számláló állapotát a hétszegmenses display egyik számjegye jelzi, hexadecimális formában.
Megoldás:
module gyak3(CLK,SW1,A4,PUSH,CA,CB,CC,CD,CE,CF,CG); input CLK; input SW1; output A4; output CA,CB,CC,CD,CE,CF,CG; output PUSH; reg [25:0] Q = 26'd0; reg [3:0] C = 4'b0000; reg PUSH; reg CA,CB,CC,CD,CE,CF,CG,A4; always @(posedge CLK) begin // PUSH = (Q == 26'd1); // ModelSimben teszteléshez PUSH = (Q == 26'd49999999); if (SW1) begin if (PUSH) begin if (C == 4'd15) C <= 4'b0; else C <= C+1; Q <= 26'b0; end else Q <= Q+1; end else C <= 4'b0; case(C) 4'h0 : begin CA = 0; CB = 0; CC = 0; CD = 0; CE = 0; CF = 0; CG = 1; A4 = 1; end 4'h1 : begin CA = 1; CB = 0; CC = 0; CD = 1; CE = 1; CF = 1; CG = 1; A4 = 1; end 4'h2 : begin CA = 0; CB = 0; CC = 1; CD = 0; CE = 0; CF = 1; CG = 0; A4 = 1; end 4'h3 : begin CA = 0; CB = 0; CC = 0; CD = 0; CE = 1; CF = 1; CG = 0; A4 = 1; end 4'h4 : begin CA = 1; CB = 0; CC = 0; CD = 1; CE = 1; CF = 0; CG = 0; A4 = 1; end 4'h5 : begin CA = 0; CB = 1; CC = 0; CD = 0; CE = 1; CF = 0; CG = 0; A4 = 1; end 4'h6 : begin CA = 0; CB = 1; CC = 0; CD = 0; CE = 0; CF = 0; CG = 0; A4 = 1; end 4'h7 : begin CA = 0; CB = 0; CC = 0; CD = 1; CE = 1; CF = 1; CG = 1; A4 = 1; end 4'h8 : begin CA = 0; CB = 0; CC = 0; CD = 0; CE = 0; CF = 0; CG = 0; A4 = 1; end 4'h9 : begin CA = 0; CB = 0; CC = 0; CD = 0; CE = 1; CF = 0; CG = 0; A4 = 1; end 4'hA : begin CA = 0; CB = 0; CC = 0; CD = 0; CE = 0; CF = 1; CG = 0; A4 = 1; end 4'hB : begin CA = 1; CB = 1; CC = 0; CD = 0; CE = 0; CF = 0; CG = 0; A4 = 1; end 4'hC : begin CA = 1; CB = 1; CC = 1; CD = 0; CE = 0; CF = 1; CG = 0; A4 = 1; end 4'hD : begin CA = 1; CB = 0; CC = 0; CD = 0; CE = 0; CF = 1; CG = 0; A4 = 1; end 4'hE : begin CA = 0; CB = 0; CC = 1; CD = 0; CE = 0; CF = 0; CG = 0; A4 = 1; end 4'hF : begin CA = 0; CB = 1; CC = 1; CD = 1; CE = 0; CF = 0; CG = 0; A4 = 1; end endcase end endmodule |
module szaml(CLK,SW1,A4,COUT); input CLK; input SW1; output A4; output [6:0] COUT; reg [25:0] Q = 26'd0; reg [3:0] C = 4'b0000; wire PUSH; assign A4 = 1; assign PUSH = (Q == 26'd1); // ModelSimben teszteléshez //assign PUSH = (Q == 26'd49999999); always @(posedge CLK) begin if (SW1) begin if (PUSH) begin if (C == 4'd15) C <= 4'b0; else C <= C+1; Q <= 26'b0; end else Q <= Q+1; end end hexa dekoder(C,COUT); endmodule module hexa(IN, OUT); input [3:0] IN; output [6:0] OUT; reg[6:0] OUT; always @(IN) case (IN) 4'b0001 : OUT = 7'b1111001; // 1 4'b0010 : OUT = 7'b0100100; // 2 4'b0011 : OUT = 7'b0110000; // 3 4'b0100 : OUT = 7'b0011001; // 4 4'b0101 : OUT = 7'b0010010; // 5 4'b0110 : OUT = 7'b0000010; // 6 4'b0111 : OUT = 7'b1111000; // 7 4'b1000 : OUT = 7'b0000000; // 8 4'b1001 : OUT = 7'b0010000; // 9 4'b1010 : OUT = 7'b0001000; // A 4'b1011 : OUT = 7'b0000011; // b 4'b1100 : OUT = 7'b1000110; // C 4'b1101 : OUT = 7'b0100001; // d 4'b1110 : OUT = 7'b0000110; // E 4'b1111 : OUT = 7'b0001110; // F default : OUT = 7'b1000000; // 0 endcase endmodule A hexa modul megtalálható: Edit/Languge Templates/Verilog/Synthesis Constructs/Coding Examples/Misc/7-Segment Display Hex Conversion Ez a a verzió elvileg ModelSimben működik, FPGA-ra sosem lett feltöltve. -- Roli - 2006.05.18. [Az eredeti változaton módosítás: assign az A4-re és a PUSH-ra, push az előző példához hasonlóan kihagyható amúgy. FPGA-n ellenőrizve, működik. -- Bandita - 2006.05.18. ] |
-- Đani - 2005.05.11
Baloldali: blokkoló vs. nem blokkoló hibás ugyanúgy mint eddig, itt CA-CF esetén, plusz önkínzás ezt begépelni. Az engedélyező anódra nincs értelme minden sorban kiadni az 1-et, fixen ki kell kötni assignnal.
-- Bandita - 2006.05.17.
5-4 Funkció:
A hálózat egy 4 bites léptető regiszter, melynek kimenete vissza van kötve a bemenetre. A hálózat az SW1 kapcsoló 0 állásában alapállapotba kerül. A regiszter alapállapota 4'b1000. A hálózat órajele az FPGA panel 50 MHz-es órajele. Léptetés az SW1 kapcsoló 1 állásában történik. A számlálást egy kb. másodpercenként érkező, 1 órajel szélességű engedélyező jel ütemezi. Ezt a jelet is a hálózat állítja elő. A regiszter kimeneteinek állapotát az LD5-8 LED-ek jelzik..
Megoldás:
module regiszter(CLK, LED, SW1, PUSH); input CLK; input SW1; output PUSH; output reg [3:0] LED; reg PUSH; reg [25:0] Q = 26'd0; always @(posedge CLK) begin PUSH = (Q == 26'd1); // ModelSimben teszteléshez // PUSH = (Q == 26'd49999999); if (SW1) begin if (PUSH) begin LED[3]<=LED[0]; LED[0] <=LED[1]; LED[1]<=LED[2]; LED[2]<=LED[3]; Q <= 26'b0; end else Q <= Q+1; end else LED <= 4'b1000; end endmodule
Ez sem lett FPGA-ra töltve, csak ModelSimben tesztelve.
-- Roli - 2006.05.18.
- Ezen a helyen volt linkelve a(z) EM-Kidolgozottfeladatok.pdf nevű fájl ("EM-Kidolgozottfeladatok.pdf" link szöveggel) a régi wiki http://wiki-old.sch.bme.hu/bin/view/Infoalap/MeresLaborEllGy oldaláról. (Ha szükséged lenne a fájlra, akkor a pontos oldalmegnevezéssel együtt küldd el a wiki sch.bme.hu címre a kérésedet)
- Kidolgozott EM kiadott feladatok