fpganedir.com'da ara

fpganedir mail

 * Generik Kullanımı

 * ISE'de Package Tanımlama

 * Quartus II 'de Package
    Tanımlama

  * Component Tanımlanması

Generik Kullanımı

Örneğimizde 5 Mhz bir CLK üreten bir modül  tasarlayacağız. CLK sinyali  için 50 Mhz lik bir kristal kullanalım. (Böylece oluşturacağımız CLK sinyalinin peryodunun,  kristal CLK peryodunun  10 katı büyüklüğünde olacak.) 

Programımızda clk_katsayisi adında bir sabit tanımlayalım, ve sabitimizi 10'a eşitleyerek VHDL kodumuzu yazmaya başlayalım.

CLK Modülü Oluşturalım

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

entity CLK_Module is
   Port ( clk_kristal : in  STD_LOGIC;
              output       : out  STD_LOGIC);
end CLK_Module;

architecture Behavioral of CLK_Module is
     constant clk_katsayisi:integer:=10;
     signal counter,counter_next:integer range 0 to 10;
     begin
        process(clk_kristal)
            begin
                if rising_edge(clk_kristal) then
                    counter<=counter_next;
                end if;
            end process;
        counter_next<= 0 when counter= (clk_katsayisi-1) else
        counter+1;
        output<= '1' when counter < clk_katsayisi/ 2 else
                           '0';
    end Behavioral;

Böylece 5 Mhz CLK üreten bir adet modül tasarlamış olduk.

Daha Akıllıca Bir CLK Modülü Oluşturalım

VHDL yapısal tasarım yapabilme imkanı tanıyan bir dil olduğundan, yukarıda oluşturduğumuz CLK modülünü, farklı VHDL kodlarında da kullanabiliriz. Bu da bizlere aynı modülü farklı modüller içerisinde kullanırken tekrar tekrar yazma derdinden kurtarır.

Fakat yeni tasarımımızda 5 Mhz değilde 1 Khz lik bir CLK sinyaline ihtiyacımız olduğunu düşünseydik ne olacaktı? Hatta sorunu biraz daha karmaşıklaştırıp üç adet farklı frekanslarda CLK'lara ihtiyaç duyduğumuzu düşünelim.  Bu durumda 5 Mhz lik modülümüz hiç bir işe yaramayacak ve tekrar üç adet yeni modül oluşturmamız gerekecekti.

Peki bu farklı modüllerden onlarca kullanılması gereken bir tasarımla karşılaşsaydık? Bu durumda  tasarımcının  modüllerin  hepsini teker teker yazması  bir işkenceye  dönüşecekti.  Tüm bu sıkıntılardan kurtulmak için değişken ve sabitleri generik olarak tanımlamamız gerekir.

Yeni kodumuzda, CLK modülümüzdeki clk_katsayisi sabitini generic olarak tanımlayarak bu problemden kurtulmuş olduk.

CLK katsayısının generik olarak tanımlanması, aynı zamanda, bu modülü kullanacağımız bütün tasarımlarda, CLK katsayısını  istediğimiz gibi değiştirme imkanı sağlayacak.

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

entity CLK_Module is
     generic(clk_katsayisi:integer:=10 );
      Port ( clk_kristal : in  STD_LOGIC;
                 output : out  STD_LOGIC);
end CLK_Module;

architecture Behavioral of CLK_Module is
   signal counter,counter_next:integer:=0;
   begin
       process(clk_kristal)
          begin
              if rising_edge(clk_kristal) then
                 counter<=counter_next;
              end if;
      end process;
   counter_next<= 0 when counter= (clk_katsayisi-1) else
   counter+1;
   output<= '1' when counter < clk_katsayisi/ 2 else
                     '0';
end Behavioral;

Generik olarak tanımladığımız clk_katsayısının değerini değiştirerek istediğimiz frekansta CLK devresi elde etmiş oluruz.

Oluşturduğumuz CLK Modülünü Ana Programda Kullanalım

Aşağıdaki resim, generik olarak tanımlanmış bir modülün Quartus II programında şematiklerini gösteriyor.

Yukarıdaki modülü time adında bir VHDL kodunda kullandığımızı düşünürsek, aşağıdaki kodu elde ederiz.

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

entity time is
    Port ( clk_kristal : in  STD_LOGIC;
               out1 : out  STD_LOGIC;
               out2 : out  STD_LOGIC;
               out3  : out  STD_LOGIC);
end time;

architecture Behavioral of time is

COMPONENT CLK_Module
     GENERIC(clk_katsayisi:integer:=10);
     PORT(clk_kristal : IN std_logic;         
                 output : OUT std_logic);
END COMPONENT;

begin
    U5Mhz   : CLK_Module GENERIC MAP(clk_katsayisi=>10)
                                               PORT MAP(clk_kristal =>clk_kristal ,output =>out1 );
    U1Mhz   : CLK_Module GENERIC MAP(clk_katsayisi=>50)
                                               PORT MAP(clk_kristal =>clk_kristal ,output =>out2 );
    U100Khz : CLK_Module GENERIC MAP(clk_katsayisi=>500)
                                               PORT MAP(clk_kristal =>clk_kristal ,output =>out3 );                                                                             

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.