BCD to Binary (74145 yapmak)

Başlatan MC_Skywalker, 23 Eylül 2015, 11:55:53

MC_Skywalker

Basys3'ü öğrenmeye devam. FPGA eğitimi konusunda bir çizim paylaşmıştım orda bir counter ve 7 seg dekoder var. bunu gerçeklemeden önce 74154 gibi 4to16 demultiplexeri  taklit etmek istedim. ve kodları yazmaya koyuldum.

Aşağıdaki gibi bir yaklaşım ile yazmaya çalışıyorum. bu yol doğru yol mu? kod tamam değildir sadece yol/yaklaşım doğrumu onu öğrenmek ve fikir almak için sordum.

----------------------------------------------------------------------------------
-- Create Date: 23.09.2015 11:24:33
-- Create eden: MC_Skywalker scpecialist@yahoo.com
-- Design Name: Henüz Namesi yok.
-- Module Name: DortTOOnlati - Behavioral
-- Project          : BCD 4bit i 16 LED ile göstermek
----------------------------------------------------------------------------------

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;


entity DortTOOnlati is
    Port ( data : in STD_LOGIC_VECTOR (3 downto 0);
           led015 : out STD_LOGIC_VECTOR (15 downto 0));
end DortTOOnlati;

architecture Behavioral of DortTOOnlati is

begin
    process (data)
                       
            begin
            case data is
                 when "0000" =>  led015 := "0000000000000001";  --0
                 when "0001" =>  led015 := "0000000000000010";  --1
                 when "0010" =>  led015 := "0000000000000100";  --2
                 when "0011" =>  led015 := "0000000000001000";  --3
                 when "0100" =>  led015 := "0000000000010000";  --4
                 when "0101" =>  led015 := "0000000000100000";  --5
                 when "0110" =>  led015 := "0000000001000000";  --6
                 when "0111" =>  led015 := "0000000010000000";  --7
                 when "1000" =>  led015 := "0000000100000000";  --8
                 when "1001" =>  led015 := "0000001000000000";  --9
                 when "1010" =>  led015 := "0000010000000000";  --10
                 when "1011" =>  led015 := "0000100000000000";  --11
                 when "1011" =>  led015 := "0001000000000000";  --12
                 when "1011" =>  led015 := "0010000000000000";  --13
                 when "1011" =>  led015 := "0100000000000000";  --14
                 when "1011" =>  led015 := "1000000000000000";  --15
                 when others => led015:= "0000000000000000" --         
                 end case;
    end process;
end Behavioral;

alicavuslu

Hocam izlediğiniz yol doğrudur. Kodda da sorun yok gibi görünüyor. Tabiki sentezleme işlemi sonucuna bakmak lazım.

MC_Skywalker

Kart üstündeki sw durumlarını alıp case işlemine göndereceğimi çözemedim. Kafam karıştı.

alicavuslu

Hocam sentezleme işlemini yaptıktan sonra pin atama işlemi yapmanız gerekiyor. Pin atama işlemlerinde in portlarına sw'lerin konumlarını tanımlayacaksınız. Çıkışa ise tüm ledlerin konumlraını tanımlayacaksınız.

Bu işlemi tamamladıktan sonra implementation, Generate Bit Stream işlemlerini yapıyoruz. Son olarak FPGA'ya üretilen bit dosyasını gönderiyoruz.

MC_Skywalker

Sw için kod yapısını kuramadım. Pin atamaları değil.

Sw okuma için nasıl bir process yazacağımı çorba ettim. :) vhd dosyası syntax error kaynıyor. Bir mola verdikten sonra yukarıdaki koda dönüp devam ederim. 

alicavuslu

Hocam kod aşağıdaki gibi olmalıdır. case içerisinde siz aynı değerlerde atamalar yapmışsınız.  Bunun hatasını veriyor. Birde when others kısmında ; kullanmamışsınız.

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;


entity DortTOOnlati is
    Port ( data : in STD_LOGIC_VECTOR (3 downto 0);
           led015 : out STD_LOGIC_VECTOR (15 downto 0));
