Untitled

 avatar
unknown
vhdl
2 years ago
3.4 kB
5
Indexable
LIBRARY ieee;
USE ieee.std_logic_1164.all;

ENTITY ssd_game2 IS    --
	PORT ( clk, stop: IN BIT;
		  dout: OUT BIT_VECTOR (6 DOWNTO 0));
END ssd_game2;

--  ssd_game2 isimli bir ENTITY (birişim) tanımlanmıştır. Bu entity, dış dünya ile iletişim kuran bir birimdir ve giriş (IN) ve çıkış (OUT) portlarına sahiptir.
--  Bu örnekte, clk ve stop isimli iki BIT giriş ve dout isimli bir BIT_VECTOR çıkışı vardır.
--  Daha sonra, ssd_game2 birimine ait fsm mimarisi tanımlanmıştır. Bu mimari, birimimizin iç davranışını tanımlar. 
--  İki tane sabit (time1, time2), bir tip (states) ve dört sinyal (present_state, next_state, count, flip) tanımlanmıştır.

ARCHITECTURE fsm OF ssd_game2 IS
	CONSTANT time1: INTEGER := 4; 		-- gerçek kullanımda değeri 80 olmalı
	CONSTANT time2: INTEGER := 2; 		-- gerçek kullanımda değeri 30 olmalı
	TYPE states IS (a, ab, b, bc, c, cd, d, de, e, ef, f, fa);
	SIGNAL present_state, next_state: STATES;
	SIGNAL count: INTEGER RANGE 0 TO 5;
	SIGNAL flip: BIT;

BEGIN

--  Daha sonra iki işlem tanımlanmıştır. İlk işlem, durum makinesinin güncellemelerini kontrol eder. 
--  Girişlerden biri stop olduğunda, durum makinesi başlangıç durumuna döner. 
--  Eğer clk bir yükselen kenar algıladıysa (yani 0'dan 1'e geçtiyse) ve belirli bir koşul karşılanıyorsa, durum güncellenir ve sayıcı sıfırlanır. 
--  Eğer koşul karşılanmıyorsa, sayıcı bir arttırılır.
	
	PROCESS (clk, stop)
	BEGIN
		IF (stop='1') THEN
			present_state <= a;
		ELSIF (clk'EVENT AND clk='1') THEN
			IF ((flip='1' AND count=time1) OR
				(flip='0' AND count=time2)) THEN
				count <= 0;
				present_state <= next_state;
			ELSE count <= count + 1;
			END IF;
		END IF;
	END PROCESS;

--  İkinci işlem, mevcut duruma göre bir dizi işlem gerçekleştirir. 
--  Her durum için, dout çıkışına belirli bir değer atanır, flip sinyali belirli bir değere set edilir ve next_state belirli bir duruma atanır.

	PROCESS (present_state)
	BEGIN
		CASE present_state IS
			WHEN a =>
				dout <= "1000000"; 	-- ondalık karşılığı 64
				flip<='1';
				next_state <= ab;
			WHEN ab =>
				dout <= "1100000"; 	-- ondalık karşılığı 96
				flip<='0';
				next_state <= b;
			WHEN b =>
				dout <= "0100000"; 	-- ondalık karşılığı 32
				flip<='1';
				next_state <= bc;
			WHEN bc =>
				dout <= "0110000"; 	-- ondalık karşılığı 48
				flip<='0';
				next_state <= c;
			WHEN c =>
				dout <= "0010000"; 	-- ondalık karşılığı 16
				flip<='1';
				next_state <= cd;
			WHEN cd =>
				dout <= "0011000"; 	-- ondalık karşılığı 24
				flip<='0';
				next_state <= d;
			WHEN d =>
				dout <= "0001000"; 	-- ondalık karşılığı 8
				flip<='1';
				next_state <= de;
			WHEN de =>
				dout <= "0001100"; 	-- ondalık karşılığı 12
				flip<='0';
				next_state <= e;
			WHEN e =>
				dout <= "0000100"; 	-- ondalık karşılığı 4
				flip<='1';
				next_state <= ef;
			WHEN ef =>
				dout <= "0000110";	 -- ondalık karşılığı 6
				flip<='0';
				next_state <= f;
			WHEN f =>
				dout <= "0000010"; 	-- ondalık karşılığı 2
				flip<='1';
				next_state <= fa;
			WHEN fa =>
				dout <= "1000010"; 	-- ondalık karşılığı 66
				flip<='0';
				next_state <= a;
		END CASE;
	END PROCESS;
END fsm;
Editor is loading...