VHDL'de akla takılan sorular

Başlatan demirkan1, 14 Ağustos 2011, 14:49:32

teknikelektronikci

Ey Türk istikbalinin evlâdı! İşte, bu ahval ve şerâit içinde dahi, vazifen; Türk İstiklâl ve Cumhuriyetini kurtarmaktır! Muhtaç olduğun kudret, damarlarındaki asil kanda mevcuttur!

muuzoo

Yalnız bu sıralı çalışmayı mikrodenetleyici ya da mikro işlemcilerdeki gibi düşünmeyin. O "process" içindeki işlemler sırayla fakat o saat darbesinde gerçekleştirilir. O yüzden bir process içinde yüklüce işlem yapmaya kalktığınızda tasarladığınız sistemin ulaşabileceği azami çalışma frekansı düşecektir.
gunluk.muuzoo.gen.tr - Kişisel karalamalarım...

salih18200


teknikelektronikci

hocam biraz daha acabilirmisiniz ? mesela procces icindekiler aslinda paralel calisiyor ama if end if case gibi islemlermi seri calisiyor ? benim kafam akrisdi biraz :)
Ey Türk istikbalinin evlâdı! İşte, bu ahval ve şerâit içinde dahi, vazifen; Türk İstiklâl ve Cumhuriyetini kurtarmaktır! Muhtaç olduğun kudret, damarlarındaki asil kanda mevcuttur!

muuzoo

Alıntı yapılan: teknikelektronikci - 16 Ağustos 2011, 12:02:32
hocam biraz daha acabilirmisiniz ? mesela procces icindekiler aslinda paralel calisiyor ama if end if case gibi islemlermi seri calisiyor ? benim kafam akrisdi biraz :)

Size basitçe sıralayayım:
Kural-1 : Process yapıları paralel çalışır. (Process yapılarının arasında bir neden-sonuç ilişkisi olmadığını varsayıyoruz)
Kural-2 : Process içi yapılar sıralı biçimde çalıştırılır fakat tüm işlemler o saat darbesinde gerçekleştirilir.

Kural-1 AÇıklaması : Aşağıda belirtilen ve clk saat darbesine göre çalışan 4 işlem tam olarak aynı anda çalışır.

islem1: process(clk)
	 variable sayac1 : integer range 0 to 10:=0;
	begin
	 if(rising_edge(clk)) then
	  sayac1 := sayac1 + 1;
	 end if;
	end process;

islem2: process(clk)
	 variable sayac2 : integer range 0 to 20:=0;
	begin
	 if(rising_edge(clk)) then
	  sayac2 := sayac2 + 2;
	 end if;
	end process;

islem3: process(clk)
	 variable sayac3 : integer range 0 to 30:=0;
	begin
	 if(rising_edge(clk)) then
	  sayac3 := sayac3 + 3;
	 end if;
	end process;

islem4: process(clk)
	 variable sayac4 : integer range 0 to 40:=0;
	begin
	 if(rising_edge(clk)) then
	  sayac4 := sayac4 + 4;
	 end if;
	end process; 


Kural-2 Açıklaması: Aşağıda belirtilen işlemde ise önce sayac1 in içeriği arttırılır sonra sayac2 sonra sayac3 sonra sayac4. Fakat tüm bu işlemler belirtilen o tek saat darbesinde gerçekleştirilir.  Diyelimki 100 Mhz clk kaynağınız olsun ve aşağıdaki kod bu hızda çalışssın. Daha sonra aynı kodun içine bir kaç işlem daha eklediğinizi varsayalım. Bu durumda bu tek process yapısının 100 MHz hızında çalışmama gibi bir sorunu olabilir. Çünkü eklediğiniz yeni işlemlerle birlikte tüm process içeriğinin tamamlanması için daha fazla süre gerekebilir.

