Fpga'de Clock Hatası

Başlatan vitruvius, 06 Ocak 2012, 02:11:33

vitruvius

Merhabalar, yapmak istediğim şey şu: b1 switch'i on olduğunda led1 ledim yansın. b1 switch'im on iken s1 butonuna basılırsa led1 sönsün ve led2 yansın. Led2 belli bir süre yanık kaldıktan sonra sönüp led1 tekrar yansın. Bu aşamayı halletim gibi gözüküyor.

İkinci aşamada led1 yanarken s1 butonum basılı değil ve s2 butonum basılı ise ilk aşamadan yanık gelen led1'imin sönüp led3'üm yansın. b2 switch'im on olduğunda ise led3 sönsün led1 tekrar yansın.

Bunları alt alta yazınca clock hatası alıyorum. Ayrı process'lerde mi yazmak lazım? O zaman nasıl yazmak lazım, yani led1'in durumunu bağlayan birden fazla durum olduğu için o zaman da hata aldım.

Aldığım hata şu şekilde:
ERROR:Place:1018 - A clock IOB / clock component pair have been found that are not placed at an optimal clock IOB /
   clock site pair. The clock component <s2_IBUF_BUFG> is placed at site <BUFGMUX_X2Y10>. The IO component <s2> is
   placed at site <IPAD64>.  This will not allow the use of the fast path between the IO and the Clock buffer. If this
   sub optimal condition is acceptable for this design, you may use the CLOCK_DEDICATED_ROUTE constraint in the .ucf
   file to demote this message to a WARNING and allow your design to continue. However, the use of this override is
   highly discouraged as it may lead to very poor timing results. It is recommended that this error condition be
   corrected in the design. A list of all the COMP.PINs used in this clock placement rule is listed below. These
   examples can be used directly in the .ucf file to override this clock rule.
   < NET "s2" CLOCK_DEDICATED_ROUTE = FALSE; >



Kodum da şu şekilde:

process(clk)
variable say:integer;

begin

	if (clk'EVENT and clk='1') then
		if (b1='1') then
		say:=say+1;
		led1<='1';		
			if(s1 and b1)='1' then
			led1<='0';				
				if (say<250000000) then				
				led2<='1';
					elsif (say>250000000 and say<400000000) then
					led1<='1';
					led2<='0';
						elsif (say>500000000) then
						say:=0;
							else						
							led1<='0';
							led2<='0';
				end if;
			end if;
		else
		led1<='0';
		led2<='0';
		end if;
	end if;				
	

	if s1='0' and s2='1' then
	led1<='0';
	led3<='1';
		if (b2='1') then
		led1<='1';
		led3<='0';
		end if;
	end if;
	
end process;


Teşekkür ederim. b ile s'ler kafa karıştırıyor farkındayım  :)

yamak

if s1='0' and s2='1' then
    led1<='0';
    led3<='1';
        if (b2='1') then
        led1<='1';
        led3<='0';
        end if;
    end if;

Bu kısmı da if clk'event and clk='1' then koşulunun içine yaz.Ya da .ucf dosyasına
NET "s1" CLOCK_DEDICATED_ROUTE = FALSE;
NET "s2" CLOCK_DEDICATED_ROUTE = FALSE;
şeklindeki komutları yaz düzelmesi lazım.

vitruvius

O kısmı da  if clk'event and clk='1' then kısmının içine yazılınca sorun düzeldi. Çok teşekkür ederim hocam. Sayenizde kaçan keyfim geldi valla  :)

pic365

O kısım clk içine alınmazsa latch oluşur. Ya clk içine alınması ya da eksik olan durumların tamamlanması lazım.

Örneğin aşağıdakine benzer bir şekilde yazılabilir.

if s1='0' and s2='1' then
    if (b2='1') then
        led1<='1';
        led3<='0';
    else
        led1<='0';
        led3<='1';
    end if;
else
    led1<='0';
    led3<='0';
end if;

vitruvius

Anladım hocam. Her if'in else durumlarını da yazarsak kurtarıyor yani. Clk içine alsak da aynı kapıya çıkıyor değil mi? Bir de bu latch dediğiniz olay ne oluyor?

pic365

Normalde latch veriyi yarım cycle tutan bir devre elemanı ama biz genelde onu başka bir anlamda kullanıyoruz. Devrede hiç register'dan geçmeden oluşan bir loop varsa bunlara latch diyoruz. Örneğin bir AND kapısının çıkışını doğrudan girişlerden birine bağlarsak latch olur.

VHDL ve Verilog'da tanımlanmayan durumlar için (sentezde) sinyalin kendisi bağlanır, yani değeri korunmaya çalışılır. Clock'suz işlemde öyle bağlayınca latch oluşuyor, fakat clock'lu işlemde araya register girdiğinden sorun çıkmıyor. Bu yüzden clock'lu işlemlerde bütün else durumlarını yazmak zorunlu değil.

yamak

Alıntı yapılan: kakalive - 07 Ocak 2012, 01:38:42
Normalde latch veriyi yarım cycle tutan bir devre elemanı ama biz genelde onu başka bir anlamda kullanıyoruz. Devrede hiç register'dan geçmeden oluşan bir loop varsa bunlara latch diyoruz. Örneğin bir AND kapısının çıkışını doğrudan girişlerden birine bağlarsak latch olur.

VHDL ve Verilog'da tanımlanmayan durumlar için (sentezde) sinyalin kendisi bağlanır, yani değeri korunmaya çalışılır. Clock'suz işlemde öyle bağlayınca latch oluşuyor, fakat clock'lu işlemde araya register girdiğinden sorun çıkmıyor. Bu yüzden clock'lu işlemlerde bütün else durumlarını yazmak zorunlu değil.
Hocam burada araya register girmesinden kastettiğiniz şey nedir? Biraz daha açabilir misiniz söylemek istediğinizi?

pic365

Alıntı yapılan: yamak - 07 Ocak 2012, 17:14:16
Hocam burada araya register girmesinden kastettiğiniz şey nedir? Biraz daha açabilir misiniz söylemek istediğinizi?
Örneğin AND kapısının çıkışını clock'lu process ile kapının bir girişine bağlarsak burada bir register sentezlenir. AND'in çıkışı registerın D girişine bağlanır, register'ın Q çıkışı da AND'in girişine.