FPGA FPGA ile 18 Bit’lik Aşağı – Yukarı Sayıcı By Ahmet Memeşil Posted on 4 Ekim 2015 6 min read 2 0 3,575 Paylaş ! Facebook Paylaş ! Twitter Paylaş ! Google+ Paylaş ! Reddit Paylaş ! Pinterest Paylaş ! Linkedin Paylaş ! Tumblr Merhaba arkadaşlar. Çizgi market sponsorluğunda tarafımıza gönderilen FPGA ile çalışmalarımız devam ediyor.FPGA kitine buradan ulaşabilirsiniz. Bugün sizlere FPGA boardumuz üzerinde bulunan 18 tane sıralı ledi kullanarak aşağı ve yukarı binary olarak sayan bir sayıcı tasarlayacağız. Haydi başlayalım. Öncelikle tasarımımız donanımsal olarak nelerden oluşacak onu kararlaştıralım. Tasarımımızda istediğimiz belli bir süre sonunda sayıcının kendini arttırması veya azaltması bunun için FPGA’e bir sinyal girişi olması gerekir ki bu sinyal geldiğinde sayıcımızda değişiklik meydana gelsin. Bu işlemi gerçekleştirmek için board ta bulunan 50 MHz’lik kristali kullanacağız (50 MHz’lik sinyal 20 nano saniyede bir değişim meydana getirir bu değişikliği görebilmemiz için programa bir bekleme koymamız gerekir.) kristalin her yükselen kenar tetiklemesinde işlemlerimizi gerçekleştireceğiz. Sayıcımızın aşağı ve yukarı saymasını istediğimiz için dışarıdan harici bir giriş ile sayıcının sayma yönünü belirtmemiz gerek, bunun için board üzerindeki herhangi bir switch veya butonu kullanabiliriz. Buraya kadar bahsettiklerimiz sayıcıya giriş parametreleriydi. Sayıcının çıkışına ise 18 bitlik bir vektör (17 downto 0) tanımlayarak çıkışımızı tanımlayacağız. Bu çıkışlara düşük ve yüksek değerlikli bitler dikkate alınarak pin ataması yapılmalıdır. Sistemimizin şeması aşağıda görüldüğü gibi tasarlamış olduk bu şema bize programımızın entity bölümünü göstermektedir. Entity kısmını tasarladıktan sonra programımıza geçebiliriz. [php] library ieee; –ieee ve stadart kütüphaneler use ieee.std_logic_1164.all; use ieee.numeric_std.all; library altera; use altera.altera_syn_attributes.all; entity kapi is port ( CLOCK_50 : in std_logic; –giriş clock sinyali KEY : in std_logic; –yön belirkeyici buton LEDR : out std_logic_vector(17 downto 0) –18 bitlik çıkış vektörümüz ); end kapi; architecture ppl_type of kapi is signal prescaller : integer range 0 to 800000:=0; –sinyal tanımlamaları signal result : integer range 0 to 131071:=0; begin LEDR<=std_logic_vector(to_unsigned(result,18)); –sinyal değişkenini çıkışa atadık. PROCESS(CLOCK_50) BEGIN if(CLOCK_50’EVENT AND CLOCK_50=’1′)THEN –yükselen kenarı belirleyen satır if(prescaller<800000)THEN — prescaller sinyalini saydırarak programa bekleme yaptırdık. prescaller<=prescaller+1; ELSE prescaller<=0; END IF; if(prescaller=0)THEN case KEY is –case yapısı burada key butonu kontrol edilerek sayma yönü belirlendi when ‘1’ => — key 1 ise yapılacak işlemler if(result<131071)THEN –18 bitlik sayıcıda max 131071 e kadar sayacağından bu değere ulaşana kadar değer arttırıldı result<=result+1; ELSE result<=0; END IF; when ‘0’ => –key 0 ise yapılacak işlemler if(result>0)THEN result<=result-1; ELSE result<=131071; END IF; end case; END IF; END IF; END PROCESS; –process in sonu end; [/php] Programda kullanılan clock_50 , key ve ledr değişkenleri kullanılan fpga veya boarda göre uygun pin atamaları yapılarak tasarım gerçeklenebilir. Evet arkadaşlar umarım faydalı olabilmişimdir, görüşmek üzere.