end DortTOOnlati;

architecture Behavioral of DortTOOnlati is

begin
    process (data)
                       
            begin
            case data is
                 when "0000" =>  led015 <= "0000000000000001";  --0
                 when "0001" =>  led015 <= "0000000000000010";  --1
                 when "0010" =>  led015 <= "0000000000000100";  --2
                 when "0011" =>  led015 <= "0000000000001000";  --3
                 when "0100" =>  led015 <= "0000000000010000";  --4
                 when "0101" =>  led015 <= "0000000000100000";  --5
                 when "0110" =>  led015 <= "0000000001000000";  --6
                 when "0111" =>  led015 <= "0000000010000000";  --7
                 when "1000" =>  led015 <= "0000000100000000";  --8
                 when "1001" =>  led015 <= "0000001000000000";  --9
                 when "1010" =>  led015 <= "0000010000000000";  --10
                 when "1011" =>  led015 <= "0000100000000000";  --11
                 when "1100" =>  led015 <= "0001000000000000";  --12
                 when "1101" =>  led015 <= "0010000000000000";  --13
                 when "1110" =>  led015 <= "0100000000000000";  --14
                 when "1111" =>  led015 <= "1000000000000000";  --15
                 when others =>  led015 <= "0000000000000000"; --         
                 end case;
    end process;
end Behavioral;

MC_Skywalker

