Untitled
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...