ICE40 Fpga için board tasarlama.

czorgormez

Temporary user
Katılım
27 Ekim 2022
Mesajlar
1,832
daha önce uğraşan olduysa fikir alışverişi yapabiliriz.

bir proje için Lattice ICE40UP5K-48QFN (5280 LUT 133 mhz) chip ile bir board tasarlıyorum. kısaca 8 bit paralel data,clock, valid ve packet sync dataları giriyor. gelen daha türü paralel DVB yaklaşık clock sinyalim 5 ile 10 mhz arası. yani maksimum 10 milyon byte/saniye veri geliyor. her veri paketinin başında bir paket identifier var paket sırası bilgisi var.

ben bu veri içerisinden belli idleri ayıklayıp paket parçalarını birleştirip tamamlandığında seri port üzerinden ilgili mcuya aktaracağım. aslında yaptığı iş şu. hareketli bir uydu anteninde bir transpondere bağlandığında o transponderdan gelen NIT isimli uydu ve kanal bilgisi verilerini decode edecek.

işin elektronik kısmına gelirsek:

- fpga 3 adet besleme voltajı istiyor 1.2, 2.5 ve 3.3 anladığım kadarıyla besleme voltajlarının sırası önemli. ilk olarak vcc Core beslemesi gelmedi ardından vcc pll ve diğerlerinin sırası önemsiz.

- 3 adet io bank var ve bunlardan spi ile ilişkili olanı 3.3 ile beslemeliyim fakar diğerleri 1.2 - 3.3 arası olabiliyor.

- 6 adet global clokc ve bir adet dahili PLL var. ben bu clokclardan birine 3.3 volt olarak 8 mhz bağlamayı düşündüm.

- bu fpga içinde internal flash var mı yok mu bir türlü net bilgiye ulaşamadım, bu yüzden karta bir tane harici flash ekliyorum.

bunu çözdüm ve neden tüm boardlarda mutlaka harici flash olduğu da ortaya çıktı :
"NVCM: The iCE40 devices contains an One Time Programmable on-chip Non Volatile Configuration Memory (NVCM) and if configured, the device boots from it. This is a fast and secure mode of bringing the device into user mode(active with user program) and used for mass production. The NVCM is ONE TIME PROGRAMMABLE. "

- kartı programlama bir mcu yüklemek gibi değil. harici veya dahili bir spi flash chip var bunu programlıyoruz. sonra duruma göre fpga
seçili olan flash ic üzerinden boot ediyor. yani herhangi bir spi flash programlayıcı ile kod atabiliriz.

- bu kartı tasarlarken iki adet açık kaynak projeyi baz alıyorum, icebreaker ve icesugar. genel olarak lattice firmasının dökümanlarına da baktım. tabi çok detay var ama büyük bir fark göremedim.


 
Son düzenleme:
paylaştığım kaynakları kullanrak boardu bitirdim. 3d modellerle vs. uğraşmadım açıkçası.

1736896000665.png
 
insanlık için küçük, benim için büyük bir adım.

kendi çizdiğim lattice ice40 ile ilk deneme. bu FPGA işi mikrocontrollerden epey farklı ama çok da zor değilmiş. tabi çok daha esnek bir konsept.

bu ufak kart yakında 50-60 mbit saniye paralel veri akan bir bus üzerinden gerekli bilgileri ayıklayan ve tekrar paketleyen bir ürüne dönüşecek.
şimdilik donanımı, sentezlemeyi ve programlamayı doğrulama amaçlı üzerindeki osllatörü bölerek ledlere aktaran basit bir sayıcı.

 
Dahili flash yokmuş içerisinde. Kristale bayıldım :D
 
İçsel osilatör var fakat mübarek +-%10 tolerans nedir :)
44MHz ile 52Mhz arası olabilir çok kötü. Mutlaka dış osilatör kullanırdım ben olsam :)
 
Yapay zeka şöyle kullan diyoe ama koddan emin değilim tabi ki, ama basit gibi de.

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

entity Ice40_Internal_Osc is
    Port (
        clk_out : out std_logic;  -- Bölünmüş clock çıkışı (örneğin LED için)
        rst     : in std_logic    -- Reset girişi
    );
end Ice40_Internal_Osc;

architecture Behavioral of Ice40_Internal_Osc is
    signal clk_int : std_logic;  -- Dahili 48 MHz clock sinyali
    signal counter : std_logic_vector(23 downto 0) := (others => '0'); -- Sayaç (bölücü)
    
    -- iCE40 Dahili Osilatör bileşeni
    component SB_HFOSC
        generic (
            CLKHF_DIV : string := "0b10"  -- 0b00: 48MHz, 0b01: 24MHz, 0b10: 12MHz, 0b11: 6MHz
        );
        port (
            CLKHFPU : in std_logic;  -- Osilatör etkinleştirme (1: Açık)
            CLKHFEN : in std_logic;  -- Clock enable (1: Açık)
            CLKHF   : out std_logic  -- Çıkış clock sinyali
        );
    end component;

begin
    -- Dahili Osilatör Bağlantısı
    osc_inst : SB_HFOSC
        generic map (
            CLKHF_DIV => "0b10"  -- 12 MHz olarak yapılandırıldı (daha yavaş bir clock)
        )
        port map (
            CLKHFPU => '1',  -- Osilatörü aç
            CLKHFEN => '1',  -- Enable sinyalini aktif yap
            CLKHF   => clk_int  -- Çıkış clock sinyali
        );

    -- Clock Bölme İşlemi (LED yanıp sönmesi için)
    process(clk_int, rst)
    begin
        if rst = '1' then
            counter <= (others => '0');
        elsif rising_edge(clk_int) then
            counter <= counter + 1;
        end if;
    end process;

    -- Bölünmüş clock çıkışı (LED yanıp sönmesi için)
    clk_out <= counter(23);  -- Bölme faktörü (yaklaşık 0.5 Hz yanıp sönme)