islem : process(clk)
	 variable sayac1 : integer range 0 to 10:=0;
	 variable sayac2 : integer range 0 to 20:=0;
	 variable sayac3 : integer range 0 to 30:=0;
	 variable sayac4 : integer range 0 to 40:=0;
	begin
	 if(rising_edge(clk)) then
	  sayac1 := sayac1 + 1;
	  sayac2 := sayac1 + 2;
	  sayac3 := sayac1 + 3;
	  sayac4 := sayac1 + 4;
	 end if;
	end process


Bu durumda sizin aklınıza şu geliyor olabilir peki tüm işlemler sıralı olsa da tek saat darbesinde gerçekleşmiyor mu o halde neden paralel sayılmasın? Tasarımınıza göre bu durum önem kazanan bir durumdur. Karışık ve pek çok işlemin olduğu tasarımlarda sinyallerin değişimlerindeki gecikmeler bile sistemin beklendiği gibi çalışmamasına neden olabilir. Kaldı ki tüm işlemleri tek bir process içinde yapmak ta sistemin çalışabileceği azami çalışma frekansını da aşağı çekmektedir.

Eğer process içinde döngü oluşturmak ya da adım adım işlem yaptırmak istiyorsanız ya if/else yapısı kullanacaksınız ya da case yapısı ile çalışacaksınız. Örneğin aşağıdaki gibi

islemler: process(clk)
	   variable state : integer range 0 to 3:=0;
	  begin
	   if(rising_edge(clk)) then
	    case state is
		when 0 => islemler.....
			  state := state + 1;

		when 1 => islemler.....
			  state := state + 1;

		when 2 => islemler.....
			  state := state + 1;

		when 3 => islemler.....
			  state := 0;
	    end case;
	   end if;
	  end process;


Bu yapıda ilk clk darbesinde ilk islem yapılır, bir sonraki clk darbesinde bir sonraki, bu şekilde 3. işleme kadar gider ve oradan tekrar başa döner.
gunluk.muuzoo.gen.tr - Kişisel karalamalarım...

teknikelektronikci

hocam ellerin dert görmesin cok güzel ve aciklayici cok sagol
Ey Türk istikbalinin evlâdı! İşte, bu ahval ve şerâit içinde dahi, vazifen; Türk İstiklâl ve Cumhuriyetini kurtarmaktır! Muhtaç olduğun kudret, damarlarındaki asil kanda mevcuttur!

pic365

#21
RTL içinde variable kullanmak pek tercih edilen bir şey değil. Zaten Xilinx'in ilgili dökümanlarında bu kullanımın tavsiye edilmediği açık bir şekilde yazar. Yazdığınız kodun nasıl bir devre olarak sentezleneceğini bilirseniz seri veya paralel mi çalışıyor şeklinde bir ikilem yaşamazsınız.

process(clk)
begin
   if(rising_edge(clk)) then
      b <= a + '1';
      c <= b + '1';
   end if;
end process;


process(clk)
begin
   if(rising_edge(clk)) then
      b <= a + '1';
   end if;
end process;

process(clk)
begin
   if(rising_edge(clk)) then
      c <= b + '1';
   end if;
end process;


Yukarıdaki iki kod aynı devreyi sentezler. a sinyali 1 ile toplanıp sonuç b register'ına yazılıyor. Bu register'ın çıkışı tekrar 1 ile toplanıp c register'ına atanıyor. Olayı cycle bazlı incelersek daha açıklayıcı olur.

a sinyaline 3 cycle'da sırasıyla 5, 10, 15 sayılarının geldiğini varsayalım. Kodda reset koymadım ama reset değerlerinin sıfır olduğunu varsayın.

1. cycle: a=0, b=0, c=0 (reset cycle'ı)
2. cycle: a=5, b=1, c=1
3. cycle: a=10, b= 6, c=2
4. cycle: a=15, b=11, c=7
5. cycle: a=x, b=16, c=12
6. cycle: a=x, b=x, c=17

Özetlersek a'nın değerinin 1 fazlası 1 cycle sonra b'de, b'nin 1 fazlası da 1 cycle sonra c'de gözüküyor. Yani a'nın 2 fazlası 2 cycle sonra c'ye geliyor.