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 (http://www.youtube.com/watch?v=tKAlUihF0vE#)
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 (https://www.dropbox.com/s/gezq5jq375fbm4r/basdeneme1.rar)
yardım edebilecek kimse yokmu?
sorun neydi
herşey tamammış gibi görüntü veriyoda
hocam yazıda da dediğim gibi 7 segment olarak yapamıyorum ledlerle yaptığımı.
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.
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.
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] (http://imageshack.us/photo/my-images/338/20130204152059.jpg/)
[IMG]http://img442.imageshack.us/img442/8099/20130204152110.jpg[/img] (http://imageshack.us/photo/my-images/442/20130204152110.jpg/)
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.
Anladım. O zaman AN ye lojic olarak bir deger atarsak sorun çözülür
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
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;