FPGA FPGA ile 7-Segment Sayıcı By Ahmet Memeşil Posted on 22 Ocak 2016 9 min read 0 0 4,752 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 seven segment display üzerinde 9999 ‘a kadar aşağı ve yukarı sayan sayıcı tasarımımızı anlatmak istiyorum. Bu örneğimizde daha öncekiler gibi 50Mhz lik kristalin her yükselen kenar tetiklemesine uygun bekleme konulduktan sonra girişteki switch in uygun konumuna göre sayıcı aşağı veya yukarı saymaya başlıyor. Bu örneğimiz VHDL dilinde sıkça kullanılan with-select seçme yönteminin anlaşılmasında çok güzel bir örnek olduğunu düşünüyorum. Programın entity kısmı incelendiğinde giriş olarak clock ve switch kullanılırken çıkış olarak 28 tane farklı bacak kullanıldı böyle bir proje için FPGA in 28 tane bacağını kullanmak aslında pek uygun değil bu projenin aynısı çıkış bacağı olarak 11 tane pin kullanılıp gerçekleştirilebilirdi fakat bunu yapabilmek için her bir display in ayrı ayrı enable ucu bulunması gerekiyor bu enable uçları insan gözünün algılayamayacağı bir hızda sıra ile taranarak projenin aynısı gerçekleşebilirdi. Fakat kullandığımız geliştirme kitinde display lerin böyle bir özelliği olmadığı için her bir displayi tek tek kontrol etmek zorunda kaldım. (NOT: Kullanılan displayler ortak anotlu) VHDL kodu: [php] library ieee; use ieee.std_logic_1164.all; library altera; use altera.altera_syn_attributes.all; entity seven_segment is Port ( clk : in STD_LOGIC; switch : in std_logic; —yukarı/aşağı output1 : out STD_LOGIC; output2 : out STD_LOGIC; output3 : out STD_LOGIC; output4 : out STD_LOGIC; — birinci display çıkışları output5 : out STD_LOGIC; output6 : out STD_LOGIC; output7 : out STD_LOGIC; output11 : out STD_LOGIC; output12 : out STD_LOGIC; output13 : out STD_LOGIC; output14 : out STD_LOGIC; — ikinci display çıkışları output15 : out STD_LOGIC; output16 : out STD_LOGIC; output17 : out STD_LOGIC; output21 : out STD_LOGIC; output22 : out STD_LOGIC; output23 : out STD_LOGIC; output24 : out STD_LOGIC; — üçüncü display çıkışları output25 : out STD_LOGIC; output26 : out STD_LOGIC; output27 : out STD_LOGIC; output31 : out STD_LOGIC; output32 : out STD_LOGIC; output33 : out STD_LOGIC; output34 : out STD_LOGIC; — dördüncü display çıkışları output35 : out STD_LOGIC; output36 : out STD_LOGIC; output37 : out STD_LOGIC); end seven_segment; architecture Behavioral of seven_segment is signal temp: std_logic_vector(6 downto 0); signal temp1: std_logic_vector(6 downto 0); signal temp2: std_logic_vector(6 downto 0); signal temp3: std_logic_vector(6 downto 0); signal sayici: integer:=0; signal sayici1: integer:=0; signal sayici2: integer:=0; signal sayici3: integer:=0; signal bekle: integer:=0; begin process(clk) begin if clk’event and clk=’1′ then if(bekle<10000000)then bekle<=bekle+1; else bekle<=0; end if; if(bekle=0)then if(switch=’0′)then —yukaru say sayici<= sayici+ 1; if sayici = 9 then sayici<=0; sayici1<= sayici1+ 1; if sayici1 = 9 then sayici1<=0; sayici2<= sayici2+ 1; if sayici2 = 9 then sayici2<=0; sayici3<=sayici3+1; if sayici3 = 9 then sayici3<=0; end if; end if; end if; end if; else —aşağı say sayici<= sayici-1; if sayici = 0 then sayici<=9; sayici1<= sayici1- 1; if sayici1 = 0 then sayici1<=9; sayici2<= sayici2- 1; if sayici2 = 0 then sayici2<=9; sayici3<=sayici3-1; if sayici3 = 0 then sayici3<=9; end if; end if; end if; end if; end if; end if; end if; end process; output1 <= temp(0); —birici display in çıkışlara atanması output2 <= temp(1); output3 <= temp(2); output4 <= temp(3); output5 <= temp(4); output6 <= temp(5); output7 <= temp(6); with sayici Select temp<= "1000000" when 0, "1111001" when 1, "0100100" when 2, "0110000" when 3, "0011001" when 4, "0010010" when 5, "0000010" when 6, "1111000" when 7, "0000000" when 8, "0010000" when 9, "1000000" when others; with sayici1 Select temp1<= "1000000" when 0, "1111001" when 1, "0100100" when 2, "0110000" when 3, "0011001" when 4, "0010010" when 5, "0000010" when 6, "1111000" when 7, "0000000" when 8, "0010000" when 9, "1000000" when others; output11 <= temp1(0); output12 <= temp1(1); —ikinci display in çıkışlara atanması output13 <= temp1(2); output14 <= temp1(3); output15 <= temp1(4); output16 <= temp1(5); output17 <= temp1(6); with sayici2 Select temp2<= "1000000" when 0, "1111001" when 1, "0100100" when 2, "0110000" when 3, "0011001" when 4, "0010010" when 5, "0000010" when 6, "1111000" when 7, "0000000" when 8, "0010000" when 9, "1000000" when others; output21 <= temp2(0); output22 <= temp2(1); —üçüncü display in çıkışlara atanması output23 <= temp2(2); output24 <= temp2(3); output25 <= temp2(4); output26 <= temp2(5); output27 <= temp2(6); with sayici3 Select temp3<= "1000000" when 0, "1111001" when 1, "0100100" when 2, "0110000" when 3, "0011001" when 4, "0010010" when 5, "0000010" when 6, "1111000" when 7, "0000000" when 8, "0010000" when 9, "1000000" when others; output31 <= temp3(0); output32 <= temp3(1); —dördüncü display in çıkışlara atanması output33 <= temp3(2); output34 <= temp3(3); output35 <= temp3(4); output36 <= temp3(5); output37 <= temp3(6); end Behavioral; [/php]