Picproje Elektronik Sitesi

DİJİTAL & ANALOG ELEKTRONİK => Pld, Spld, Pal, Gal, Cpld, Fpga => Konuyu başlatan: vitruvius - 24 Şubat 2012, 16:01:07

Başlık: VHDL'de Variable Nerede Tanımlanıyor? Fpga
Gönderen: vitruvius - 24 Şubat 2012, 16:01:07
Merhabalar, birkaç hafta ara verince bilgiler uçup gitmiş.  :(  Elimde Spartan 3E Starter Kit var. Yapmak istediğim şey şu: Bir i tam sayısı tanımlayayım. Butona her bastığımda i'nin değeri bir artsın. Ben bu i'ye bakarak butona kaç kere basılmışsa o sıradaki led'i yakayım. Switchlerde de ledleri ikili ikili yakmayı amaçlamıştım. Kodu kendimce yazdım ama bu i değişkenini tanımlama kısmında şu hatayı alıyorum:Line 54. parse error, unexpected VARIABLE

Yazdığım kod:



library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity ornek1 is
    Port ( but1 : in  STD_LOGIC;
           sw1 : in  STD_LOGIC;
           sw2 : in  STD_LOGIC;
           sw3 : in  STD_LOGIC;
           sw4 : in  STD_LOGIC;
           led1 : out  STD_LOGIC;
           led2 : out  STD_LOGIC;
           led3 : out  STD_LOGIC;
           led4 : out  STD_LOGIC;
           led5 : out  STD_LOGIC;
           led6 : out  STD_LOGIC;
           led7 : out  STD_LOGIC;
           led8 : out  STD_LOGIC);
end ornek1;

architecture Behavioral of ornek1 is

begin

variable say:integer range 0 to 8;

if but1='1' then
say:=say+1;
end if;

if say=1 then
led1<='1';
elsif say=2 then
led1<='0';
led2<='1';
elsif say=3 then
led2<='0';
led3<='1';
elsif say=4 then
led3<='0';
led4<='1';
elsif say=5 then
led4<='0';
led5<='1';
elsif say=6 then
led5<='0';
led6<='1';
elsif say=7 then
led6<='0';
led7<='1';
elsif say=8 then
led7<='0';
led8<='1';
else
say:=0;
led1<='0';
led2<='0';
led3<='0';
led4<='0';
led5<='0';
led6<='0';
led7<='0';
led8<='0';

end if;

if sw1='1' then
led1<='1';
led2<='1';
elsif sw2='1' then
led1<='0';
led2<='0';
led3<='1';
led4<='1';
elsif sw3='1' then
led3<='0';
led4<='0';
led5<='1';
led6<='1';
elsif sw4='1' then
led5<='0';
led6<='0';
led7<='1';
led8<='1';
else
led1<='0';
led2<='0';
led3<='0';
led4<='0';
led5<='0';
led6<='0';
led7<='0';
led8<='0';
end if;

end Behavioral;



Teşekkürler.
Başlık: Ynt: VHDL'de Variable Nerede Tanımlanıyor? Fpga
Gönderen: kralsam - 24 Şubat 2012, 20:27:57
Hocam variable yerine signal say std_logic_vector(3 downto 0):="0000";
kullanırsan sıkıntı yaşamazsın. İnteger sayılarla işlem yaparken taşmalar vs. sorun çıkarabiliyor.
Başlık: Ynt: VHDL'de Variable Nerede Tanımlanıyor? Fpga
Gönderen: vitruvius - 24 Şubat 2012, 20:37:19
Hocam bu sefer de Line 54. parse error, unexpected SIGNAL hatası alıyorum. Aslında çok basit bir hatam vardır muhtemelen ama ben çok acemi olduğumdan göremiyorum.
Başlık: Ynt: VHDL'de Variable Nerede Tanımlanıyor? Fpga
Gönderen: berat23 - 24 Şubat 2012, 21:17:46
bu yazdığın kod,doğru çalışsa bile fpga mantığına ters.öncelkle normal sequential C de kod yazar gibi algoritma kurma.burada donanım tasarımı yapar gibi düşüneceksin.

bu yazdığın algoritmayı bir state machine ile gerçekleyebilirsin.butona her basışında bir sonraki state'e geçecek bir moore fsm tasarlayacaksın.switch içinde aynı mantığı kullanacaksın.birde bu kadar uzun kodlar yerine paralel prosesler yapmak daha doğru. bu arada kodu detaylı incelemedim ama bir mantık hatası var gibi çünkü hem buton hem de switch,aynı ledleri kontrol ediyor.


bu da buton için yazdığım örnek fsm

library ieee;
use ieee.std_logic_1164.all;

entity fsm is

port(
clk : in std_logic;
buton : in std_logic;
reset : in std_logic;
led : out std_logic_vector(4 downto 0)
);

end entity;

architecture rtl of fsm is

type state_type is (s0, s1, s2, s3);
signal state   : state_type;

begin

process (clk, reset)
begin
if reset = '1' then
state <= s0;
elsif (rising_edge(clk)) then
case state is
when s0=>
if buton = '1' then
state <= s1;
else
state <= s0;
end if;
when s1=>
if buton = '1' then
state <= s2;
else
state <= s1;
end if;
when s2=>
if buton = '1' then
state <= s3;
else
state <= s2;
end if;
when s3 =>
if buton = '1' then
state <= s0;
else
state <= s3;
end if;
end case;
end if;
end process;

process (state)
begin
case state is
when s0 =>
led <= "0001";
when s1 =>
led <= "0010";
when s2 =>
led <= "0100";
when s3 =>
led <= "1000";
end case;
end process;

end rtl;
Başlık: Ynt: VHDL'de Variable Nerede Tanımlanıyor? Fpga
Gönderen: kralsam - 24 Şubat 2012, 21:44:32
Hocam ben o hatayı yeni fark ettim. Kodda sadece o kısma bakmıştım. Arkadaşın dediği gibi işlemleri paralel processlere bölmelisin. Signal tanımladıktan sonra karşılaştığın hata çözümüde eşitliği atamayı ":=" şeklinde değilde "<=" şeklinde yapmalısın. Tahminimce hata budur...

Ama tasarımı berat23 hocamın bahsettiği şekilde yapmalısın..
Başlık: Ynt: VHDL'de Variable Nerede Tanımlanıyor? Fpga
Gönderen: vitruvius - 24 Şubat 2012, 22:36:06
Hocam daha yeni başladığım için donanım tasarlar gibi düşünemiyorum malesef, aklım hep C'ye gidiyor. Yani eğitimini almadım, internetten araştırdığım ve okuduğm e-booklar kadar bilgim var. Nasıl bir bakışla yaklaşmam gerekir kod yazmaya?

Hem switch hem butonla led kontrolünde mantık hatası var farkındayım ama deneme yaptığım için öyle yazdım kodu.

Birde yazdığınız kodun ufak bir izahını yapabilir misiniz acaba? Bu state machine ve more fsm terimlerini de bilemedim =/

Mesela;

elsif (rising_edge(clk)) then
            case state is
                when s0=>
                    if buton = '1' then
                        state <= s1;
                    else
                        state <= s0;
                    end if;


ve

process (state)
    begin
        case state is
            when s0 =>
                led <= "0001";


kısmı. Teşekkürler.
Başlık: Ynt: VHDL'de Variable Nerede Tanımlanıyor? Fpga
Gönderen: berat23 - 24 Şubat 2012, 22:50:52
fpga ile birşeyler yapabilmek için önşart,iyi logic bilgisi ve matematik bilgisi.bunlar olmadan anlatımlar havada kalır.C veya mcu gibi kolay metodu yok malesef.

fsm için burada kabaca anlatımlar var.ben öğrenirken biryere takılınca genelde sözlüklere bakıyorum zira insan alatımı kitap cümlelerinden daha açık oluyor.
http://tr.wikipedia.org/wiki/Sonlu_durum_makinas%C4%B1
http://www.eksisozluk.com/show.asp?t=finite+state+machine


kabaca anlatmam gerekirse,senin değişken diye bahsettiğin şey,burada o anki içinde olduğumuz statedir,yani kabaca hafızamız diyelim.butondan giriş geldikçe durumumuzu yani değişkenimizi değiştiriyoruz.görüldüğü üzere 4 durum var.diğer process ise çıkış kısmı.burada da içinde olduğumuz duruma göre çıkış belirleniyor.yani ;
1.state-> 1.led
2.state-> 2.led
3.state-> 3.led
4.state-> 4.led
şeklinde.moore fsm ise çıkışın girişlere bağlı olmaması.yani her durumda çıkış sadece o anki duruma bağlı,girişe değil.

hiç logic bilmediğini varsayarak ancak bu kadar sade anlatabildim.yazdığım kodda ufak bir hata var,ledin 4 bit olması lazım.ben bu kodları hazır template kullanarak yaptım,sadece gereken kısımları düzenledim.quartusta var,mutlaka ise de de vardır.
Başlık: Ynt: VHDL'de Variable Nerede Tanımlanıyor? Fpga
Gönderen: kralsam - 25 Şubat 2012, 13:55:08
Arkadaşım birde yaygın olarak FPGA içine işlemci gömüp onun üzerine C ile program yazıp kullanıyorlar. Ben hiç kullanmadım. FPGA mantıpına ters geliyor ama çok kişi kullanıyor. Belki onun ile de çalışabilirsin. Aklında bulunsun. Örneğin Altera da Nios işlemci kullanılıyor. Xilinx in yaptığını hatırlayamadım.
Başlık: Ynt: VHDL'de Variable Nerede Tanımlanıyor? Fpga
Gönderen: vitruvius - 25 Şubat 2012, 14:03:04
Hocam o işe belki sonra girerim. Şu an temeli sağlam tutmak istiyorum. Berat23'ün verdiği kodun mantığını anladım ama bu elsif (rising_edge(clk)) then satırı ne işlem yapıyor? Bir de when komutu nasıl kullanılıyor onu anlayamadım.
Başlık: Ynt: VHDL'de Variable Nerede Tanımlanıyor? Fpga
Gönderen: kralsam - 25 Şubat 2012, 14:13:20
rising_edge yükselen kenarda tetiklendiği anlamına geliyor. when ise if else gibi koşul bloğu ama kombinasyonel. Eğer temelden devam edeceksen Morris Mono diye bir adamındı sanırım. Türkçe'ye çevrilmişide vardı sanırm, Sayısal tasarım diye. Ona bakmanı öneririm. Herşeyden önce lojik bilgin çok iyi olmalı.
Başlık: Ynt: VHDL'de Variable Nerede Tanımlanıyor? Fpga
Gönderen: berat23 - 25 Şubat 2012, 14:19:00
Alıntı yapılan: vitruvius - 25 Şubat 2012, 14:03:04
Hocam o işe belki sonra girerim. Şu an temeli sağlam tutmak istiyorum. Berat23'ün verdiği kodun mantığını anladım ama bu elsif (rising_edge(clk)) then satırı ne işlem yapıyor? Bir de when komutu nasıl kullanılıyor onu anlayamadım.

when, bir nevi mux denilebilir.C deki karşılığı case gibi.
Başlık: Ynt: VHDL'de Variable Nerede Tanımlanıyor? Fpga
Gönderen: vitruvius - 26 Şubat 2012, 16:54:07
Hocam verdiğiniz örnek kodu bir kere okudum, mantığını anladım. Anladığım kadarıyla tekrar yazdım kodumu. Sonra sizinkiyle de karşılaştırdım son process hariç bir fark göremedim.

Program istediğim gibi çalışmıyor. Ledler sırayla yanmıyor. Resete bastığımda en başa dönüyor ama sonra yine kafasına göre devam ediyor. Bir de butona her bastığımda elimi çekene kadar 4 led kısık bir şekilde yanıyor. Sorun nerede acaba? İsterseniz video koyabilirim. Teşekkürler.

Vhdl kodum:


library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;

entity butonveswitch is
    Port ( buton : in  STD_LOGIC;
           reset : in  STD_LOGIC;
           led1 : out  STD_LOGIC;
  led2 : out  STD_LOGIC;
  led3 : out  STD_LOGIC;
  led4 : out  STD_LOGIC;
           clk : in  STD_LOGIC);
end butonveswitch;

architecture Behavioral of butonveswitch is

type state_type is (s0,s1,s2,s3);
signal state : state_type;

begin

process(clk,reset)
begin
if reset='1' then
state <= s0;
elsif (rising_edge(clk)) then
case state is
when s0 =>
if buton='1' then
state <= s1;
else
state <= s0;
end if;
when s1 =>
if buton='1' then
state <= s2;
else
state <= s1;
end if;
when s2 =>
if buton='1' then
state <= s3;
else
state <= s2;
end if;
when s3 =>
if buton='1' then
state <= s0;
else
state <= s3;
end if;
end case;
end if;
end process;

process (state)
begin
case state is
when s0 =>
led1<='1';
led2<='0';
led3<='0';
led4<='0';
when s1 =>
led1<='0';
led2<='1';
led3<='0';
led4<='0';
when s2 =>
led1<='0';
led2<='0';
led3<='1';
led4<='0';
when s3 =>
led1<='0';
led2<='0';
led3<='0';
led4<='1';
end case;
end process;

end Behavioral;



Bu da .ucf:


# PlanAhead Generated physical constraints

NET "buton" LOC = D18;
NET "clk" LOC = C9;
NET "led1" LOC = F9;
NET "led2" LOC = E9;
NET "led3" LOC = D11;
NET "led4" LOC = C11;
NET "reset" LOC = H13;

# PlanAhead Generated IO constraints

NET "buton" IOSTANDARD = LVTTL;
NET "clk" IOSTANDARD = LVCMOS33;
NET "led1" IOSTANDARD = LVTTL;
NET "led2" IOSTANDARD = LVTTL;
NET "led3" IOSTANDARD = LVTTL;
NET "led4" IOSTANDARD = LVTTL;
NET "reset" IOSTANDARD = LVTTL;
NET "buton" PULLDOWN;
NET "reset" PULLDOWN;
NET "clk"  period = 20 ns high 50 %;


Hocam bir de bir şey soracağım:

led <= "0100"; Bu satır ne demek oluyor? Yani led vektörünü 4 downto 0 tanımladınız. 3. led'in "1", diğerlerinin "0" olması durumunu mu belirtiyor? Yani benim şu satırlarımla aynı şey mi oluyor?


led1<='0';
led2<='0';
led3<='1';
led4<='0';


Teşekkür ederim.
Başlık: Ynt: VHDL'de Variable Nerede Tanımlanıyor? Fpga
Gönderen: yamak - 27 Şubat 2012, 08:44:32
Kodlarınız doğru sorun yaratan şey butonları debounce yapılmamış olması.Yani siz butona bir kere basıyosunuz fakat tasarladığınız devre onu 1 den fazla basılmış olarak algılıyo. Siz butona bastığınız aşağıdaki gibi bir sinyal oluşuyo yani.
(http://img811.imageshack.us/img811/9708/debounce.png)

Bu durumu önlemek için de ayrica bir debouncing devresi tasarlamanız gerekiyo. Bir de yapmaya çalıştığınız şeyi isterseniz
led<=led(2 downto 0)&'1' tarzı bi kod ile daha basit bir şekilde yapabilrsiniz.
Başlık: Ynt: VHDL'de Variable Nerede Tanımlanıyor? Fpga
Gönderen: vitruvius - 27 Şubat 2012, 11:04:54
Ah doğru hocam sizin bir başlığınızda okumuştum. Teşekkür ederim ona göre bir debounce devresi tasarlarım akşam.
Başlık: Ynt: VHDL'de Variable Nerede Tanımlanıyor? Fpga
Gönderen: pic365 - 27 Şubat 2012, 13:14:56
Konu açıklığa kavuşmuş ama ben de variable ile ilgili birkaç ekleme yapayım. Process içinde variable tanımlandığı zaman sadece o process içinde kullanılabiliyor. Eğer birden fazla process'te kullanacaksanız, tanım process'in dışında (signal'ların tanımlandığı yerde) shared variable şeklinde yapılıyor. Diğer yandan RTL'de variable kullanmak benim pek tercih ettiğim bir şey değil, sadece testbench'te kullanıyorum. Çünkü yazımı kolaylaştırsa da hata olasılığını artırıyor.
Başlık: Ynt: VHDL'de Variable Nerede Tanımlanıyor? Fpga
Gönderen: yamak - 27 Şubat 2012, 14:02:34
Alıntı yapılan: kakalive - 27 Şubat 2012, 13:14:56
Konu açıklığa kavuşmuş ama ben de variable ile ilgili birkaç ekleme yapayım. Process içinde variable tanımlandığı zaman sadece o process içinde kullanılabiliyor. Eğer birden fazla process'te kullanacaksanız, tanım process'in dışında (signal'ların tanımlandığı yerde) shared variable şeklinde yapılıyor. Diğer yandan RTL'de variable kullanmak benim pek tercih ettiğim bir şey değil, sadece testbench'te kullanıyorum. Çünkü yazımı kolaylaştırsa da hata olasılığını artırıyor.
Hocam neden tercih etmiyosunuz. Mesela gecikme yapmak için 5000000 a kadar saydırma yapılacak bu durumda variable kullanmak mantıklı değil mi?Signal kullansak bu boş yere gecikmeye sebep olamayacak mı?Yani amacacım sorgulamak değil yanlış anlamayın. Eğer yararlı birşeyse ben de bundan sonra o şekilde kullanayım
Başlık: Ynt: VHDL'de Variable Nerede Tanımlanıyor? Fpga
Gönderen: pic365 - 27 Şubat 2012, 18:29:27
Sayaç olarak kullanılan variable'lar fazla sorun çıkarmıyor ama sinyallerle birlikte kullanıldığında sıkıntı çıkarabiliyor. Örneğin bir çıkarma işleminin sonucu variable'a atanıyor olsun. Normalde biz sonucu negatif yapacak hiçbir input vermesek bile simülatör sıfır anında bazı sinyalleri sıfır olarak alıp variable'a negatif sayı atamaya çalışıyor, sonucunda hata veriyor. Bu durum integer olarak tanımlanan sinyallerde de geçerli.

Bir de ben yine bu forumda mı yazmıştım tam hatırlamıyorum ama Xilinx variable kullanılmasını tavsiye etmiyor. Xilinx'in tavsiyesine uymayan kodların sentezinde de performans düşebiliyor. Performans derken timing, area, power gibi şeyleri kastediyorum.
Başlık: Ynt: VHDL'de Variable Nerede Tanımlanıyor? Fpga
Gönderen: vitruvius - 05 Nisan 2012, 00:05:20
Bu en son oluşturduğum kodu değiştirip switch ile 8 led için uyarlamak istedim ama şu hatayı alıyorum: Syntax error near "signal". Neyi gözden kaçırıyorum acaba, eskiden bu hatayı almıyordum.

Kodum şu şekilde:

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

entity sw_state is
    Port ( sw : in  STD_LOGIC;
           clk : in  STD_LOGIC;
           rst : in  STD_LOGIC;
           led : out  STD_LOGIC_VECTOR (7 downto 0));
end sw_state;

architecture Behavioral of sw_state is

type state_type is (s0,s1,s2,s3,s4,s5,s6,s7,s8)
signal state : state_type;

begin

process (clk,rst)
begin
if (rst='1') then
state <= s0;
elsif (clk'event and clk='1') then
case state is
when s0 =>
if sw='1' then
state <= s1;
else
state <= s0;
end if;
when s1 =>
if sw='1' then
state <= s2;
else
state <= s1;
end if;
when s2 =>
if sw='1' then
state <= s3;
else
state <= s2;
end if;
when s3 =>
if sw='1' then
state <= s4;
else
state <= s3;
end if;
when s4 =>
if sw='1' then
state <= s5;
else
state <= s4;
end if;
when s5 =>
if sw='1' then
state <= s6;
else
state <= s5;
end if;
when s6 =>
if sw='1' then
state <= s7;
else
state <= s6;
end if;
when s7 =>
if sw='1' then
state <= s8;
else
state <= s7;
end if;
when s8 =>
if sw='1' then
state <= s0;
else
state <= s8;
end if;
end case;
end if;
end process;

process (state)
begin
case state is
when s0 =>led<="00000000";
when s1 =>led<="10000000";
when s2 =>led<="01000000";
when s3 =>led<="00100000";
when s4 =>led<="00010000";
when s5 =>led<="00001000";
when s6 =>led<="00000100";
when s7 =>led<="00000010";
when s8 =>led<="00000001";
end case;
end process;



end Behavioral;



Teşekkürler.
Başlık: Ynt: VHDL'de Variable Nerede Tanımlanıyor? Fpga
Gönderen: yamak - 05 Nisan 2012, 00:44:22
type state_type is (s0,s1,s2,s3,s4,s5,s6,s7,s8)
Bu satırın sonuna ; koymayı unuttunuz.
Başlık: Ynt: VHDL'de Variable Nerede Tanımlanıyor? Fpga
Gönderen: vitruvius - 05 Nisan 2012, 02:08:45
 :-[ Hocam peki sizin başlığınızda verilen örnek debounce uygulamasını kullandınız mı? Sadece o uygulamayı içeren bir proje yaptığımda çıkışta herhangi bir şey göremedim ben.

Alıntı yapılan: muuzoo - 01 Ekim 2011, 00:32:42
@kakalive önemli bir noktaya değinmiş. Tasarladığınız yapıda buton kullanıyorsanız "debounce" şartına da dikkat etmek gerekiyor.

NOT: "Debounce" ne diyenler için geliyor. Bir mikrodenetleyici ya da mikroişlemciye bağladığınız butona bakarak yazılımda bir koşul çalıştırdığınızı varsayın. Butona bastığınızda üreteceğiniz parazitler yüzünden programınız sapıtabilir. Çünkü size göre butona bir kez basılmıştır fakat oluşan "zıplamalar" yüzünden sisteminiz bunu birden fazla kez basılmış olarak algılayabilir. Bu ve bunun gibi durumları  engellemek için "debounce" denen önlem alınır. Butonun uçlarına paralel kapasitör bağlamak, yazılımda gecikme ya da v.b şekilde önlemler almak gibi.

Örnek bir istenmeyen durum :

(http://www.micahcarrick.com/files/atmega8/tutorial_3/debounce.png)

Örnek bir debounce uygulaması :

LIBRARY ieee;
USE ieee.STD_LOGIC_1164.all;
USE ieee.STD_LOGIC_UNSIGNED.all;

-- Title "Key debounce circuit";
-- Prepared by: D. N. Warren-Smith
-- Updated: 7 February 2001

ENTITY DEBOUNCE IS
PORT (
  Clk       : IN STD_LOGIC;
  Key       : IN STD_LOGIC;  -- active low input
  pulse     : OUT STD_LOGIC);
END DEBOUNCE;

ARCHITECTURE clean_pulse OF DEBOUNCE IS
  SIGNAL cnt       : STD_LOGIC_VECTOR (1 DOWNTO 0);
BEGIN
  PROCESS (Clk)
  BEGIN
    IF Key = '1' THEN
      cnt <= "00";
    ELSIF (clk'EVENT AND Clk = '1') THEN
      IF (cnt /= "11") THEN cnt <= cnt + 1; END IF;
    END IF;
    IF (cnt = "10") AND (Key = '0') THEN pulse <= '1'; ELSE pulse <= '0'; END IF;
  END PROCESS;
END clean_pulse;


Kaynak : http://users.senet.com.au/~dwsmith/vhdl.htm#Key (http://users.senet.com.au/~dwsmith/vhdl.htm#Key)

@teknikelektronikci FPGA ile ilgili bir yazı dizisi yayınlamak uzun zamandır aklımda. Fakat fırsat bulup da zaman ayırmak her zaman mümkün olmuyor. Bu yakınlarda muhtemelen bir başlangıç yapacağım bu iş için. Şu an yüksek lisans tezimle uğraşıyorum arada yazmaktan sıkıldığımda :) yazı dizisi üzerinde çalışırım.
Başlık: Ynt: VHDL'de Variable Nerede Tanımlanıyor? Fpga
Gönderen: yamak - 05 Nisan 2012, 02:25:43
Hayır, hiç kullanmadım o kodları
Başlık: Ynt: VHDL'de Variable Nerede Tanımlanıyor? Fpga
Gönderen: speak48 - 05 Nisan 2012, 10:23:57
bende hiç debounce devresi kullanmadım zaten fpga setlerinde buton switch girişlerinde alçak geçiren filitre var.
bi tavsiyede hdlde bulunayım bende ilk vhdl le başlamıştım ama sorun çıkarmasından başka hiç bir artısı olmadı için veriloğa  geçtim.
seninde yol yakınken veriloğa geçmeni taavsiye ederim.
veriloğun artıları; sentaxı yabancı değil c ye benziyor, daha pratik okuması anlaşılır, tamamen donanıma yönelik örn:2 tane değişkenin var kullanılan biri reg biri wire olay biter. yok integer yok std_logic yok signal .....
vhdl in artısının var  olduğunu idda eden varsa yazsın bizde öğrenelim.
Başlık: Ynt: VHDL'de Variable Nerede Tanımlanıyor? Fpga
Gönderen: vitruvius - 05 Nisan 2012, 10:58:27
Hocam filtre varsa da ya o yetersiz yada benim tasarımım yetersiz. Verilog'a başlasam da muhtemelen aynı sıkıntıyı yaşarım. Benim bu konuda hiçbir eğitimim olmadı. İnternetten, kitaplardan okuduklarımla bir şeyler yapmaya çalışıyorum ama o zaman da temeli sağlam tutmak zor oluyor. Soru sorarken çok utanıyorum bazen yani  :)  :-[ Çizgi tagem'in 10 gün sonra 3 günlük bir eğitimi var, ona katılacağım. Şüphesiz benim için faydalı olacaktır  :)

İlgilenenler için: http://www.cizgi-tagem.org/education/detail.aspx?id=27 (http://www.cizgi-tagem.org/education/detail.aspx?id=27)

Bu debounce için de şöyle bir algoritma düşündüm. Bir sayaç oluşturayım, yürüyen ışık mantığındaki gibi. Butona bastıktan 20ms sonra led yansın mantığıyla bir şeyler deneyeceğim. Bu gibi durumlarda say:=say+1'i         if(buton='1) then    satırının altında mı tanımlamak gerekir yoksa    elsif (clk'EVENT AND Clk = '1') then     satırının altında mı?
Başlık: Ynt: VHDL'de Variable Nerede Tanımlanıyor? Fpga
Gönderen: speak48 - 05 Nisan 2012, 16:02:32
Öğrenci & Öğretmen (DE0 FPGA Kiti + Eğitim): 230,00 TL KDV Dahil
Diğer (DE0 FPGA Kiti + Eğitim): 280,00 TL KDV Dahil
Öğrenci & Öğretmen (Sadece Eğitim): 50,00 TL KDV Dahil
Diğer (Sadece Eğitim): 100,00 TL KDV Dahil

sadece eğitim 50 lira fiyatı uygun olmasına rağmen içerik ve eğitmenler ne kadar dolgun nu bilemicem.anlatacak olanlarda senin benim gibi adamlar işin uzmanı değil.ama yardımcı olabilir.bizede böyle bir eğitim verilmedi , utanmaya gerek yok bizi konuları anlatmayan üniversiteler utanmalı  ama üniversite lojik temelini verdiyse her konuda olduğu gibi gerisi sana kalmış.

kodlamalar  en önemli kısım ilk başta yazılır veya şöyle ifade edersek veri akışında verinin ilk geçeceği durum en sona son geçeceği durum en başa yazılır ama hepsi clk sinyalinin altındadır çünkü fpga senkron tasarımları gerçeklemek için üretilmiştir aynı işlemin cloğu aynı olmak zorundadır.
Başlık: Ynt: VHDL'de Variable Nerede Tanımlanıyor? Fpga
Gönderen: pic365 - 10 Nisan 2012, 13:00:43
Alıntı yapılan: speak48 - 05 Nisan 2012, 16:02:32
bizede böyle bir eğitim verilmedi , utanmaya gerek yok bizi konuları anlatmayan üniversiteler utanmalı  ama üniversite lojik temelini verdiyse her konuda olduğu gibi gerisi sana kalmış.
Türkiye'de sayısal tasarım konusunda ders veren çok fazla hoca yok. İstanbul'da benim bildiğim Sabancı, Özyeğin, Yeditepe ve Boğaziçi Üniversitesi'nde var.
Başlık: Ynt: VHDL'de Variable Nerede Tanımlanıyor? Fpga
Gönderen: vitruvius - 23 Nisan 2012, 11:12:04
Arkadaşlar yapmak istediğim devreyi iki şekilde gerçekleştirdim. İlkinde led'i kaydırmak amaçlı yaptım. İkinci tasarımda ise bir değişkeni değiştirip onun değerine göre kontrol etmek istedim. İkisinin de kodunu veriyorum, kolay gelsin.

Kaydırma ile:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;

entity istek is
port(
buton: in std_logic;
ledg: out std_logic_vector(7 downto 0);
clk: in std_logic
);
end istek;

architecture arch of istek is
signal counter: std_logic_vector(23 downto 0);
signal ara: std_logic_vector(15 downto 0);
signal enable: std_logic;
signal ledgs: std_logic_vector(7 downto 0):=x"01";

begin

ledg<=ledgs;

process(clk)
begin
if (clk'event and clk='1') then
if(enable='1') then
counter<=counter+1;
elsif(buton='0') then
enable <='1';
end if;
if(counter=x"A00000") then
enable<='0';
counter<= (others=>'0');
if(buton='0') then
ledgs<=ledgs(0)&ledgs(7 downto 1);
end if;
end if;
end if;
end process;
end arch;


Değişken ile:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;

entity deneme is
port (
buton: in std_logic;
ledg: out std_logic_vector(7 downto 0);
clk: in std_logic
);
end deneme;

architecture arch of deneme is

signal counter: std_logic_vector(23 downto 0);
signal enable: std_logic;
signal ledgs: std_logic_vector(7 downto 0);
signal buton_s: std_logic;
signal say: integer range 0 to 8;

begin
ledg<=ledgs;

process(clk,buton) -- Debounce
begin
if(clk'event and clk='1') then
if(enable='1') then
counter<=counter+1;
buton_s<='0';
elsif(buton='0') then
enable<='1';
end if;
if(counter=x"A00000") then
enable<='0';
counter<=(others=>'0');
if(buton='0') then
buton_s<='1';
end if;
end if;
end if;
end process;

process(buton_s) -- Sayaç
begin
if(buton_s='1') then
say<=say+1;
if(say=8) then
say<=0;
end if;
end if;
end process;

process(say)
begin
case say is
when 0 => ledgs <= "00000000";
when 1 => ledgs <= "00000001";
when 2 => ledgs <= "00000010";
when 3 => ledgs <= "00000100";
when 4 => ledgs <= "00001000";
when 5 => ledgs <= "00010000";
when 6 => ledgs <= "00100000";
when 7 => ledgs <= "01000000";
when others => ledgs <= "10000000";
end case;
end process;


end arch;