fpganedir.com'da ara

fpganedir mail

  * Proje Hakkında

  * SYNC Modül

  * Görüntü Üreteci

   *  VHDL Kod

Görüntü Üreteci

Piksel üreteci modülümüz, ekran için 3 bitlik RGB sinyali üretececek ve 3 adet alt modülden oluşacak.

Bu aşamada, ekranda yer almasını isteğimiz objeleri oluşturacağız. Örneğimizde duvar, top ve bar (çubuk) olmak üzere 3 adet obje kullanacağız. Fakat obje sayısını dilediğiniz gibi artırabilir ve bunların özelliklerini değiştirebilirsiniz..

Duvar Kodu:

constant duvar_l:integer :=10;--duvarın sol kenara uzaklığı
constant duvar_t:integer :=10;--duvarın yukarki kenara uzaklığı
constant duvar_k:integer :=10;--duvarın kalınlığı
signal duvar_on:std_logic;
signal rgb_duvar:std_logic_vector(2 downto 0);

………………………..

   duvar_on <= '1'  when x > duvar_l and x < (640-duvar_l)    and y> duvar_t and y < (duvar_t+ duvar_k)
  else
'0';
rgb_duvar<="000";--Siyah

Bar Kodu:

Bar sağ ve sola (x ekseninde) hareket edeceği için, bu objelerin sol duvara olan uzaklıkları değişken olacak. Barın kontrolü için iki anahtar (button_l, button_r) kullanılacak. Anahtardan biri barı sola hareket ettirirken diğeri sağa hareket ettirecek.

signal bar_l,bar_l_next:integer :=100; --barın sol kenara uzaklığı
constant bar_t:integer :=420;--barın üst kenara olan uzaklığı
constant bar_k:integer :=10;--barın kalınlığı
constant bar_w:integer:=120;--bar genişlik
constant bar_h:integer:=10;--barın  hızı
signal bar_on:std_logic;
signal rgb_bar:std_logic_vector(2 downto 0);

………………………..

   bar_on <= '1' when x > bar_l and x < (bar_l+bar_w)   and y> bar_t and y < (bar_t+ bar_k)
else
'0';
rgb_bar<="001";--Mavi

Top Kodu:

signal ball_l,ball_l_next:integer :=100;--topun sol kenara uzaklığı
signal ball_t,ball_t_next:integer :=100; --topun üst kenara uzaklığı
constant ball_w:integer :=20;--top yüksekliği
constant ball_u:integer :=20;--top uzunlığu
constant x_v,y_v:integer:=3;-- topun yatay ve düşey hız
signal top_on:std_logic;
signal rgb_top:std_logic_vector(2 downto 0); 

………………………..

  top_on <= '1' when x > ball_l and x < (ball_l+ball_u)   and y> ball_t and y < (ball_t+ ball_w)
else
'0';
rgb_top<="010";--yeşil    

ANİMASYON

Barda ve topta meydana gelen değişim, ekranın tazeleme zamanında yapılacak. (Yani 60 Hz frekansında değişiklikler meydana gelecek.)

--refresh (60 Hz)
signal refresh_reg,refresh_next:integer;
constant refresh_constant:integer:=830000;
signal refresh_tick:std_logic;

………………………..

process(clk)
   begin
     if clk'event and clk='1' then
      refresh_reg<=refresh_next;      
     end if;
   end process;

refresh_next<=   0     when refresh_reg= refresh_constant else
                            refresh_reg+1;
refresh_tick<= '1' when refresh_reg = 0 else
                            '0';

--bar animasyon
process(bar_l,refresh_tick,button_r,button_l)
 begin
bar_l_next<=bar_l;
    if refresh_tick= '1' then
if button_l='1' and bar_l > bar_h then
bar_l_next<=bar_l- bar_h;
elsif button_r='1' and bar_l < (639- bar_h-bar_w) then
bar_l_next<=bar_l+ bar_h;
end if;
end if;
end process;

--top animasyon
process(refresh_tick,ball_l,ball_t,xv_reg,yv_reg)
begin
      ball_l_next <=ball_l;
ball_t_next <=ball_t;
xv_next<=xv_reg;
yv_next<=yv_reg;
        if refresh_tick = '1' then
if ball_t> 400 and ball_l > (bar_l -ball_u) and ball_l < (bar_l +120)  then --top bar'a değdiği zaman
      yv_next<= -y_v ;
           elsif ball_t< 35  then --top duvara değdiği zaman
                  yv_next<= y_v;
  end if;
            if ball_l < 10 then --top sol kenara değdiği zaman
                xv_next<= x_v;
         elsif ball_l> 600 then                
             xv_next<= -x_v ;         --top sağ kenara değdiği zaman
       end if;
   ball_l_next <=ball_l +xv_reg;
ball_t_next <=ball_t+yv_reg;              
end if;
end process;

MUX

signal vdbt:std_logic_vector(3 downto 0);

.........................................................................

  vdbt<=video_on & duvar_on & bar_on & top_on;     
  with vdbt select
    rgb_next <="100"             when "1000",--arka ekran
                 rgb_duvar   when "1100",
rgb_duvar   when "1101",
rgb_bar       when "1010",
rgb_bar       when "1011",
rgb_top        when "1001",
                   "000"             when others;

Bütün Kod

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity Goruntu_ureteci is
     Port ( clk              : in  STD_LOGIC;
                x_sayac    : in  STD_LOGIC_VECTOR(9 downto 0);
                button_l    :in STD_LOGIC;
                button_r    :in STD_LOGIC;
                y_sayac    : in STD_LOGIC_VECTOR(9 downto 0);
                video_on  : in  STD_LOGIC;
                rgb             : out  STD_LOGIC_VECTOR(2 downto 0));
    end Goruntu_ureteci;

