VHDL ile yazılan programda sorun

Başlatan yamak, 27 Eylül 2011, 14:33:24

yamak

Arakadaşlar fpga öğrenmeye başladım. Aşagıdaki programda sentezleme aşamasında uyarı veriyo.
uyarı şu şekilde:
=========================================================================
WARNING:Xst:2677 - Node <p0_0> of sequential type is unconnected in block <main>.
WARNING:Xst:2677 - Node <p0_1> of sequential type is unconnected in block <main>.
WARNING:Xst:2677 - Node <p0_2> of sequential type is unconnected in block <main>.
WARNING:Xst:2677 - Node <p0_3> of sequential type is unconnected in block <main>.
WARNING:Xst:2677 - Node <p0_4> of sequential type is unconnected in block <main>.
WARNING:Xst:2677 - Node <p0_5> of sequential type is unconnected in block <main>.
WARNING:Xst:2677 - Node <p0_6> of sequential type is unconnected in block <main>.
WARNING:Xst:2677 - Node <p0_7> of sequential type is unconnected in block <main>.
WARNING:Xst:2677 - Node <p0_8> of sequential type is unconnected in block <main>.
WARNING:Xst:2677 - Node <p0_9> of sequential type is unconnected in block <main>.
WARNING:Xst:2677 - Node <p0_10> of sequential type is unconnected in block <main>.
WARNING:Xst:2677 - Node <p0_11> of sequential type is unconnected in block <main>.
WARNING:Xst:2677 - Node <p0_12> of sequential type is unconnected in block <main>.
WARNING:Xst:2677 - Node <p0_13> of sequential type is unconnected in block <main>.
WARNING:Xst:2677 - Node <p0_14> of sequential type is unconnected in block <main>.
WARNING:Xst:2677 - Node <p0_15> of sequential type is unconnected in block <main>.
WARNING:Xst:2677 - Node <p0_16> of sequential type is unconnected in block <main>.
WARNING:Xst:2677 - Node <p0_17> of sequential type is unconnected in block <main>.
WARNING:Xst:2677 - Node <p0_18> of sequential type is unconnected in block <main>.
WARNING:Xst:2677 - Node <p0_19> of sequential type is unconnected in block <main>.
WARNING:Xst:2677 - Node <p0_20> of sequential type is unconnected in block <main>.
WARNING:Xst:2677 - Node <p0_21> of sequential type is unconnected in block <main>.
WARNING:Xst:2677 - Node <p0_22> of sequential type is unconnected in block <main>.
WARNING:Xst:2677 - Node <p0_23> of sequential type is unconnected in block <main>.
WARNING:Xst:2677 - Node <p0_24> of sequential type is unconnected in block <main>.
WARNING:Xst:2677 - Node <p0_25> of sequential type is unconnected in block <main>.
WARNING:Xst:2677 - Node <p0_26> of sequential type is unconnected in block <main>.
WARNING:Xst:2677 - Node <p0_27> of sequential type is unconnected in block <main>.
WARNING:Xst:2677 - Node <p0_28> of sequential type is unconnected in block <main>.
WARNING:Xst:2677 - Node <p0_29> of sequential type is unconnected in block <main>.
WARNING:Xst:2677 - Node <p0_30> of sequential type is unconnected in block <main>.
WARNING:Xst:2677 - Node <p0_31> of sequential type is unconnected in block <main>.

Bu uyarı neden verdiğini bilen bir arkadaş açıklayabilir mi?
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use ieee.numeric_std.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
entity main is
port(
		i0:in std_logic;
		eq1,eq2,eq3:out std_logic
		);
end main;
architecture Behavioral of main is
signal led:std_logic;
begin
process(i0)
variable p0:integer:=0;
begin
if i0='1' then
p0:=p0+1;
if p0=1 then
led<='1';
eq1<=led;
end if;
if p0=2 then
led<='1';
eq2<=led;
end if;
if p0=3 then
led<='1';
eq3<=led;
end if;
end if;
end process;
end Behavioral;

