Skocz do zawartości

Sipeed Tang Nano 4k z ADC - Gowin FPGA Designer


Gieneq

Pomocna odpowiedź

Hej @Gieneq,

mam jeszcze jedno pytanie odnośnie przetwornika ADC, który chciałbyś użyć do tego projektu. Pisałeś, że chcesz użyć scalaka ADS111x, sprawdziłem w karcie katalogowerj i te układy mają max. prędkość próbkowania około 860 SPS. Z twierdzenia Nyquista-Shannona wynika , że maksymalna częstotliwość sygnału próbkowanwego  wynosi około 400 Hz, czy nie jest to za mało, aby zrobić analizę widma sygnału (FFT) w pełnym zakresie sygnału audio (20Hz do 20Khz)?

Wiem, że są techniki typu "undersampling" które pozwalają uzyskać większe pasmo sygnału próbkowanego niż to wynikające z liczby SPS, ale to mocno komplikuje przetwarzanie sygnału.

Proponowałbym znaleźć jakiś moduł oparty na układzie scalonym ADS1256 - patrz datasheet:

https://www.ti.com/lit/ds/symlink/ads1256.pdf?ts=1644563296011&ref_url=https%3A%2F%2Fwww.ti.com%2Fproduct%2FADS1256

https://www.ti.com/product/ADS1256?utm_source=google&utm_medium=cpc&utm_campaign=asc-dc-null-prodfolderdynamic-cpc-pf-google-wwe&utm_content=prodfolddynamic&ds_k=DYNAMIC+SEARCH+ADS&DCM=yes&gclid=Cj0KCQiAr5iQBhCsARIsAPcwROP71gbvH4m-Kpp7FPH7KVDgdQbcU9OSBozFdC-n0fL64qzLFJLRCAoaAiYnEALw_wcB&gclsrc=aw.ds#params

Może któryś z tych modułów z Aliexpress.com by tobie odpowiadał:

https://pl.aliexpress.com/item/1005001593721645.html?spm=a2g0o.productlist.0.0.49787c225DRQIm&algo_pvid=e743eb80-1f3a-436c-838d-e8a46028ff5d&algo_exp_id=e743eb80-1f3a-436c-838d-e8a46028ff5d-33&pdp_ext_f={"sku_id"%3A"12000016716059836"}&pdp_pi=-1%3B62.76%3B-1%3B-1%40salePrice%3BPLN%3Bsearch-mainSearch

https://pl.aliexpress.com/item/33011251732.html?spm=a2g0o.store_pc_groupList.8148356.4.cd246475TQsezS

https://pl.aliexpress.com/item/33007417676.html?spm=a2g0o.store_pc_groupList.8148356.6.cd246475TQsezS

Te przetworniki mają około 30ksps (ostatni układ nawet 200ksps)  i wyjściowy protokoł SPI (co jest potrzebne przy większym paśmie częstotliwości próbkowanych).

Pozdrawiam

Edytowano przez FlyingDutch
update
  • Pomogłeś! 1
Link do komentarza
Share on other sites

Cześć @FlyingDutch

O samym twierdzeniu Nyquista dobrze pamiętałem, ale zwracałem na to uwagę przy wyborze częstotliwości próbkowania w programie. Zapomniałem sprawdzić jaką częstotliwość można wyciągnąć na tym ADS1116. Swoją drogą okazało się, że obecny program co mam na ESP32 działa tak sobie, bo częstotliwość próbkowania wbudowanego przetwornika to tylko 6kHz i pętla programu dział szybciej niż pomiary. Zrozumiałem dlaczego miałem problem z doborem kubełków FFT dla wysokich częstotliwości...

22 godziny temu, FlyingDutch napisał:

Proponowałbym znaleźć jakiś moduł oparty na układzie scalonym ADS1256

Tak, to jest bardzo dobry pomysł. 30ksps będzie ok, 24 bit rozdzielczości to kompletny overkill dla tego projektu. 200ksps pokryje całe 20kHz więc może to być lepszy pomysł, zwłaszcza że nie zależy mi na dużej rozdzielczości pomiarów - 16 bit jest wystarczające.

Dziękuję za propozycje, rozejrzę się jeszcze w temacie i coś zamówię.

  • Lubię! 1
Link do komentarza
Share on other sites

38 minut temu, Gieneq napisał:

Cześć @FlyingDutch

...

Tak, to jest bardzo dobry pomysł. 30ksps będzie ok, 24 bit rozdzielczości to kompletny overkill dla tego projektu. 200ksps pokryje całe 20kHz więc może to być lepszy pomysł, zwłaszcza że nie zależy mi na dużej rozdzielczości pomiarów - 16 bit jest wystarczające.