end Behavioral;
 
İçsel osilatör var fakat mübarek +-%10 tolerans nedir :)
44MHz ile 52Mhz arası olabilir çok kötü. Mutlaka dış osilatör kullanırdım ben olsam :)
bu chipi öyle çok özel işler için düşünmemişler daha çok glue logic. içinde 2 tane hard i2c ve 2 tane hard spi var. uart gibi zaman senkronu gerekmeyen işlerde yüksek frekanslı bir osilatör olsun flip floplar-state machineler işini yapabilsin demişler herhalde.
 
LUT sayısı az zaten, muhtemel genel geçer işler için yapmışlardır. Bu tarz FPGA'ler çok fazla var.
 
Yapay zeka şöyle kullan diyoe ama koddan emin değilim tabi ki, ama basit gibi de.

[/CODE]
Bu VHDL bundan pek anlamıyorum ama benim kod kabaca şu

Kod:
module top (
    input clk,       // Clock input
    output LED_0,    // Red LED
    output LED_1,    // Green LED
    output LED_2,     // Blue LED
    output LED_3     // Blue LED
);
    // Internal counter to create a slow clock for LED blinking
    reg [23:0] counter = 0;

    // Increment the counter on every clock cycle
    always @(posedge clk) begin
        counter <= counter + 1;
    end

    // Drive the RGB LEDs using the counter bits
    assign LED_0 = counter[23]; // Red LED blinks slowly
    assign LED_1 = counter[22]; // Green LED blinks faster
    assign LED_2 = counter[21]; // Blue LED blinks even faster
    assign LED_3 = counter[20]; // Blue LED blinks even faster
endmodule
 
LUT sayısı az zaten, muhtemel genel geçer işler için yapmışlardır. Bu tarz FPGA'ler çok fazla var.
aslında 5200 lut var 2500 lut ile orta ayar bir riscV 300-400 lut ile bir uart yapılıyor. kodu da flashtan işletebiliyor. tabi lattice bir xilinx-altera kadar iyi kütüphaneler sunamıyor. ama avantajı çok ucuz 3-4 usd.

 
Konuyu takipteyim. Bende bir FPGA geliştirme kiti var, hala kutusunda duruyor :ohno1:

Benim yapmaya çalıştığım şey, DSO lardaki gibi bir veri toplama sistemi. Mesela kanal başına birden fazla ADC kullanarak, daha yüksek örnekleme hızında veri toplamak ve SRAM'lerde saklamak. Değişik kriterlere göre de trigger desteği eklemek.
 
Konuyu takipteyim. Bende bir FPGA geliştirme kiti var, hala kutusunda duruyor :ohno1:

Benim yapmaya çalıştığım şey, DSO lardaki gibi bir veri toplama sistemi. Mesela kanal başına birden fazla ADC kullanarak, daha yüksek örnekleme hızında veri toplamak ve SRAM'lerde saklamak. Değişik kriterlere göre de trigger desteği eklemek.
adcler paralel ise daha kolay ama spi ise belki önceden bir mcu ile yapılandırma gerekebilir. ya da fpga içinde gene state machine ile de bu yapılandırma mümkün.

burada asıl olay fpga içindeki ram kapasitesi, genellikle ufak ve dışarıdan bir ram bağlamak gerekiyor. tabi yeni nesil gelişmiş chiplerde ddr3-ddr4 gibi çok hızlı ve geniş ramlar olabiliyor. sigrok projesi ile de uyumlu çalışan birkaç tane açık kaynak fpgali lojik analizör görmüştüm ama adc desteği var mıydı hatırlamıyorum.

ben C bildiğim için verilog ile başladım. bir de sistemverilog varmış daha da C diline yakın. hatta gelişmiş chipler için HLS - high level synthesis desteği var. direkt kodu C ile yazıyorsun sentezleyici lojik kapılara çeviriyor. donanım ve lojik bilen. C programlama bilen biri en fazla 10-15 günde microcontroller benzeri ama paralel-hızlı görevleri olan bir devreyi bence yapar.

mesela verilog always block C'deki while loop gibi.

 
Konuyu takipteyim. Bende bir FPGA geliştirme kiti var, hala kutusunda duruyor :ohno1:

Benim yapmaya çalıştığım şey, DSO lardaki gibi bir veri toplama sistemi. Mesela kanal başına birden fazla ADC kullanarak, daha yüksek örnekleme hızında veri toplamak ve SRAM'lerde saklamak. Değişik kriterlere göre de trigger desteği eklemek.
ben de fpga ile okuma yapıp pci ile pc ye aktarmayı arastırıyordum hazır sistemler var ama çok pahalıydı
 

Forum istatistikleri

Konular
7,614
Mesajlar
127,174
Üyeler
3,079
Son üye
Ysml61

Son kaynaklar

Son profil mesajları

Python Geliştirmeye eklediğim yapay zeka sunucusu, yeni başlayanlar için roket etkisi
Bir insanın zeka seviyesinin en kolay tesbiti, sorduğu sorulardır.
yapay zeka interneti yedi bitirdi, arama motoru kullanan, forumlara yazan kaldı mı ?
Freemont2.0 herbokolog Freemont2.0 wrote on herbokolog's profile.
nick iniz yakıyor
:D
az bilgili çok meraklı
Back
Top