VHDL ile 7 Seg

Başlatan MC_Skywalker, 08 Haziran 2016, 18:07:44

MC_Skywalker

VHDL ile 7 segmet uygulması  deneme çalışması. BASYS 3 üstündeki 4 dijitlik 7 segment'in hepsini kullanarak 4bit sayıcının 7segmette gösterme gerçeklemesi.

http://youtu.be/qUkjNuYoByw

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.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);
     signal pulse : std_logic := '0';
     signal count : integer range 0 to 99999999 := 0;

begin
      process(clk)
     begin
          if clk= '1' and clk'event then
              if count = 99999999 then
                       count <= 0;
                       counter <= counter + 1;
               else
         count <= count + 1;
               end if;
          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;


bir sonraki adım tarama yöntemiyle 0-9999 sayıcı


MC_Skywalker

#1
önce bu videoyu ekleyecektim unutmuşum. çekip ekledim.

SW ile seçilen 4bit değeri 7 segmentte gösteren gerçekleme

http://youtu.be/kC9gGnZeiOI

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

entity SWinBCDto7SEG is
       Port ( sw : in STD_LOGIC_VECTOR (3 downto 0);
             -- led4 : out STD_LOGIC_VECTOR (3 downto 0);     
              seg : out STD_LOGIC_VECTOR (6 downto 0));
end SWinBCDto7SEG;

architecture Behavioral of SWinBCDto7SEG is
       
begin
    
      process (sw)
                              
                  begin
                  case sw is
                  when "0000" =>  seg <= "0000001"; --0 a b c d e f g
                  when "0001" =>  seg <= "1001111"; --1
                  when "0010" =>  seg <= "0010010"; --2
                  when "0011" =>  seg <= "0000110"; --3
                  when "0100" =>  seg <= "1001100"; --4
                  when "0101" =>  seg <= "0100100"; --5
                  when "0110" =>  seg <= "0100000"; --6
                  when "0111" =>  seg <= "0001111"; --7
                  when "1000" =>  seg <= "0000000"; --8
                  when "1001" =>  seg <= "0001100"; --9
                  when "1010" =>  seg <= "0001000"; --A
                  when "1011" =>  seg <= "1100000"; --b
                  when "1100" =>  seg <= "0110001"; --C
                  when "1101" =>  seg <= "1000010"; --d
                  when "1110" =>  seg <= "0010000"; --e
                  when "1111" =>  seg <= "0111000"; --F
                  when others =>  seg <= "1001000"; --Hata         
                  end case;
    end process;                                         
end Behavioral;

MC_Skywalker

0-9999 sayıcı yapmak için multuplexer kullanmayı beceremedim. bunun matığını h.ç bilmeyen birine anlatır gibi bana anlatacak biri arkadaş varmıdır?

şimdiden teşekürler

alicavuslu

#3
Hocam yapmak istediğiniz şey sayacın her bir rakamını mı göstermek mi?

MC_Skywalker

Evet Basys3 üzerindeki 4lü displayi kullanmak için. birçok örnek inceledim kafam karışıt. hepsi farklı teknik kullanmış.

Bir örnekte 200Hz clk ile tetiklenen iki bit sayıcı yapmış onu "case" kullanıp ortak uçların aktivasyonu için kullanmış.  ama sayıların basamaklarıyla nasıl eşlediğini anlaymadım.  Birbaşka örnekte karmaşık bir lojik kombinasyonu yapmış anlmadım.


alicavuslu

Aslında yapmak istediğiniz linkteki kronometre uygulaması ile aynı. Yapmanız gereken 4 tane farklı sinyal değeri tutmanız. Kodda bunu port maplarla sağlamakta.  pulse_generator ile sizin ilk display ekranınızın artış miktarı belirleniyor. Yani buradaki süre sonunda siz bir valid sinyali üretiyorsunuz. O sinyal ile birlikte artış yapıyorsunuz. Daha sonra bu display sinyalin in değeri 9'dan büyük olduğunda sıfırlama yapıyorsunuz. Ve yine bir valid sinyali üretiyorsunuz. Sonra diğer basamaktaki sinyali artırıyorsunuz. Bu şekilde tüm hepsini kontrol edebilirsiniz.

http://www.alicavuslu.gen.tr/2016/07/20/dijital-kronometre-uygulamasinin-nexys-4-karti-uzerinde-gerceklenmesi/