muuzoo

library ieee ;
use ieee.std_logic_1164.all ;
use ieee.numeric_std.all ;


Ya da

library ieee ;
use ieee.std_logic_1164.all ;
use ieee.std_logic_arith.all ;
use ieee.std_logic_unsigned.all ;


"numeric_std" ile "std_logic_arith" kütüphanelerini aynı anda kullanmayın.

http://www.synthworks.com/papers/vhdl_math_tricks_mapld_2003.pdf
gunluk.muuzoo.gen.tr - Kişisel karalamalarım...

yamak

Dediğiniz gibi yaptım ama sorun yine devam ediyo

muuzoo

#3
Öncelikle kodlarınızı daha okunaklı yazarsanız herkes için daha kolay olur.

library IEEE;
	use IEEE.STD_LOGIC_1164.ALL;
	use ieee.numeric_std.all;
entity main is
	port(
        i0:in std_logic;
        eq1,eq2,eq3:out std_logic
        );
end main;

architecture Behavioral of main is
	signal led:std_logic;
begin
	process(i0)
		variable p0:integer:=0;
	begin
		if i0='1' then
			p0:=p0+1;
			if p0=1 then
				led<='1';
				eq1<=led;
			end if;
			if p0=2 then
				led<='1';
				eq2<=led;
			end if;
			if p0=3 then
				led<='1';
				eq3<=led;
			end if;
		end if;
	end process;
end Behavioral;


İkinci olarak. Hata mesajından anladığım kadarıyla Xilinx firmasına ait bir fpga kullanıyorsunuz. Hangi sürümü kullandığınızı bilmiyorum fakat ISE 12.4 ile verdiğim kodu derlediğimde sorunsuz bir şekilde derleniyor. Muhtemeln proje ayarlarınızda bir sıkıntı var. Project menüsünden cleanup project diyerek projenizi temizleyip tekrar derleyin. Ben Virtex5 ve Spartan3 serisi iki fpga içinde derledim.

Yazdığınız koda gelince. i0 dediğiniz giriş bir "clock" girişi mi? eğer öyle ise process yapınız şöyle olmalı:

process(i0)
 variable p0: integer range 0 to 3 := 0;
begin
	if(rising_edge(i0)) then
		p0:=p0 + 1;
		if p0=1 then
			led<='1';
			eq1<=led;
		end if;
		if p0=2 then
			led<='1';
			eq2<=led;
		end if;
		if p0=3 then
			led<='1';
			eq3<=led;
		end if;
	end if;
end process;


Ayrıca dolambaçlı yoldan değil doğrudan "eq1<='1'" şeklinde de atama yapabilirsiniz. Signal kullanmanıza gerek yok. Şu halinin de derlenmesi lazım

library IEEE;
	use IEEE.STD_LOGIC_1164.ALL;
	use ieee.numeric_std.all;
entity main is
	port(
        i0:in std_logic;
        eq1,eq2,eq3:out std_logic
        );
end main;

architecture Behavioral of main is
	signal led:std_logic;
begin
	process(i0)
 variable p0: integer range 0 to 3 := 0;
begin
	if(rising_edge(i0)) then
		p0:=p0 + 1;
		if p0=1 then
			eq1<='1';
		end if;
		if p0=2 then
			eq2<='1';
		end if;
		if p0=3 then
			eq3<='1';
		end if;
	end if;
end process;
end Behavioral;


gunluk.muuzoo.gen.tr - Kişisel karalamalarım...

scaemteitn

Zannımca xilinx burada p0 ın reset olma durumunu istiyor. bence birde reset girişi tanımla, eğer reset=0 sa kodlar çalışsın. 1 olursa p0 ve diğer gereken tanımlamalar sıfırlansın. Ben sıfırlamadağım zaman yok değişken yapışık kalır. Ondan böyle kullanamazsınız falan diye hata veriyo. Sanane arkadaş kalırsa kalsın diyom bu sefer sentezlemede hata veriyor. :) Bu fpga çok baş ağrıtıyo ama baya zevkli.

   Ayrıyetten yazdığınız,

