CPLD/FPGA Öğrenmek

Başlatan baran123, 07 Ekim 2017, 19:03:31

baran123

Şu sıralar yoğun olarak ST'nin çiplerini kullanıyorum fakat bir yandan da yeni bir mimari, yeni bir sistem öğrenmek istiyorum.
CPLD ve FPGA başlamak için her türlü önerinize açığım. Bununla birlikte aklımda bir kaç soru var.

1) CPLD/FPGA ikilisinde hangisi ile başlamak gerekir ?
2) C kodu yazar gibi programlamak mümkün mü ?
3) Hazır bir geliştirme kartı yerine küçük bir kart tasarlamak ne kadar mantıklı olur ?
4) Başlangıç için ne kadar kapsamlı bir donanıma ihtiyaç vardır ?

İlk aklıma gelen küçük bir CPLD, SRAM, ROM gibi temel şeyleri barındıran küçük bir kart tasarlamak.

Cemre.

Daha alışabileceğni veya zevk alarak kullanacağını/programlayacagini bile görmeden o donanım için kart tasarlamak bence hiç mantıklı bir yaklaşım değil. Aksine vakit ve nakit kaybı diye düşünüyorum.

CPLD ile ilgili bu sıralar benim de bir hevesim var. Konuyu takipteyim...

MC_Skywalker

#2
1) FPGA ile başlayın. CPLD için FPGA'nın küçüğü diye biliriz.
2) Donanım tanımlama dilleri C kod yapısına benzer
3) Hazır kart kullanmak daha verimli. şu arkadaş ile çalışıyorum  http://store.digilentinc.com/basys-3-artix-7-fpga-trainer-board-recommended-for-introductory-users/
4) Yukarıdaki kit içinde porogramlayıcısıda mevcut

şu sıralar CPLD ile saat için uğraşıyorum



Bunlarda benim ilk denemeleri. VHDL donanım tanımlama diliyle yapıldım.
author=MC_Skywalker link=topic=34258.msg483199#msg483199 date=1449762152
-----------------------------------------------------------------------------------------

16bit yukarı/aşağı sayıcı
https://www.youtube.com/watch?v=EQbJrg95WK4

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

entity onalti is
    Port ( clk100 : in STD_LOGIC;
           anh : in STD_LOGIC;
           led015 : out STD_LOGIC_VECTOR (15 downto 0));
end onalti;

architecture Behavioral of onalti is
            signal prescaller : integer range 0 to 800000:=0;
            signal sonuc : integer range 0 to 65535:=0;
begin
    led015<=STD_LOGIC_VECTOR(to_unsigned(sonuc,16));
        process(clk100)
            begin
            if(clk100'event and clk100='1') then
             if(prescaller<800000) then
                prescaller<=prescaller+1;
             else
                prescaller<=0;
            end if;      
           
            if(prescaller=0) then
            case anh is
                when '1' =>
                    if(sonuc<65535) then
                       sonuc<=sonuc+1;
                    else
                       sonuc<=0;
                    end if;
                when '0' =>
                    if(sonuc>0) then
                       sonuc<=Sonuc-1;
                    else
                       sonuc<=65535;
                    end if;
            end case;
            end if;
            end if;
        end process;                        
end Behavioral;

----------------------------------------------------------------------------------------

VHDL ile Karaşimşek Uygulamam
https://www.youtube.com/watch?v=rmpanx5cP8U
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity KaraSimsek is
    Port ( clk : in STD_LOGIC;
           led015 : out STD_LOGIC_VECTOR (15 downto 0));
end KaraSimsek;

architecture Behavioral of KaraSimsek is

    constant SYS_CLK_PERIOD : integer := 10; -- ns cinsinden
    constant NEW_CLK_PERIOD : integer := 100_000_000; -- ns cinsinden
    constant CLK_COUNT : integer := NEW_CLK_PERIOD / (2 * SYS_CLK_PERIOD);
         
    signal counter: std_logic_vector(3 downto 0):= "0000";
    signal gecici: std_logic_vector(3 downto 0);
    signal clk_new : std_logic := '0';
    signal count : integer range 0 to 99999999 := 0;
    signal r_led015 : STD_LOGIC_VECTOR (15 downto 0):= X"0001";
    signal fwd : std_logic := '1';

begin
     process(clk)
     begin
        if clk= '1' and clk'event then
            if count = CLK_COUNT - 1 then
                count <= 0;
                clk_new <= not clk_new;
            else
                count <= count + 1;
            end if;
        end if;
     end process;
     
     process(clk_new)
     begin
        if rising_edge(clk_new) then
            if (fwd = '1') then
                r_led015 <= r_led015(14 downto 0) & r_led015(15);
                    if (r_led015 = X"4000") then
                                fwd <= '0';
                    end if;
             else
              r_led015 <= '0' & r_led015(15 downto 1);
             if (r_led015 = X"02") then
                  fwd <= '1';
             end if;
            end if;
        end if;
     end process;
     led015 <= r_led015;
end Behavioral;


Bertan

Altera DE0-Nano kitini tavsiye ederim. Üzerinde başlangıç için yeterli çevre birimleri mevcut.  Geçen sene Çizgi Market'den indirim ile almıştım, belki bu sene de indirim olur.

muuzoo

#4
@MC_Skywalker Hocam kodunuzda gördüğüm bir sorunu düzeltmek isterim. Kodunuzda
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
use IEEE.numeric_std.ALL;


Satırları mevcut fakat genel kural olarak bu kütüphanlerin hepsini bir arada kullanmak sakıncalı. Ya bu şekilde :

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


Ya da bu şekilde kullanın ama ikisni aynı anda kullanmayın.
library ieee ;
use ieee.std_logic_1164.all ;
use ieee.std_logic_arith.all ; 
use ieee.std_logic_unsigned.all ;


Kaynak : http://www.synthworks.com/papers/vhdl_math_tricks_mapld_2003.pdf


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

MC_Skywalker

@muuzoo Bilgilendirici not için teşekürler.  Bilmediğim bir noktaydı.

sigmoid

Udemy üzerinde 25tl ye güzel kurslar var. Bu kursu satın aldım. Vakit bulup fazla izleyemedim. Ama izlediğim kadarıyla güzel. https://www.udemy.com/vhdl-and-fpga-development-for-beginners-and-intermediates/learn/v4/overview

MC_Skywalker


baran123

@Cemre. hocam haklısın fakat hiç bilmediğim için mini bir sistem düşünmüştüm.
@MC_Skywalker hocam açıklamalar için çok teşekkür ederim.
Alteranın hazır boardları çok pahalı gibi, en azından bir öğrenci için.
Benim düşündüğüm stm'nin 103 mini board tarzı bir şey olabildiğince temel birimlerin olması da yeterli.


@sigmoid hocam udemy aklıma gelmemişti bu iyi oldu.
Gerçi gördüğüm kadarıyla FPGA'ler artık MCU'lar kadar kaynak içermeye başlamış.


Sanırım şimdi uygun fiyatlı FPGA board arayabilirim. :)

