Ynt: Basys2-7 segment sorunu

Başlatan metaltrrocker, 03 Şubat 2013, 01:06:04

metaltrrocker

Arkadaşlar marhaba basys2 fpga kitine 4-bit up counter kodlarını yazdırmaya çalışıyorum.ucf dosyalarıyla daha önce çalışmadım hiç.labda direk pinleri kod yazmadan atıyorduk ama şimdi yapamadım.Ama ucf dosyasını yazdım basit olarak ledlerden program çalışmasını izliyorum burda sıkıntı yok ancak,7segment olarak görmek istediğimde ,pinleri atayamadım .Internette de bununla ilgili pek doküman bulamadım basys2'nin referans manual'üne baktım ama düzgün bir bilgi bulamadım lütfen yardımcı olun.

mesaj birleştirme:: 03 Şubat 2013, 01:19:32

Bu normal çalışma videosu

Basys2-4 bit Counter



mesaj birleştirme:: 03 Şubat 2013, 01:22:41

Ucf kodları
NET "clk_m" TNM_NET = "clk_50";
TIMESPEC "TS_0" = PERIOD "clk_50" 5 ns HIGH 50%;
NET "Q(3)" LOC="G1";
NET "Q(2)" LOC="P4";
NET "Q(1)" LOC="N4";
NET "Q(0)" LOC="N5";
NET "reset" LOC="G12";


clk_divider kodlarım
--clk  bölücü kodları--
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity clk_divider is
    Port ( clk_50 : in  STD_LOGIC;--50Mhz giriş clk
           clk1 : out  STD_LOGIC--çıkış clk
           );
end clk_divider;

architecture Behavioral of clk_divider is
     --f_div=50MHz/(2^24)=2.98Hz=>1/2.98=0.34sn 
    signal clk_divider:std_logic_vector(23 downto 0):=x"000000";
	 