if i0='1' then
p0:=p0+1;
if p0=1 then
led<='1';
eq1<=led;
end if;
if p0=2 then
led<='1';
eq2<=led;
end if;
if p0=3 then
led<='1';
eq3<=led;
end if;

kodlarında i0=1 olduğunda p0'ın 1,2 veya 3 olduğunu göremezsiniz. Sistem otomatikman çok hızlı sayacağı için belki de p0=20000 de olacak. Bu geçişleri engellemek için butona basıldıktan sonra veya p0 ı bir arttırdıktan sonra bir değişken ekleyip değerini 1 yapın. Buton ne zaman  bırakılırsa bu değişkeni 0 layın. p0 ı artırma koşoluna ekstra bu değişkenin 0 olma şartınıda ekleyin. Böyle p0 ın değeri bir bir artar.

Ve yine ekstra olarak sanki clock palsi eklemenizde gerekiyormuş gibi me geldi. Tüm sistemi clock palsi bloğunun içine alın.

if reset=0 then
  if (rising_edge(clock)) then
    --işelenecek kodlar
  end if;
else
   değişkenler :=0;
   signaller <=0;
end if;

şeklinde bloka alırsanız daha sağlıklı çalışmasını ümid ediyorum. İyi çalışmalar.


yamak

Ama kullandığım process de duyarlılık listesi belirttiğim için i0 ı değiştiği an çalışmayacak mı o kodlar yoksa ben yanlış mı anladım? Ben daha yeni başladım da tam olarak bilmiyorum detayları

pic365

i0'ın clock olarak algılanması için muuzoo'nun en son eklediği koddaki değişikliğin yapılması şart. Alınan hatanın sebebi o kısım zaten, çünkü clock olmadığı için p0 latch olarak sentezleniyor.

Clocksuz process'lerde bir sinyali tekrar kendine atarsanız latch olur. örneğin: p0 <= p0 + '1';
Clocksuz process'lerde if'lerin else kısmını yazmazsanız yine latch olur. Clock'lu process'lerde ise else kısmını yazmasanız da olur. Sinyal değerini koruyacak şekilde bağlanır.

Nedir bu latch derseniz, herhangi mantıksal bir birimin output'unun register'lanmadan tekrar input'a beslendiği devrelerdir. Burada sonsuz döngü olur ve sentez programı timing analizi yapamaz. Zaten adı üstünde register transfer level (RTL), register olmadan olmaz. :)

Diğer yandan muuzoo'nun kütüphanelerle ilgili sözü de kesinlikle doğru. Bazı kütüphaneler arasında tercih yapmanız gerekiyor.

pic365

Alıntı yapılan: scaemteitn - 27 Eylül 2011, 22:52:43
Zannımca xilinx burada p0 ın reset olma durumunu istiyor. bence birde reset girişi tanımla, eğer reset=0 sa kodlar çalışsın. 1 olursa p0 ve diğer gereken tanımlamalar sıfırlansın. Ben sıfırlamadağım zaman yok değişken yapışık kalır. Ondan böyle kullanamazsınız falan diye hata veriyo. Sanane arkadaş kalırsa kalsın diyom bu sefer sentezlemede hata veriyor. :) Bu fpga çok baş ağrıtıyo ama baya zevkli.

   Ayrıyetten yazdığınız,

if i0='1' then
p0:=p0+1;
if p0=1 then
led<='1';
eq1<=led;
end if;
if p0=2 then
led<='1';
eq2<=led;
end if;
if p0=3 then
led<='1';
eq3<=led;
end if;