MC_Skywalker

#9
şöyle bir ikili işinizi görür. Aliexpress üzerinden ~$40 - $50 mailyetle temin edilebilir. kart üzerin de İntel Cyclone IV FPGA var.


Bredboard için FPGA modülü  iki değişik version var. 15K ve 35K  Atrix 7 FPGA seçenekli.  üzerinde üretici firmanın programla arabirimi var.
http://store.digilentinc.com/cmod-a7-breadboardable-artix-7-fpga-module/

Bredboard için FPGA modülü  Spartan 6 FPGA var. üzerinde üretici firmanın programla ara birimi var.
http://store.digilentinc.com/cmod-s6-breadboardable-spartan-6-fpga-module/

Buda CPLD modülü. Ayrıca JTAG programlayıcı gerektiri
http://store.digilentinc.com/cmod-c2-breadboardable-coolrunner-ii-cpld-module/

94onur94

#10

baran123

Tekrardan selamlar,

Şu sıralar fırsat bulmuşken konuya tekrardan vakit ayırabildim.
Biraz araştırma yaptım CPLD için ama hala takıldığım ufak noktalar var.

1) Xilinx /Altera arasında gidip geliyorum burada tavsiyeniz ne olur ?
2) CPLD/FPGA arasında kararsın kaldım. Sanki FPGA ile başlarsam bir şeyler kaçırmış olurum gibi geliyor.
3) Malum dolar kuru bir öğrenci için bu paralar çok fazla özellikle FPGA boardları. Donanım kısmında temel bir breakout board önerisi istiyorum. @MC_Skywalker hocam bir kaç öneride bulunmuştu fakat bu kitlerde pahalı.

CPLD için şu ürünler işimi görür mü?

CPLD Board : https://tr.aliexpress.com/item/Free-Shipping-5V-MAX-II-EPM240-CPLD-Minimum-System-Core-Board-Development-Board/32572133174.html?spm=a2g0s.13010208.99999999.265.5b693c008ind6d

Programmer : https://tr.aliexpress.com/item/Besr-prices-Free-shiping-USB-Blaster-ALTERA-CPLD-FPGA-download-cable/710638185.html?spm=a2g0s.13010208.99999999.259.5b693c008ind6d


MC_Skywalker

CPLD sadece düşük yoğunluklu lojik ile uğraşacaksan işin çok iyi görü ama işim içine birazcıkta olsun ADC katayım dersen FPGA tarcih etmelisin. Olduya ARM vb işlemci istemiyorum deyip RISC V core içine ekleyip çalışmak için yine FPGA derim.

Benim başlangıç setim.

okg

Alıntı yapılan: MC_Skywalker - 03 Ekim 2018, 12:52:41CPLD sadece düşük yoğunluklu lojik ile uğraşacaksan işin çok iyi görü ama işim içine birazcıkta olsun ADC katayım dersen FPGA tarcih etmelisin. Olduya ARM vb işlemci istemiyorum deyip RISC V core içine ekleyip çalışmak için yine FPGA derim.

Benim başlangıç setim.
(Resim gizlendi görmek için tıklayın.)

microseminin fpga larına riscv gömüp kullanıyordum. beni sarmadı açıkçası.
KTU Elektronik Haberleşme - YTÜ Haberşelme YL - GTU Haberleşme YL

Emre_Tuncay_

Artık çoğu yerde SoC kullanılır oldu.Fpga ve ARM işlemciler tek pakette üretiliyor.Yoğun işlem gücünü fpga hallederken karar verme mekanizmasının MCU hallediyor.Bence bu sistemler üzerinede yoğunlaşılmalı.Örnek vermek gerekirse Zynq kullanılabilir. Xilinx'in geliştirme ortamı daha kullanıcı dostu geliyor bana. Tabi bu kartlar dolar ile beraber uçtu gitti.Bir zybo 1500tl olmuş. Bu arada FPGA geliştirme kartlarında akademik indirim kullanılabilir akademisyen tanıdığınız veya lisansüstü yapıyorsanız bu fırsatı değerlendirin.
Microblaze kısmınada bakmanızı öneririm FPGA ile denetleyici çalıştırıp üzerlerinde freertos çalıştırılabiliyor.