begin 
    
    clk_division : process (clk_50, clk_divider) 
    begin 
        if (clk_50 = '1' and clk_50'event) then 
            clk_divider <= clk_divider + 1; 
        end if; 
    clk1 <= clk_divider(23); 
     end process;
	  
    
end Behavioral;



4-bit Counter kodlarım
----------------------------------------------------------------------------------
-- Company: 
-- Engineer: 
-- 
-- Create Date:    19:11:57 02/02/2013 
-- Design Name: 
-- Module Name:    basys2 - Behavioral 
-- Project Name: 
-- Target Devices: 
-- Tool versions: 
-- Description: 
--
-- Dependencies: 
--
-- Revision: 
-- Revision 0.01 - File Created
-- Additional Comments: 
--
----------------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

---- Uncomment the following library declaration if instantiating
---- any Xilinx primitives in this code.
--library UNISIM;
--use UNISIM.VComponents.all;

entity basys2 is
    Port (
	        clk_m : in STD_LOGIC;
	        Q    : inout  STD_LOGIC_VECTOR(3 downto 0);
			  reset: in STD_LOGIC
			  
			 );
end basys2;

architecture Behavioral of basys2 is

COMPONENT clk_divider
	PORT(
		clk_50 : IN std_logic;          
		clk1 : OUT std_logic
		);
	END COMPONENT;
	
signal sayac:std_logic_vector(3 downto 0);
signal clk_c:std_logic;
begin
process(reset,clk_c)
begin

if(reset='1') then 
	sayac<="0000";
elsif rising_edge(clk_c) then
	sayac<=sayac+"0001";
end if;

end process;
Q<=sayac;
Inst_clk_divider: clk_divider PORT MAP(
		clk_50 => clk_m,
		clk1 => clk_c 
	);
end Behavioral;


mesaj birleştirme:: 03 Şubat 2013, 01:23:34

Bu da proje klasörüm
https://www.dropbox.com/s/gezq5jq375fbm4r/basdeneme1.rar

metaltrrocker

yardım edebilecek kimse yokmu?

speak48

sorun neydi
herşey tamammış gibi görüntü veriyoda

metaltrrocker

hocam yazıda da dediğim gibi 7 segment olarak yapamıyorum ledlerle yaptığımı.

speak48

sorun kısım tasarımdamı sentezdemi
tasarımda ise cnt registerini dekode edicen 7segmene göre.
sentezde ise pin atamasınında illa text ile yapmaya gerek yok ellle tek tek gui aracılığıyla atanabilir.
altera pinplanerde xilinx planahead olması lazım presentezden sonra
io pin planning  iş akışı iş göreccektir.

metaltrrocker

Tasarım kısmında da sorun vardı,clk bölücü den çıkan yeni clk yı(clk1)  basys2.vhd de kullanmak isteyince clk ile ilgili hata verdi.galiba clocklar çakıştı yada buna benzer bir hata.Sonuç olarak hatayı çözemedim.aynı dosyada component almadan farklı clock kullanamıyoruz galiba.Hata üstüne hata verdi sinir etti beni nette de bişey bulamadım.
şimdi sıfırdan başlıyorum.

metaltrrocker

xilinx in 10.1 sürümünü kullanıyordum planahead yoktu.O yüzden enson sürümünü indirip kurdum decode ile 7 segmente sayac'ı gönderdim.Ancak plahahead da tek bir 7 segment seçme olayını bulamadım.tüm segmentlerde sayıyor.Bu sorunu nasıl aşabilirim?
ekran görüntüsü aşağıdadır.
[IMG]http://img338.imageshack.us/img338/3929/20130204152059.jpg[/img]


[IMG]http://img442.imageshack.us/img442/8099/20130204152110.jpg[/img]


speak48

#7
board fpgadaki io sınırından dolayı 7segmetler paralel ayrı ayrı değil seri bağlanmıştır.
yani data portu ortak ama hangi segmentin yanacağı an adlı 4 çıkışla kontrol edilmekte
an yi seçerek hangisini yakacağına karar veririsin.
tüm kontrol ise tarama olayı ile kontrol edilir.
gözün algılamayacağı hızda sırayla 7segmentlere data verilip kontrol seçilir.
şematik ve usermanualde görebilirsin.

metaltrrocker

Anladım. O zaman AN ye lojic olarak bir deger atarsak sorun çözülür

metaltrrocker

Peki. Bu seçimleri yaparken,an1 ve an0 segmentlerine farklı değerler göstermek istediğim de ne yapmam gerekiyor.bu kısımda kafam karıştı biraz

speak48

tarama demiştim
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity disp_mux is
   port(
      clk, reset: in std_logic;
      in3, in2, in1, in0: in std_logic_vector(7 downto 0);
      an: out std_logic_vector(3 downto 0);
      sseg: out std_logic_vector(7 downto 0)
   );
end disp_mux ;

architecture arch of disp_mux is
   -- refreshing rate around 800 Hz (50MHz/2^16)
   constant N: integer:=18;
   signal q_reg, q_next: unsigned(N-1 downto 0);
   signal sel: std_logic_vector(1 downto 0);
begin
   -- register
   process(clk,reset)
   begin
      if reset='1' then
         q_reg <= (others=>'0');
      elsif (clk'event and clk='1') then
         q_reg <= q_next;
      end if;
   end process;

   -- next-state logic for the counter
   q_next <= q_reg + 1;

   -- 2 MSBs of counter to control 4-to-1 multiplexing
   -- and to generate active-low enable signal
   sel <= std_logic_vector(q_reg(N-1 downto N-2));
   process(sel,in0,in1,in2,in3)
   begin
      case sel is
         when "00" =>
            an <= "1110";
            sseg <= in0;
         when "01" =>
            an <= "1101";
            sseg <= in1;
         when "10" =>
            an <= "1011";
            sseg <= in2;
         when others =>
            an <= "0111";
            sseg <= in3;
      end case;
   end process;
end arch;