kodlarında i0=1 olduğunda p0'ın 1,2 veya 3 olduğunu göremezsiniz. Sistem otomatikman çok hızlı sayacağı için belki de p0=20000 de olacak. Bu geçişleri engellemek için butona basıldıktan sonra veya p0 ı bir arttırdıktan sonra bir değişken ekleyip değerini 1 yapın. Buton ne zaman  bırakılırsa bu değişkeni 0 layın. p0 ı artırma koşoluna ekstra bu değişkenin 0 olma şartınıda ekleyin. Böyle p0 ın değeri bir bir artar.

Ve yine ekstra olarak sanki clock palsi eklemenizde gerekiyormuş gibi me geldi. Tüm sistemi clock palsi bloğunun içine alın.

if reset=0 then
  if (rising_edge(clock)) then
    --işelenecek kodlar
  end if;
else
   değişkenler :=0;
   signaller <=0;
end if;

şeklinde bloka alırsanız daha sağlıklı çalışmasını ümid ediyorum. İyi çalışmalar.

FPGA'e güç verildiğinde yeniden konfigürasyon yapıldığından register ve ram'leri reset kullanmadan istediğiniz değerden başlatabilirsiniz. Hatta başlangıç değeri önemli değilse hiçbir şey yapmayıp rastgele bir değerden başlamasını da göze alabilirsiniz ama simülatörde X görmek pek hoş olmaz. :) Yine de en iyisi reset kullanmak tabii. Bir de yukarıda örneğini verdiğiniz reset asenkron ama Xilinx senkron reseti tavsiye ediyor.

yamak

Benim aklıma takılan kısım şurası:
process blogu sadece duyarlılıl listesindekilerde değişim olduğunda bir kere çalışıp bir daha herhangi bir değişiklik olmasını mı bekliyo yoksa sonsuz bir for döngüsü gibi mi çalışıyo.Bana bu kısmı açıklayabilir misiniz?

pic365

Alıntı yapılan: yamak - 28 Eylül 2011, 21:58:24
Benim aklıma takılan kısım şurası:
process blogu sadece duyarlılıl listesindekilerde değişim olduğunda bir kere çalışıp bir daha herhangi bir değişiklik olmasını mı bekliyo yoksa sonsuz bir for döngüsü gibi mi çalışıyo.Bana bu kısmı açıklayabilir misiniz?

O liste daha çok simülatörleri hedef alan bir şey. Simülatör dediğiniz gibi sadece o listedeki sinyallerde bir değişim olunca process'in içine girer ve bütün işlemleri gerçekleştirdikten sonra durur. Fakat sentezlenen devrede öyle bir şey olmaz tabii ki. Örneğin bir AND kapısının girişlerini listeye eklemesek bile girişler değiştiğinde çıkışlar da değişir. Eğer devrenin sonunda register varsa (yani process clock'lu ise) çıkış sadece clock'un yükselen veya düşen kenarında değişir.

yamak

#10
Mesela ben her butona basışımda bir sonraki led i yakacak bir program yazmaya çalıştım ve programı fpga ya yüklediğimde tüm ledler yanmış oluyo ve butona basmam hiçbir şeyi değiştirmiyo. bunun nedeni process in clock lu olmamasından mı kaynaklanıyo?Program aşağıdadır:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

entity ikinci_deneme is
port(
		i0:in std_logic;
		eq1,eq2,eq3,eq4:out std_logic
		);
end ikinci_deneme;
architecture Behavioral of ikinci_deneme is
signal FF:std_logic;
begin
process(i0)
 variable p0: integer range 0 to 3 := 0;
begin
    if(i0='1') then
	 	p0:=p0 + 1;
        if p0=1 then
            eq1<='1';
	end if;
        if p0=2 then
            eq2<='1';
	end if;
        if p0=3 then
            eq3<='1';
        end if;
	if p0=3 then
	p0:=0;
	end if;
    end if;
end process;
end Behavioral;


Aslında clock olmadan da process in sürekli olarak çalışması da mantıklı gelmiyo bana zaten.