Dziękuję za propozycje, rozejrzę się jeszcze w temacie i coś zamówię.

Cześć @Gieneq

możesz zawsze wykorzystać 16 najbardziej znaczących bitów przetwornika, nawet to jest wskazane bo dla przetwornika 24-bitowego rzeczywista precyzja jest gdzieś 18 bitów. możesz jeszcze kupić jakiś tani przetwornik ADC audio np. taki:

https://pl.aliexpress.com/item/32830812025.html?gatewayAdapt=glo2pol&spm=a2g0o.9042311.0.0.32ad5c0fnIPbHV

za około 10 PLN +przesyłka na Aliexpress. Wtedy jednak będziesz musiał rozkodowywać sygnał szeregowy I2S i zamieniać go na równoległy (co komplikuje układ). Wydaje mi się, że w portfolio IP Cores Gowina są także związane z przetwarzanie sygnału I2S, więc może to nie będzie duża różnica w ilości pracy. W przypadku modułów które podałem i tak potrzeba IP Core, który czyta SPI 😉. Daj znać, jak podejmiesz jakąś decyzję odnośnie ADC bo jestem ciekaw na co się zdecydujesz.

Swoją drogą  kupiłem dzisiaj te dwa moduły, bo już od dawna chciałem zobaczyć jak można obrabiać sygnał audio na układach FPGA:

https://pl.aliexpress.com/item/1005001593721645.html?gatewayAdapt=glo2pol&spm=a2g0o.9042311.0.0.32ad5c0fnIPbHV

https://pl.aliexpress.com/item/32830812025.html?gatewayAdapt=glo2pol&spm=a2g0o.9042311.0.0.32ad5c0fnIPbHV

Pozdrawiam

 

  • Pomogłeś! 1
Link do komentarza
Share on other sites

Podaję jeszcze kilka linków do opisów zestawu FPGA "Tang Nano 4K ":

https://wiki.sipeed.com/hardware/zh/tang/Tang-Nano-4K/Nano-4K.html

https://wiki.sipeed.com/hardware/zh/tang/Tang-Nano-4K/assets/Tang_nano_4K_0813.svg

https://gowinsemi.com/en/support/devkits_detail/39

No mam już zainstalowane "Gowin EDA" na kompie w domu i będę mógł popróbować kod. Mam tylko jeden problem - nie wiem jaki typ obudowy ma układ FPGA "GW1NSR-LV4C" w IDE jest dużo podtypów i jeszcze nie ustaliłem, który jest prawidłowy.

Pozdrawiam

  • Pomogłeś! 1
Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Cześć @FlyingDutch

Dzięki za zaangażowanie 🙂 Z obudową sam chwilę siedziałem ale dlatego że nie zauważyłem że trzeba wybrać serię 1N z list po lewej. Obudowa QFN48P i prędkość C7/I6:

image.thumb.png.e9a19cc8215229e8666c6ba93e196167.png

Dnia 12.02.2022 o 11:33, FlyingDutch napisał:

Daj znać, jak podejmiesz jakąś decyzję odnośnie ADC bo jestem ciekaw na co się zdecydujesz.

SPI wydaje mi się prostszy, więc ten wybieram. Zastanawiałem czy napięcie I/O będzie ok. Układ pracuje na napięciu 1,2 V ale I/O mają już 3,3V, ADS 1256 można zasilać od 1,8 do 3,6 V więc jest ok.

image.thumb.png.bfcec17aa4a8164533684f5a04c5ef95.png

Tak z ciekawości: czy da się jakoś zmienić napięcie I/O? W przykładowym projekcie:

dk_video.zip

gdzie używany jest HDMI w pliku CST jest:

IO_TYPE=LVCMOS25 PULL_MODE=NONE DRIVE=8;

ale dla testowanego pinu 39 nie zmieniło to napięcia, dalej 3,3 V.

Dnia 12.02.2022 o 19:54, FlyingDutch napisał:

Podaję jeszcze kilka linków do opisów zestawu FPGA "Tang Nano 4K ":

To i ja dorzucam, nie pamiętam tylko skąd to pobrałem.

Schemat płytki:

Tang_Nano_4K_3603_Schematic_.pdf

Schematic manual:

UG292-1.0E_GW1NS_GW1NSR_GW1NSE_GW1NSER series of FPGA Products Schematic Manual.pdf

Pin distribution:

UG863-1.4.1E_GW1NSR series of FPGA Products Package and Pinout User Guide.pdf

Datasheet płytki:

Sipeed Tang nano 4K Datasheet_EN V1.0.pdf

Seria GW1NSR:

