Fpga'de Zamana Bağlı İşlem

Başlatan vitruvius, 04 Ocak 2012, 00:47:25

vitruvius

Merhablar, fpga öğrenmeye başladım. Elimde Xilinx firmasının Spartan 3E Starter Board'u var. Basit temel kapılarla led yakma işlemleri yaptım. Şimdi ise buna zaman kontrolü eklemek istiyorum. Amacım 2 tane switch on olduğu zaman bir ledin 1sn yanıp tekrar sönmesi. Şu şekilde bir kodla denemeye başladım: (Henüz 2 switch'in on olma durumu eklemedim)

entity zaman is
    Port ( A : in  STD_LOGIC;
           B : in  STD_LOGIC;
           clk : in  STD_LOGIC;
           F : out  STD_LOGIC;
           Z : out  STD_LOGIC);
end zaman;

architecture Behavioral of zaman is

signal Y:std_logic;
begin
	process(clk)
	variable say:integer range 0 to 100000000;
begin	
	if(clk'EVENT and clk='1') then
	say:=say+1;
        F<=A and B; -- A and B işleminin 1 olduğunu led'de görelim.
	if(say>50000000) then
	say:=0;
	Z<=Y; -- 1 sn geçince başka bir led daha yansın.
end if;
end if;

end process;	


end Behavioral;


Şimdi burada pin atamaları kısmıda sorun yaşıyorum. Bir çıkışı atadıktan sonra 2.'yi yeşil alanlı bölgede atayamıyorum. Aşağıdaki resimdeki gibi oluyor.



Bir de A and B 1 olduğunda clk kısmının başlamasını nasıl sağlayabilirim? if(clk'EVENT and clk='1') then satırından önce bir if ile kontrol etmeye çalıştım ama hata verdi.

Teşekkür ederim.

yamak

Hocam clk yı her zaman kontrol ettir ama sayma işlemini A and B='1' olduğunda saydırmaya başla. Hatta A and B işlemini process in dışında yap bence.

vitruvius

Teşekkür ederim hocam. Şimdi deniyorum. Peki bu çıkış pinlerini atamada niye hata veriyor acaba?

vitruvius

Hocam böyle denedim ama hata verdi. Yanlış mı anladım acaba sizi.

if(clk'EVENT and clk='1') then
	if (A and B='1') then
	say:=say+1;
	F<=A and B; -- A and B işleminin 1 olduğunu led'de görelim.
	if(say>50000000) then
	say:=0;
	Z<=Y; -- 1 sn geçince başka bir led daha yansın.


if (A and B='1') then  satırda and can not have such operands in this context. hatasını veriyor.

yamak

Ben böyle bi uygulama yaptım i0 ve i1 ikisi de 1 ise o1 ve o2 bir saniye aralıklarla flash yapıyo. Değilse ikisi de 0 oluyo.
----------------------------------------------------------------------------------
-- Company: 
-- Engineer: 
-- 
-- Create Date:    01:55:19 01/04/2012 
-- Design Name: 
-- Module Name:    deneme - 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 using
-- arithmetic functions with Signed or Unsigned values
--use IEEE.NUMERIC_STD.ALL;

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

entity deneme is
	port(
			clk:in std_logic;
			i0,i1:in std_logic;
			o1,o2:out std_logic
			);
end deneme;

architecture Behavioral of deneme is

begin
process(clk)
variable say:integer;
begin
if clk'event and clk='1' then
	if (i0 and i1)='1' then
		say:=say+1;
		if say>5000000 and say<10000000 then
			o1<='1';
			o2<='0';
		elsif say>10000000 and say<15000000 then
			o2<='1';
			o1<='0';
		elsif say>15000000 then
			say:=0;
		else
			o2<='0';
			o1<='0';
		end if;
	else
		o2<='0';
		o1<='0';
	end if;
end if;
end process;		
end Behavioral;

vitruvius

if (A and B) ='1' then

Ben kodumda bir parantez hatası yapmışım sanırım =) Böyle yapınca error kalktı. Çok teşekkür ederim hocam. Sabah sakin kafayla kodumu yazıp deneyeceğim.

pic365

Merhaba,

İlk iletideki kodda Z çıkışına Y bağlanmış ama Y'ye bağlı hiçbir şey yok, hatanın sebebi bu olabilir.
Bu devre bana göre şöyle tasarlanabilir: "say" sinyali normalde sıfırda durur. "A and B = 1" olduğunda saymaya başlar, bir tur atar ve sıfıra gelince tekrar durur. 1 ile 50 milyon arasındayken F'ye bir, Z'ye sıfır atanır. 50 milyon ile 100 milyon arasında Z'ye bir, F'ye sıfır atanır. Diğer durumlarda (say=0 iken) iki sinyal de sıfır olur.