A 2005.tavasz zh mintakérdései

A VIK Wikiből
(MeresLaborEllGy szócikkből átirányítva)

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