DS861-1.4.4E_GW1NSR series of FPGA Products Datasheet.pdf

image.thumb.png.460efe05938da91110c3f044b82b3a57.png

Using IP Core User guide - 111 stron jeszcze nie czytałem:

SUG284-1.5E_Gowin IP Core Generator User Guide.pdf

Configuration guide:

UG290-2.3E_Gowin FPGA Products Programming and Configuration Guide.pdf

i excel z opisem pinów:

UG865-1.02E_GW1NSR-4C Pinout .xlsx.zip

 

  • Pomogłeś! 1
Link do komentarza
Share on other sites

Cześć,

odnośnie poziomów sygnałów logicznych na pinach I/O to powinno dać się zmienić, trzeba jednak pamiętać, że niektóre banki pinów mogą nie onsługiwać wszystkich typów napięć.

Pozdrawiam

  • Pomogłeś! 1
Link do komentarza
Share on other sites

(edytowany)

Dorzucam dokumentację tworzenia połączeń Design Constraints. Wygląda bardzo przyjaźnie i nawet dla nowicjusza w tym temacie jest czytelne:

SUG101-1.5E_Gowin Design Constraints Guide.pdf

 

Mam pewne uprzedzenia do programów z chińskimi znaczkami w tle, ale wygląda jakby Floor Planner miał działać.

Dotarłem do 18 lekcji Veriloga i wymyśliłem że chcę zaprojektować dzielnik częstotliwości w postaci uniwersalnego modułu z parametrem N - liczba bitów. Połączenia .cst ściągnięte z przykładów z githuba:

IO_LOC "led" 10;
IO_PORT "led" PULL_MODE=NONE DRIVE=8;

IO_LOC "key1" 14;
IO_PORT "key1" PULL_MODE=UP;

IO_LOC "key2" 15;
IO_PORT "key2" PULL_MODE=UP;

IO_LOC "sys_clk" 45;
IO_PORT "sys_clk" PULL_MODE=UP;

Top module:

module top_module(key1, key2, led, sys_clk);
    input key1, key2, sys_clk;
    output led;
    
    clk_div DIVIDER(.clk_in(sys_clk), .clk_out(led), .res(key2));
    defparam DIVIDER.N = 22;
endmodule

i na początek kod podpatrzony z githuba - jak rozumiem jest to podejście "behawioralne", gdzie niekoniecznie interesuje mnie połączenie, tylko efekt:

module clk_div (clk_in, clk_out, res);
    parameter N = 24;
    input clk_in, res;
    output reg clk_out;

    reg [N-1:0] counter;

    always @(posedge clk_in or negedge res)
        if (~res)
            begin
            counter <= {N{1'b0}};
            clk_out <= 1'b0;
        end
        else if (counter < {N{1'b1}})
            counter <= counter + 1;
        else
        begin
            counter <= {N{1'b0}};
            clk_out <= ~clk_out;
        end
endmodule

I nawet działa. Spodobała mi konkatenacja i replikacja przy użyciu składni z nawiasami klamrowymi - coś podobnego jest w Pythonie. Otworzyłem schemat połączeń i wygląda jakoś, nie tego się spodziewałem po lekcjach z profesorem Hindusem:

image.thumb.png.6653b83252130be04a73ee9d37693e83.png

Dlatego spróbowałem zrobić to tak jak książkowo znam dzielnik modulo N i zrobić kaskadę przerzutników D. Na stronie Digilenta jest na ten temat ciekawy artykuł, z którego poznałem strukturę generate z pętlą for. W artykule pokazano jak zrobić przerzutnik D, ale jest do tego gotowy moduł.

module clk_div (clk_in, clk_out, res);
    parameter N = 24;
    input clk_in, res;
    output clk_out;

    wire [N-1:0] dff_d, dff_clk;
    wire res_n;
    assign res_n = ~res;

    DFFR D_FF(.D(dff_d[0]), .CLK(clk_in), .RESET(res_n), .Q(dff_clk[0]));

    genvar i;
    generate
    for (i = 1; i < N; i=i+1) 
    begin : dff_gen_label
        DFFR dff_inst (
            .CLK(dff_clk[i-1]),
            .RESET(res_n),
            .D(dff_d[i]),
            .Q(dff_clk[i])
        );
        end
    endgenerate;

    assign dff_d = ~dff_clk;
    assign clk_out = dff_clk[N-1];
endmodule

Wynikowy schemat wygląda dużo przyjaźniej:

image.thumb.png.243c7a543b46fd4c4a636bd0d30449e6.png

Choć środowisko mogłoby nie łączyć wszystkiego w magistrale i ciągnąć na wspólną bramkę. 

Szukając czegoś natrafiłem na opis CFU (Configurable Function Unit) który jak rozumiem jest synonimem CLB:

UG288E.pdf

i jednak istnieje wariant przerzutnika D z negacją DFFNR:

image.thumb.png.92d25df8f684dedcc32dc5ea1d730f3f.png

W ogóle lista "prymitywów" jest też bardzo pomocna, ale tych pdfów robi się tyle że nie mam zabardzo jak się z nimi zapoznać.

SUG283-1.5E_Gowin FPGA Primitive User Guide.pdf

Początkowo byłem trochę uprzedzony do tej chińskiej myśli technicznej, "robaczki" w kradzionym logo trochę odstraszają, ale dokumentacja jest naprawdę dobra 👍 chyba, że się nie znam, ale subiektywnie dla laika jest super 🙂 

Zauważyłem, że w środowisku jest raport z syntezy i zaciekawiły mnie różnice - po lewej wersja "behawioralna" po prawej z przerzutnikami D

image.thumb.png.a6f120063fd90200d479fc97c5e976cd.pngimage.thumb.png.ff887c8b7f563c4354fede18195bca6f.png

Już z tego widać różnicę, drugi wariant ma:

  • o 13 mniej LUT,
  • o 1 mniej przerzutnik,
  • 2 CLS więcej.

Przerzutnik znalazłem tu:

image.thumb.png.cd8dfbfdf45a80ea10ea05d3bfd6af3f.png

Czym jest CLS? To znalazłem w PDFie o CFU (akronimy, akronimy...). Schemat blokowy:

image.thumb.png.a3bf88543a655473a9db035676327dc3.png

Cytat

The configurable function unit and the configurable logic unit are two basic units for FPGA core of GOWINSEMI. As shown in Figure 2-1, each unit consists of four configurable logic sections and its configurable routing unit. Each of the three configurable logic sections contains two 4-input LUTs and two registers, and the other one only contains two 4-input LUTs. Configurable logical sections in CLU cannot be configured as SRAM, but as basic logic, ALU, and ROM. The configurable logic sections in the CFU can be configured as basic logic, ALU, SRAM, and ROM depending on the applications. This manual takes CFU as an example to introduce CFU and CLU

Temat ten jest też w User Guide dla serii GW1NSR, tylko rysunek i opis są nieco inne:

image.thumb.png.9c9128f516311098c72202b1aef9ee2e.png

Cytat

The configurable function unit (CFU) is the base cell for the array of the GW1NSR series of FPGA products. Each CFU consists of a configurable logic unit (CLU) and its routing resource configurable routing unit (CRU). In each CLU, there are four Configurable Logic Sections (CLS). Each CLS contains look-up tables (LUT) and registers

Według tej pierwszej CFU i CU to coś innego, według tej drugiej CFU zawiera CLU... wybieram tę drugą, bo tyczy się samej serii, może w pierwszym jest błąd - raczej CFU łączy się z innym CFU. Wracając do CLS:

image.thumb.png.0b36b57252fd389d124ea9b291721de6.png

Jak rozumiem w tym układzie CLS pracują w ALU mode więc możliwe, że potrzeba ich więcej, żeby zsyntezować przerzutniki D z inwerterem.

image.thumb.png.e13d926ddd8944916c340de50e09afff.png

Porównałem jeszcze inne raporty:

image.thumb.png.03478a07edbe8f8448e2d037a3c5a2f7.pngimage.thumb.png.30ef1d4533772682797ffcd2030368bd.png

W wersji z przerzutnikami D zużycie energi nieznacznie wzrosło.

image.png

image.thumb.png.23a812f08e6e7d681805871085fac936.pngimage.thumb.png.7fa7fbfdf6964a3da99e29fa50ae3c90.png

Tego niezabardzo rozumiem @FlyingDutch mógłbyś mi podpowiedzieć co to oznacza?

 

 

Edytowano przez Gieneq
  • Lubię! 1
Link do komentarza
Share on other sites

14 godzin temu, Gieneq napisał:

Dorzucam dokumentację tworzenia połączeń Design Constraints. Wygląda bardzo przyjaźnie i nawet dla nowicjusza w tym temacie jest czytelne:

SUG101-1.5E_Gowin Design Constraints Guide.pdf 4 MB · 3 downloads

 

Mam pewne uprzedzenia do programów z chińskimi znaczkami w tle, ale wygląda jakby Floor Planner miał działać.

Dotarłem do 18 lekcji Veriloga i wymyśliłem że chcę zaprojektować dzielnik częstotliwości w postaci uniwersalnego modułu z parametrem N - liczba bitów. Połączenia .cst ściągnięte z przykładów z githuba:


IO_LOC "led" 10;
IO_PORT "led" PULL_MODE=NONE DRIVE=8;

IO_LOC "key1" 14;
IO_PORT "key1" PULL_MODE=UP;

IO_LOC "key2" 15;
IO_PORT "key2" PULL_MODE=UP;

IO_LOC "sys_clk" 45;
IO_PORT "sys_clk" PULL_MODE=UP;

Top module:


module top_module(key1, key2, led, sys_clk);
    input key1, key2, sys_clk;
    output led;
    
    clk_div DIVIDER(.clk_in(sys_clk), .clk_out(led), .res(key2));
    defparam DIVIDER.N = 22;
endmodule

i na początek kod podpatrzony z githuba - jak rozumiem jest to podejście "behawioralne", gdzie niekoniecznie interesuje mnie połączenie, tylko efekt:


module clk_div (clk_in, clk_out, res);
    parameter N = 24;
    input clk_in, res;
    output reg clk_out;

    reg [N-1:0] counter;

    always @(posedge clk_in or negedge res)
        if (~res)
            begin
            counter <= {N{1'b0}};
            clk_out <= 1'b0;
        end
        else if (counter < {N{1'b1}})
            counter <= counter + 1;
        else
        begin
            counter <= {N{1'b0}};
            clk_out <= ~clk_out;
        end
endmodule

I nawet działa. Spodobała mi konkatenacja i replikacja przy użyciu składni z nawiasami klamrowymi - coś podobnego jest w Pythonie. Otworzyłem schemat połączeń i wygląda jakoś, nie tego się spodziewałem po lekcjach z profesorem Hindusem:

image.thumb.png.6653b83252130be04a73ee9d37693e83.png

Już z tego widać różnicę, drugi wariant ma:

  • o 13 mniej LUT,
  • o 1 mniej przerzutnik,
  • 2 CLS więcej.

Przerzutnik znalazłem tu:

image.thumb.png.cd8dfbfdf45a80ea10ea05d3bfd6af3f.png

Czym jest CLS? To znalazłem w PDFie o CFU (akronimy, akronimy...). Schemat blokowy:

 

image.png

image.thumb.png.23a812f08e6e7d681805871085fac936.pngimage.thumb.png.7fa7fbfdf6964a3da99e29fa50ae3c90.png

Tego niezabardzo rozumiem @FlyingDutch mógłbyś mi podpowiedzieć co to oznacza?

 

Cześć @Gieneq

witamy w świecie układów programowalnych, na początku można się poczuć przytłoczonym ilością nowych terminów i dokumentacji. Odnośnie wygenerowanej pierwszej wersji licznika to według mnie jest tam to, czego bym się spodziewał. Masz sam licznik, sumator do zwiększania jego wartości o jeden, komparator do porównania z wartością maksymalną (ten komparator steruje pierwszym multiplekserem). Druga wersja na przerzutnikach to przykład "ręcznej" optymalizacji układu. Wiecej przerzutników to większa moc pobierana podczas ich pracy. Odnośnie "Global Clock Usage Summary" to raport po prostu mówi, że został użyty jeden z ośmiu układów zegarowych dostępnych w tym układzie FPGA.

BTW: wczoraj po południu odebrałem płytkę FPGA "Tang Nano 4K", tak, że będę mógł już robić próby na docelowym sprzęcie. Teraz czekam tylko na dwie płytki z przetwornikami ADC do tych prób.

Pozdrawiam

  • Pomogłeś! 1
Link do komentarza
Share on other sites

Cześć @FlyingDutch

3 godziny temu, FlyingDutch napisał:

że został użyty jeden z ośmiu układów zegarowych dostępnych w tym układzie FPGA.

Ok rozumiem, dzięki. Zabrałem się za czytanie dokumentacji o zegarach i zaczynam to rozumieć.

3 godziny temu, FlyingDutch napisał:

witamy w świecie układów programowalnych, na początku można się poczuć przytłoczonym ilością nowych terminów i dokumentacji.

Tak wygląda strasznie, ale porównując z dokumentacją mikrokontrolerów to ten temat wydaje się bardziej przystępny.

3 godziny temu, FlyingDutch napisał:

tak, że będę mógł już robić próby na docelowym sprzęcie. Teraz czekam tylko na dwie płytki z przetwornikami ADC do tych prób.

Super 🙂 Też zamówiłem przetwornik. Czytałem że jest wersja GW1NSR z wbudowanym ADC, napisane jest że slew rate to 1MHz, ale już nie drążyłem tematu.

Udało mi się napisać linijkę LED na rejestrze przesuwnym i mam zagadkę, bo korzystam z wyprowadzeń z 3 banków i każdy ma inny poziom napięć:

  • bank 3 - 1.8V,
  • bank 2 - 2.5V,
  • bank 1 - 3,3V.

Ustawiłem w pliku .cst napięcie ale nie ruszyło, może czegoś jeszcze nie wiem. Myślę ze w końcu dojdę jak to zrobić.

image.thumb.png.db1bb67cd0e3f59eba7d75c4c6519864.png

Zaciekawiła mnie dystrybucja sygnału zegarowego.

image.thumb.png.b434443c954ae0615f353a27a1adc76c.png

Czyli mogę wybrać źródło sygnału zegarowego dla danego banku

image.thumb.png.c62a5153a83634e1bfad03ee07860886.png

i służą do tego bloki DQCE i DCS. I w sumie nie rozumiem jak bez tej wiedzy udało mi się coś uruchomić. Widzę że w dokumentacji primitives są jako osobne klocki, które mogę połączyć. Domyślam się, że przy syntezie jest to jakoś domyślnie ustawiane, a ja mogę spróbować to optymalizować, podobnie jak z ustawianiem przerzutników. Dobrze myślę?

 

 

Link do komentarza
Share on other sites

2 godziny temu, Gieneq napisał:

Cześć @FlyingDutch

..

Super 🙂 Też zamówiłem przetwornik. Czytałem że jest wersja GW1NSR z wbudowanym ADC, napisane jest że slew rate to 1MHz, ale już nie drążyłem tematu.

Udało mi się napisać linijkę LED na rejestrze przesuwnym i mam zagadkę, bo korzystam z wyprowadzeń z 3 banków i każdy ma inny poziom napięć:

  • bank 3 - 1.8V,
  • bank 2 - 2.5V,
  • bank 1 - 3,3V.

Ustawiłem w pliku .cst napięcie ale nie ruszyło, może czegoś jeszcze nie wiem. Myślę ze w końcu dojdę jak to zrobić.

image.thumb.png.db1bb67cd0e3f59eba7d75c4c6519864.png

służą do tego bloki DQCE i DCS. I w sumie nie rozumiem jak bez tej wiedzy udało mi się coś uruchomić. Widzę że w dokumentacji primitives są jako osobne klocki, które mogę połączyć. Domyślam się, że przy syntezie jest to jakoś domyślnie ustawiane, a ja mogę spróbować to optymalizować, podobnie jak z ustawianiem przerzutników. Dobrze myślę

 

Cześć @Gieneq

Tutaj jest pinout dla płytki "tang Nano 4K" i na nim są kolorami zaznaczone piny należące do danego banku (kolorowymi kółkami:

https://wiki.sipeed.com/hardware/zh/tang/Tang-Nano-4K/assets/Tang_nano_4K_0813.svg

Z opisu wynika, że:

Bank0 ma VCC=3,3V

Bank1 ma VCC=3,3V

Bank2 ma VCC=2,5V

Bank3 ma VCC=1,8V

Niestety im układ FPGA jest nowszy, tym mniej ma pinów I/O z napięciem 3,3V - ja walczyłam z tym problemem dla płytki Qmtech ze Spartanem7 przy podłączeniu do IC z pamięcią SRAM.

Odnośnie układów zegarowych, to większa ich ilość czasami się przydaje. Także czasami potrzebny jest do niektórych układów zegar różnicowy (na dwóch pinach). Bardzo się cieszę, że zacząłeś zgłębiać temat układów FPGA, bo może wreszcie, będzie z kim podyskutować na ten temat na tym forum 😃 Odnośnie primitives - to można wstawiać ich instancje bezpośrednio w kodzie Verilog'u, czasami jest to bardzo przydatne (np. różnego rodzaju bufory I/O, szeregowe linie transmisyjne itp.)

Pozdrawiam

Edytowano przez FlyingDutch
  • Pomogłeś! 1
Link do komentarza
Share on other sites

Cześć,

 dzisiaj podłączyłem płytkę "Tang Nano 4K" do środowiska do syntezy "Gowin EDA" i wgrałem do niej przykład z mrugającą LED aby sprawdzić, czy debugger JTAG działa poprawnie. Wszystko wydaje się działać prawidłowo, więc można zacząć działać z płytką FPGA. Teraz warto by było uruchomić hard procesor ARM-Cortex-M3 i pomrugać tym LED'em z programu w C. Muszę znaleźć jakiś tutorial jak tego dokonać 😉

Jest też drugi przykład bardziej zaawansowany z użyciem kamery OV2640 i wyjścia HDMI, postaram się też go uruchomić na tej płytce FPGA. Zsyntetyzowałem też i wgrałem "na płytkę" drugi przykład "dk_video" z użyciem kamery i wyjściem  HDMI. Kamera działa, ale obraz jest czarno-biały i ma małą rozdzielczość:

IMG_20220217_130345.thumb.jpg.7ebfbd04bf0a0021953bde683042d145.jpg

Muszę przeanalizować kod tego przykładu (widziałem, że jest w nim użytych kilka IP Cores Gowina) i zobaczyć na schemacie płytki jak jest zrealizowane wyjście HDMI.

No zajrzałem do żródeł tego drugiego przykładu i kod IP Cores jest obfuskowany/szyfrowany i to jest wkurzające bo można by się z niego dużo nauczyć 🤨 - szczególnie zależało mi na kodzie IP Core "Video Frame Buffer". Z analizy niezaszyfrowanej części kodu wynika, że ktoś (autor kodu) "poszedł po bandzie" i głowny generator obrazu oparł na kodzie dla VGA (obraz został potem zserializowany dla potrzeb HDMI) - stąd ta mała rozdzielczość.

Pozdrawiam

Edytowano przez FlyingDutch
update
Link do komentarza
Share on other sites

Cześć @FlyingDutch

Doszedłem do tego czego nie rozumiałem.

image.thumb.png.26b7b6fd40e09f0144c6e453d488d04f.pngimage.thumb.png.13090ae837a30d1122bcccee92900c0e.png

Czyli piny VCCOx odpowiadają za to jakie jest napięcie na banku. Nie zauważyłem ich wcześniej na schemacie:

image.thumb.png.24d7f1af15903a9c5f0e3223267d6496.png

Ciekawe że układ w obudowach QFN ma 2 piny zasilające dla banku 3:

image.thumb.png.64e2742ce6ac7eb8b1cff520c2d41eb2.png

a to może tłumaczyć dlaczego VCCO3 1,8 V

image.thumb.png.bd45f34a7101d82c8a5d83a8b99204e4.png 

Też zaciekawiło mnie połączenie wyprowadzeń do HDMI. 100nF to sporo jak na tak szybkie linie, częstotliwość graniczna dla takiego obwodu RC to 32kHz:

image.thumb.png.771644af7b43ad84359e70d71002e988.png

20 godzin temu, FlyingDutch napisał:

Odnośnie układów zegarowych, to większa ich ilość czasami się przydaje. Także czasami potrzebny jest do niektórych układów zegar różnicowy (na dwóch pinach).

Ok, dzięki 👍

9 minut temu, FlyingDutch napisał:

Teraz warto by było uruchomić hard procesor ARM-Cortex-M3 i pomrugać tym LED'em z programu w C.

To czekam z niecierpliwością i powodzenia! 🙂 Zastanawiałem się nad tym, ale na pierwszej stronie googla nie znalazłem odpowiedzi (chyba że wpisywałem złe hasła). Też będę nad tym siedział ale na razie podstawy - lekcja 20 Veriloga - maszyna stanów i spróbuję w ramach ćwiczeń zrobić prosty sterownik diod WS2812B.

  • Lubię! 1
Link do komentarza
Share on other sites

Cześć,

wpadłem na taki pomysł, żeby dopóki nie przyjdą do mnie moduły (płytki) z Aliexpress z przetwornikami analogowo-cyfrowymi, zrobić układ z zestawem FPGA "Tang Nano 4K", który odbierał by dane magistralą SPI z płytki "Nucleo-F103RB" i liczył na tych danych FFT, a potem to jakoś wizualizował (na jakimś wyświetlaczu graficznym). Dane wysyłane z płytki Nucleo zawierały by kilka sinusoid o różnych amplitudach i częstotliwościach - więc wiedziałbym jak powinna wyglądać transformata FFT (jakie prążki widma powinna wyświetlać). Szkoda tylko, że kod IP Cores firmy Gowin jest szyfrowany. Zabieram się właśnie za stworzenie takiego projektu, zawierałby on 2 IP Cores "SPI Master" i "FFT" oraz kod do obsługi jekiegoś wyświetlacza graficznego (no i trochę własnego kodu w języku Verilog, aby to wszystko połaczyć razem). Jak przyjdą płytki z układami przetworników ADC, to trzeba będzie tylko zaktualizować kod odbioru danych po SPI.

Pozdrawiam

Link do komentarza
Share on other sites

Cześć @FlyingDutch

Dobry pomysł 🙂 

A ja się nad czymś zastanawiam, bo mam ciągle ostrzeżenie:

Cytat

WARN  (PR1014) : Generic routing resource will be used to clock signal 'clk_out_raw_d' by the specified constraint. And then it may lead to the excessive delay or skew
 

Czasem znika, ale nie wiem w jakich okolicznościach. Więc przygotowałem dość prosty kod. Gdy przenoszę sys_clk na wyjście to wygląda jak idealna sinusoida 27MHz.

Ale jak podłączę cokolwiek to sygnał przypomina już trójkąt i drugi kanał oscyloskopu nie synchronizuje się jakby przesunięcie w fazie zmieniało się co pół okresu.

module frequency_divider_by2 (input clk, rst, output reg out_clk );
always @(posedge clk or negedge rst)
    if (~rst)
         out_clk <= 1'b0;
    else
         out_clk <= ~out_clk;	
endmodule
  
  
module top_module(input sys_rst_n, sys_clk, output clk_out_div);
	frequency_divider_by2 xadsdasd(sys_clk, sys_rst_n, clk_out_div);
endmodule

Próbowałem też z blokiem PLL z IP Core podnoszącym częstotliwość do 50MHz:

image.thumb.png.6f2c52a1efc98f5afa89e5adffcae9fa.png

Tu moze kalibracja jest potrzebna czy coś, nie wiem...

Gowin_PLLVR your_instance_name (
  .clkout(clk_test), //output clkout
  .clkin(sys_clk) //input clkin
);

Próbowałem z dzielnikiem przez 3,5 z IP Core:

Gowin_CLKDIV your_instance_name(
  .clkout(clk_out_div), //output clkout
  .hclkin(sys_clk), //input hclkin
  .resetn(sys_rst_n) //input resetn
);

Za każdym razem kształt sygnałów był inny i przesunięcie w fazie się zmieniało.

IMG_8637.thumb.jpg.34b8ebf529c64e43d4cf9459771e4690.jpgIMG_8638.thumb.jpg.2e17ea7db7f0d6946a1684f50fb10913.jpg

Nie ma przypadkiem jakiegoś czegoś do czego muszę poprowadzić sygnał zegarowy, a dopiero później rozprowadzać go na inne bloki?

Link do komentarza
Share on other sites

2 godziny temu, Gieneq napisał:

Cześć @FlyingDutch

Dobry pomysł 🙂 

A ja się nad czymś zastanawiam, bo mam ciągle ostrzeżenie:

Czasem znika, ale nie wiem w jakich okolicznościach. Więc przygotowałem dość prosty kod. Gdy przenoszę sys_clk na wyjście to wygląda jak idealna sinusoida 27MHz.

Ale jak podłączę cokolwiek to sygnał przypomina już trójkąt i drugi kanał oscyloskopu nie synchronizuje się jakby przesunięcie w fazie zmieniało się co pół okresu.



module frequency_divider_by2 (input clk, rst, output reg out_clk );
always @(posedge clk or negedge rst)
    if (~rst)
         out_clk <= 1'b0;
    else
         out_clk <= ~out_clk;	
endmodule
  
  
module top_module(input sys_rst_n, sys_clk, output clk_out_div);
	frequency_divider_by2 xadsdasd(sys_clk, sys_rst_n, clk_out_div);
endmodule


Nie ma przypadkiem jakiegoś czegoś do czego muszę poprowadzić sygnał zegarowy, a dopiero później rozprowadzać go na inne bloki?

W ostatnim zdaniu trafiłeś w dziesiątkę, powinieneś sygnał zegarowy (ten sygnał po podziale częstotliwości jest także traktowany jako zegar - sygnał out_clk) podłączyć do pinu ze specjalnym buforem zegara  (ma on odpowiednio dobry routing dla reszty układu). To tylko ostrzeżenie, ale może pogarszać parametry czasowe twojego układu, dlatego warto go przenieść na odpowiedni pin. Wydaje mi się, że na rysunku pinout'u dla "Tang Nano 4K" takie piny są oznaczone jako "Clock pin" kolorem fioletowym:

https://wiki.sipeed.com/hardware/zh/tang/Tang-Nano-4K/assets/Tang_nano_4K_0813.svg

W razie czego takie piny można też zobaczyć w narzędziu "FloorPlanner" z "Gowin EDA", albo z dokumentacji konkretnego układu FPGA z tej płytki.

Możesz też zobaczyć ten wątek na forum edaboard.com- tam ten temat jest dogłębnie przedstawiony:

https://www.edaboard.com/threads/clk-generic-routing-warning.399598/

BTW: nie przejmuj się, to jest chyba jeden z najczęściej spotykanych błędów w układach FPGA. Ja miałem go już kilka razy na FPGA Xilinx'a (Spartan7 i Artix7)

Pozdrawiam

Edytowano przez FlyingDutch
Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.