architecture Behavioral of Goruntu_ureteci is

--duvar
constant duvar_l:integer :=10;--duvarın sol kenara uzaklığı
constant duvar_t:integer :=10;--duvarın yukarki kenara uzaklığı
constant duvar_k:integer :=10;--duvarın kalınlığı
signal duvar_on:std_logic;
signal rgb_duvar:std_logic_vector(2 downto 0);

--bar
signal bar_l,bar_l_next:integer :=100; --barın sol kenara uzaklığı
constant bar_t:integer :=420;--barın üst kenara olan uzaklığı
constant bar_k:integer :=10;--barın kalınlığı
constant bar_w:integer:=120;--bar genişlik
constant bar_h:integer:=10;--barın  hızı
signal bar_on:std_logic;
signal rgb_bar:std_logic_vector(2 downto 0);

--top
signal ball_l,ball_l_next:integer :=100;--topun sol kenara uzaklığı
signal ball_t,ball_t_next:integer :=100; --topun üst kenara uzaklığı
constant ball_w:integer :=20;--top yüksekliği
constant ball_u:integer :=20;--top uzunlığu
constant x_v,y_v:integer:=3;-- topun yatay ve düşey hız
signal top_on:std_logic;
signal rgb_top:std_logic_vector(2 downto 0); 

--refresh(1/60)
signal refresh_reg,refresh_next:integer;
constant refresh_constant:integer:=830000;
signal refresh_tick:std_logic;

--top animasyon
signal xv_reg,xv_next:integer:=3;--yatay hız değişkeni
signal yv_reg,yv_next:integer:=3;--düşey hız değişkeni

--x,y piksel işaretleyicisi
signal x,y:integer range 0 to 650;

--mux
signal vdbt:std_logic_vector(3 downto 0);

--buffer
signal rgb_reg,rgb_next:std_logic_vector(2 downto 0);

begin

--x,y piksel işaretleyicisi
x <=conv_integer(x_sayac);
y <=conv_integer(y_sayac );

--refresh zamanı
process(clk)
    begin
        if clk'event and clk='1' then
             refresh_reg<=refresh_next;      
        end if;
    end process;

refresh_next<= 0                      when refresh_reg= refresh_constant else
                           refresh_reg+1;
refresh_tick<= '1' when refresh_reg = 0 else
                           '0';

--register
process(clk)
    begin
        if clk'event and clk='1' then
              ball_l<=ball_l_next;
              ball_t<=ball_t_next;
              xv_reg<=xv_next;
              yv_reg<=yv_next;
              bar_l<=bar_l_next;
       end if;
end process;

--bar animasyon
process(bar_l,refresh_tick,button_r,button_l)
    begin
         bar_l_next<=bar_l;
         if refresh_tick= '1' then
             if button_l='1' and bar_l > bar_h then
                   bar_l_next<=bar_l- bar_h;
             elsif button_r='1' and bar_l < (639- bar_h-bar_w) then
                   bar_l_next<=bar_l+ bar_h;
             end if;
         end if;
   end process;

--top animasyon
process(refresh_tick,ball_l,ball_t,xv_reg,yv_reg)
    begin
         ball_l_next <=ball_l;
         ball_t_next <=ball_t;
         xv_next<=xv_reg;
         yv_next<=yv_reg;
         if refresh_tick = '1' then
                if ball_t> 400 and ball_l > (bar_l -ball_u) and ball_l < (bar_l +120)  then --top bar'a değdiği zaman
                      yv_next<= -y_v ;
                elsif ball_t< 35  then--top duvara değdiği zaman
                      yv_next<= y_v;
                end if;
                if ball_l < 10 then --top sol kenara değdiği zaman
                       xv_next<= x_v;
                elsif ball_l> 600 then                
                       xv_next<= -x_v ;         --top sağ kenara değdiği zaman
                end if;
                ball_l_next <=ball_l +xv_reg;
                ball_t_next <=ball_t+yv_reg;              
       end if;
   end process;

--duvar objesi
duvar_on <= '1'  when x > duvar_l and x < (640-duvar_l) and y> duvar_t and y < (duvar_t+ duvar_k)   else
                        '0';
rgb_duvar<="000";--Siyah


--bar objesi
bar_on <= '1' when x > bar_l and x < (bar_l+bar_w) and y> bar_t and y < (bar_t+ bar_k) else
                    '0';
rgb_bar<="001";--Mavi

--top objesi
top_on <= '1' when x > ball_l and x < (ball_l+ball_u) and y> ball_t and y < (ball_t+ ball_w)
                         else
                    '0';
rgb_top<="010";  --Yeşil  

--buffer
process(clk)
     begin
         if clk'event and clk='1' then
              rgb_reg<=rgb_next;
         end if;
     end process;

--mux
vdbt<=video_on & duvar_on & bar_on & top_on;     
with vdbt select
     rgb_next <="100"               when "1000",--arka ekran, kırmızı
                           rgb_duvar      when "1100",
                           rgb_duvar      when "1101",
                           rgb_bar          when "1010",
                           rgb_bar          when "1011",
                           rgb_top          when "1001",
                           "000"               when others;
--output
rgb<=rgb_reg;

end Behavioral;

 

 

 

Anasayfa | Fpga | VHDL | VHDL Sözlüğü | Embedded Sistem | Android | Sayısal Tasarım | Simulasyon | PCB | Örnekler | Forum | İletişim
Copyright © 2010-2013 FPGAnedir. All Rights Reserved.