#6
Sytax hatasını buldum
; yazmayı unutuğım yerler varmış. :( := olanlarıda <= şeklinde düzelltim.


Syntizes sonrası herşey çalışmakta. @alicavuslu hocama yardımlarından dolayı teşekürler. bu projeyi %25 bana ait olarak tamamladım.
VHDL kodu aşağıda. Upload biter bitmez videosunu seyredebileceksiniz.
----------------------------------------------------------------------------------
-- Create Date: 23.09.2015 11:24:33
-- Create eden: MC_Skywalker scpecialist@yahoo.com
-- Design Name: 
-- Module Name: DortTOOnlati - Behavioral
-- Project Name: BCD 4bit i 16 LED ile göstermek
----------------------------------------------------------------------------------

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;


entity DortTOOnlati is
    Port ( data : in STD_LOGIC_VECTOR (3 downto 0);
           led015 : out STD_LOGIC_VECTOR (15 downto 0));
end DortTOOnlati;

architecture Behavioral of DortTOOnlati is

begin
    process (data)
                       
            begin
            case data is
                 when "0000" =>  led015 <= "0000000000000001";  --0
                 when "0001" =>  led015 <= "0000000000000010";  --1
                 when "0010" =>  led015 <= "0000000000000100";  --2
                 when "0011" =>  led015 <= "0000000000001000";  --3
                 when "0100" =>  led015 <= "0000000000010000";  --4
                 when "0101" =>  led015 <= "0000000000100000";  --5
                 when "0110" =>  led015 <= "0000000001000000";  --6
                 when "0111" =>  led015 <= "0000000010000000";  --7
                 when "1000" =>  led015 <= "0000000100000000";  --8
                 when "1001" =>  led015 <= "0000001000000000";  --9
                 when "1010" =>  led015 <= "0000010000000000";  --10
                 when "1011" =>  led015 <= "0000100000000000";  --11
                 when "1100" =>  led015 <= "0001000000000000";  --12
                 when "1101" =>  led015 <= "0010000000000000";  --13
                 when "1110" =>  led015 <= "0100000000000000";  --14
                 when "1111" =>  led015 <= "1000000000000000";  --15
                 when others =>  led015 <= "0000000000000000";  --Hata         
                 end case;
    end process;
end Behavioral;


http://youtu.be/4BHIVRS0Hs4




MC_Skywalker

bu projemiz çalıştığına göre girş kısmını bir sayaç ile değiltirip 0-15 arası bir sayıcı yapayım dedim fakat beceremedim.
Bolca ahat kodu alıyorum.

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

entity sayac1 is
    Port ( clk : in STD_LOGIC;
          led015 : out STD_LOGIC_VECTOR (15 downto 0));
end sayac1;

architecture Behavioral of sayac1 is
     signal counter: std_logic_vector(3 downto 0):= "0000";
begin
     process(clk)
     begin
          if clk= '1' and clk'event then
                 counter<=counter + '1';
          end if;
     end process;
      gecici <= counter;
      
      process (gecici)
          signal gecici: std_logic_vector(3 downto 0);                   
                  begin
                  case gecici is
                       when "0000" =>  led015 <= "0000000000000001";  --0
                       when "0001" =>  led015 <= "0000000000000010";  --1
                       when "0010" =>  led015 <= "0000000000000100";  --2
                       when "0011" =>  led015 <= "0000000000001000";  --3
                       when "0100" =>  led015 <= "0000000000010000";  --4
                       when "0101" =>  led015 <= "0000000000100000";  --5
                       when "0110" =>  led015 <= "0000000001000000";  --6
                       when "0111" =>  led015 <= "0000000010000000";  --7
                       when "1000" =>  led015 <= "0000000100000000";  --8
                       when "1001" =>  led015 <= "0000001000000000";  --9
                       when "1010" =>  led015 <= "0000010000000000";  --10
                       when "1011" =>  led015 <= "0000100000000000";  --11
                       when "1100" =>  led015 <= "0001000000000000";  --12
                       when "1101" =>  led015 <= "0010000000000000";  --13
                       when "1110" =>  led015 <= "0100000000000000";  --14
                       when "1111" =>  led015 <= "1000000000000000";  --15
                       when others =>  led015 <= "0000000000000000";  --Hata         
                       end case;
          end process;
end Behavioral;


Bu iki farklı bileşeni nasıl kurup haberleştireceğim?



alicavuslu

#8
Hocam gecici değişkenini yanlış yerde tanımlamışsınız. Birde 3. satırdaki kütüphaneyi eklemeniz gerekmektedir.

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

entity sayac1 is
    Port ( clk : in STD_LOGIC;
          led015 : out STD_LOGIC_VECTOR (15 downto 0));
end sayac1;

architecture Behavioral of sayac1 is
     signal counter: std_logic_vector(3 downto 0):= "0000";
     signal gecici : std_logic_vector(3 downto 0):= "0000";
begin
     process(clk)
     begin
          if clk= '1' and clk'event then
                 counter<=counter + '1';
          end if;
     end process;
      gecici <= counter;
     
      process (gecici)
                             
                  begin
                  case gecici is
                       when "0000" =>  led015 <= "0000000000000001";  --0
                       when "0001" =>  led015 <= "0000000000000010";  --1
                       when "0010" =>  led015 <= "0000000000000100";  --2
                       when "0011" =>  led015 <= "0000000000001000";  --3
                       when "0100" =>  led015 <= "0000000000010000";  --4
                       when "0101" =>  led015 <= "0000000000100000";  --5
                       when "0110" =>  led015 <= "0000000001000000";  --6
                       when "0111" =>  led015 <= "0000000010000000";  --7
                       when "1000" =>  led015 <= "0000000100000000";  --8
                       when "1001" =>  led015 <= "0000001000000000";  --9
                       when "1010" =>  led015 <= "0000010000000000";  --10
                       when "1011" =>  led015 <= "0000100000000000";  --11
                       when "1100" =>  led015 <= "0001000000000000";  --12
                       when "1101" =>  led015 <= "0010000000000000";  --13
                       when "1110" =>  led015 <= "0100000000000000";  --14
                       when "1111" =>  led015 <= "1000000000000000";  --15
                       when others =>  led015 <= "0000000000000000";  --Hata         
                       end case;
          end process;
end Behavioral;

MC_Skywalker

#9
Ufak bir değişiklik yaptım

rchitecture Behavioral of sayac1 is
     signal counter: std_logic_vector(3 downto 0):= "0000";
begin
     process(clk)
     begin
          if clk= '1' and clk'event then
                 counter<=counter + '1';
          end if;
     end process;
      gecici <= counter;
     
      process (gecici)
          signal gecici: std_logic_vector(3 downto 0);                   
                  begin


kısmında
signal gecici: std_logic_vector(3 downto 0);                   
satırını yukarı taşıdım. Kodu son hali aşağıda

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

entity sayac1 is
    Port ( clk : in STD_LOGIC;
          led015 : out STD_LOGIC_VECTOR (15 downto 0));
end sayac1;

architecture Behavioral of sayac1 is
     signal counter: std_logic_vector(3 downto 0):= "0000";
     signal gecici: std_logic_vector(3 downto 0); 
begin
     process(clk)
     begin
          if clk= '1' and clk'event then
                 counter<=counter + '1';
          end if;
     end process;
      gecici <= counter;
      
      process (gecici)
                            
                  begin
                  case gecici is
                       when "0000" =>  led015 <= "0000000000000001";  --0
                       when "0001" =>  led015 <= "0000000000000010";  --1
                       when "0010" =>  led015 <= "0000000000000100";  --2
                       when "0011" =>  led015 <= "0000000000001000";  --3
                       when "0100" =>  led015 <= "0000000000010000";  --4
                       when "0101" =>  led015 <= "0000000000100000";  --5
                       when "0110" =>  led015 <= "0000000001000000";  --6
                       when "0111" =>  led015 <= "0000000010000000";  --7
                       when "1000" =>  led015 <= "0000000100000000";  --8
                       when "1001" =>  led015 <= "0000001000000000";  --9
                       when "1010" =>  led015 <= "0000010000000000";  --10
                       when "1011" =>  led015 <= "0000100000000000";  --11
                       when "1100" =>  led015 <= "0001000000000000";  --12
                       when "1101" =>  led015 <= "0010000000000000";  --13
                       when "1110" =>  led015 <= "0100000000000000";  --14
                       when "1111" =>  led015 <= "1000000000000000";  --15
                       when others =>  led015 <= "0000000000000000";  --Hata         
                       end case;
          end process;
end Behavioral;


şeklinde oldu. busefer ki hata
Alıntı Yap[Synth 8-944] 0 definitions of operator "+" match here ["E:/elektron/VHDL/sayac_1/sayac_1.srcs/sources_1/new/sayac-1.vhd":16]



alicavuslu

#10
Hocam o hata kütüphane eksikliğinden kaynaklanıyor. Önceki cevapta da belirttim.

mesaj birleştirme:: 24 Eylül 2015, 18:49:34

Hocam bir de use IEEE.STD_LOGIC_UNSIGNED.ALL; kütüphaneyi eklemniz gerekmektedir. Az önce eksik bilgi verdim kusura bakmayın.

MC_Skywalker

Mesajı okumadan
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
bende bu iki kütüpaneyi ekleyip syntsize başlatmıştım

alicavuslu

#12
Hocam örneğinizi case yerine type kullanarak geliştirmenizi öneririm. 16 uzunluğunda 16 bitlik tipler tanımlayıp daha sonra 4 bitlik giriş değerine bağlı olarak tablodaki değeri dışarı döndürmek gibi.

Örneğin:

led015 <= my_type(conv_integer(data));

MC_Skywalker

#13
Bahsetiğiniz şekilde bir denemede yapacağım.  17 Ekime kadar ufaktan zemin çalışması yapıyorum.

mesaj birleştirme:: 24 Eylül 2015, 20:02:11

clk frekansı 100Mhz olduğu için bölmek gerekli tüm ledler sabit yanıyor :)

alicavuslu

Alıntı yapılan: MC_Skywalker - 24 Eylül 2015, 19:36:35clk frekansı 100Mhz olduğu için bölmek gerekli tüm ledler sabit yanıyor :)

Hazır bu şekilde frekans bolme işlemini kodlamış olursunuz... :)