Elektroda.pl
Elektroda.pl
X
PCBway
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Zapis/odczyt danych przez USB do płytki startowej Altery

12 Mar 2010 21:17 2673 17
  • Poziom 9  
    Witam.

    Chciałbym do płytki startowej Altery (a właściwie do Cyclone III na niej się znajdującego) zapisywać i odczytywać dane przez USB z wykorzystaniem Matlaba (najlepiej real-time). Jak na razie mam tam prosty filtr i chciałbym sprawdzić czy działa zgodnie z przewidywaniami. Próbowałem coś grzebać, ale wygląda na to, iż Matlab nie obsługuje portów USB. W internecie znalazłem sposób, żeby zainstalować taki sterownik, który umożliwi sterowanie portu USB jak portu COM i to by rozwiązywało sprawę. Jednakże za Chiny nie mogę tego osiągnąć z USB Blasterem, który jest dołączony do tej płytki startowej.
    Ktoś może próbował, wie jak lub wie że nie można tego zrobić?
  • PCBway
  • Poziom 15  
    Witam
    Jeśli chcesz sprawdzić działanie filtru możesz spróbować użyć analizatora logicznego wbudowanego w program Quartus. Jest to całkiem wygodne narzędzie - możesz wyświetlać sygnały z magistrali (np.wyjścia filtru) w postaci "analogowej". Co do analiz za pomocą Matlaba, to być może musisz poczytać o DSP Builder, który też jest produktem firmy Altera i współpracuje z Matlabem.

    http://www.altera.com/products/software/products/dsp/dsp-builder.html

    Pozdrawiam
  • PCBway
  • Poziom 9  
    Myślę, że tan analizator będzie niewystarczający. Chodzi o to, że filtr jest tylko częścią większego systemu. Poza tym wiem, iż działa poprawnie, chcę mieć możliwość sprawdzania odpowiedzi (docelowo całego systemu) na wejście, a najwygodniej byłoby to zrobić z użyciem Matlaba.

    DSP Builder z tego co spojrzałem służy do generowania np kodu VHDL na podstawie symulacji w Matlabie, a nie o to mi chodzi.

    Mam jeszcze jedno pytanie: czy ktoś ma gdzieś jakiś tutorial w jaki sposób przesyła się dane przez ten USB Blaster do układu FPGA. Coś mi świta że jest tam 8-bitowa magistrala i jakieś sygnały sterujące, ale nic poza tym.
  • Poziom 15  
    prokrastynator napisał:
    Myślę, że tan analizator będzie niewystarczający. Chodzi o to, że filtr jest tylko częścią większego systemu. Poza tym wiem, iż działa poprawnie, chcę mieć możliwość sprawdzania odpowiedzi (docelowo całego systemu) na wejście, a najwygodniej byłoby to zrobić z użyciem Matlaba.

    Mam jeszcze jedno pytanie: czy ktoś ma gdzieś jakiś tutorial w jaki sposób przesyła się dane przez ten USB Blaster do układu FPGA. Coś mi świta że jest tam 8-bitowa magistrala i jakieś sygnały sterujące, ale nic poza tym.


    Witam
    Generalnie sprawdzenie zawartości danych sygnałów (lub też całego systemu) sprowadza się do wykorzystania portu w układzie FPGA przeznaczonego do programowania oraz testowania np.JTAG. W przypadku kiedy korzystasz z wbudowanego analizatora stanów dane z wybranych komórek są zapisywane w komórkach pamięci RAM układu FPGA, a następnie przesyłane przez dedykowany port. W przypadku układu rozwojowego zazwyczaj ten port jest podpięty do USB. Po drodze masz układ "konwertujący" dane z JTAG-a na USB. Oczywiście jeśli zwiększasz liczbę sprawdzanych komórek (mam na myśli sygnały, wyjścia,wejścia itp) czas obserwacji maleje, a jak zmniejszasz ilość kontrolowanych komórek czas obserwacji się wydłuża. Związane jest to z ilością pamięci RAM w FPGA.

    Moim prywatnym zdaniem wbudowany analizator logiczny powinien Ci wystarczyć. Jeśli jest jakieś narzędzie które z poziomu Matlaba pozwala na odczyt danych z FPGA to przypuszczam, że i tak wykorzystuje on dane z analizatora logicznego. Jedynie może forma prezentacji danych jest bardziej dogodna.

    Jak będziesz miał jakieś pytania to pisz, postaram Ci pomóc.
    Pozdrawiam

    PS.Jeśli chcesz możesz spróbować zadać pytanie na www.alteraforum.com.
  • Poziom 9  
    Jeśli chodzi o tego Matlaba to nie jest mój wymyśl, tylko mojego promotora, a właściwie jego sugestia, więc można się tym zbytnio nie przejmować :D

    Natomiast nie wiem co zrobić żeby wysłać dane do FPGA, przetworzyć je i odebrać. Mam płytkę Cyclone III FPGA Starter, a sygnały jakie przetwarzam to:
    Code:

    ---------------------------------------------------
    -- Filtr FIR o współczynnikach:
    -- b1 = 0,125
    -- b2 = 0,5
    -- b3 = 0,5
    -- b4 = 0,125
    --
    ----------------------------------------------------

    LIBRARY IEEE;
    USE IEEE.std_logic_1164.all;
    USE IEEe.std_logic_arith.all;
    USE IEEE.std_logic_signed.all;

    ENTITY filtr_fir_latwy IS
       PORT( clk                             :   IN    std_logic; -- zegar
             clk_enable                      :   IN    std_logic;
             reset                           :   IN    std_logic;
             filter_in                       :   IN    std_logic_vector(27 downto 0); -- wejście filtru
             filter_out                      :   OUT   std_logic_vector(43 downto 0);  -- wyjście fitru
             enable                      :    OUT   std_logic -- wyjście sygnalizujące początek strumienia danych wyjściowych
             );

    END filtr_fir_latwy;



    Teraz pytanie: czy trzeba do tego napisać jakiś dodatkowy moduł odpowiedzialny za komunikację z USB, czy jakoś inaczej.
  • Poziom 15  
    Witam
    Zakładam, że na myśli masz wbudowany analizator. Sam nie musisz tworzyć, żadnych dodatkowych modułów. Wchodzisz w opcję wspomnianego analizatora, wybierasz jakim sygnałem ma być wyzwalana analiza (np. u Ciebie może być sygnałem zegarowym clk). Dodajesz jakie sygnały chcesz obserwować i tyle. Jeśli analizowanym modułem ma być filtr to w zależności jakim układem rozwojowym dysponujesz możesz postąpić na dwa sposoby.
    1. Jeśli masz płytkę z przetwornikiem A/C to podłączasz na jego wejście generator. Wtedy automatycznie możesz śledzić sygnał wejściowy w postaci cyfrowej.
    2. Jeśli nie masz przetworników A/C to musisz stworzyć, coś w rodzaju generatora sygnałów testowych. Będzie to pamięć z zapisanymi np. sinusoidami o kilku różnych częstotliwościach. Możesz również wykorzystać jako źródło przebiegi prostokątne z racji zawartości wielu harmonicznych. Sygnał z generatora sygnałów testowych puszczasz na wejście filtru i gotowe.

    Pozdrawiam
  • Poziom 9  
    Ten analizator to SignalTap II Logic Analyzer? Próbowałem z niego korzystać, ale jakoś nie za bardzo umiem. To znaczy nie wiem jak podać sygnał testowy na wejście filtru. Nie za bardzo widzę tam opcję wpisywania danych, przeczytałem też jakiegoś Handbooka na stronie Altery, ale tam też nic nie znalazłem. Sygnał testowy jaki chcę podać mam wygenerowany w Matlabie (wartości próbek).
  • Poziom 27  
    prokrastynator napisał:
    Ten analizator to SignalTap II Logic Analyzer?/.../


    moim zdaniem signal tap - jakkolwiek swietne narzedzie -
    nie jest najlepszym rozwiazaniem w Twoim przypadku;
    'klasycznie' powinienes to zrobic tak:
    wygenerowac przez alterowego wizarda edytowalny rom,
    ktory przez usb blaster moze byc ladowany danymi
    z pliku dostarczonymi przez matlab, to bedzie zrodlo danych
    dla Twojej logiki;
    na 'drugim koncu' tej logiki powinna byc druga pamiec, do ktorej
    bedziesz wpisywal wyniki przetwarzania;
    znow przez usb blaster te pamiec mozesz odczytac i zrzucic
    do pliku ascii, ktory moze byc potem znow analizowany/wyswietlany
    przez matlab;
    ladowanie pamieci zrodla danych testowych i zrzut pamieci wynikowej
    mozna zrobic bezposrednio z quartusa lub dosc prostym skryptem tcl;

    moze byc drobny problem, jezeli masz malego cyclone [z mala iloscia
    pamieci], za malego by pomiescic obie pamieci [zrodlo i odbiornik danych]
    w takim wypadku moznaby uzyc jednej pamieci, dwuportowej, ktora
    na jednym porcie dostarczalaby sampli do obrobki, a na drugim
    przyjmowala wyniki;
    w takim przypadku, o ile mnie pamiec nie myli, nie moglbys zawartosci
    pamieci edytowac 'on-line', zawartosc pamieci musialaby byc
    w pliku *.mif i kompilowana za kazdym razem, gdybys chcial zmienic wektory
    wejsciowe [co w przypadku projektu kompilujacego sie kilka/kilkanascie
    minut nie wydaje sie duza niedogodnoscia]
    JA
  • Poziom 15  
    Witam
    Tak mówiąc wbudowany analizator mam na myśli Signal Tap. Co do manuala to masz link poniżej z opisanym Signal Tap-em (od strony 35):

    http://www.altera.com/literature/hb/qts/qts_qii5v3_05.pdf

    Dodatkowo załączyłem Ci okienko z analizatora. Najprościej jest wybrać opcję Tools->Signal Tap Analyzer

    Następnie pojawia Ci się wspomniane okienko.
    Zapis/odczyt danych przez USB do płytki startowej Altery

    Tam wybierasz w opcji Edit pole Add Nodes i dodajesz do analizatora wybrane przez Ciebie sygnały. Musisz również ustawić który sygnał wyzwala próbkowanie. Dodatkowo po prawej stronie masz pole Clock gdzie wybierasz sygnał taktujący próbkowaniem. To tak w telegraficznym skrócie. Oczywiście wcześniej musisz przypisać wybrane wejście i wyjścia do konkretnych pinów układu.

    Pozdrawiam
  • Poziom 9  
    J.A napisał:

    ladowanie pamieci zrodla danych testowych i zrzut pamieci wynikowej
    mozna zrobic bezposrednio z quartusa lub dosc prostym skryptem tcl;
    JA


    Byłbym wdzięczny, gdybyś wytłumaczył łopatologicznie w jaki sposób :) Niestety jeśli chodzi o obsługę płytki to jestem zupełnie zielony.

    Jeśli chodzi o ten SignalTap, to najpierw spróbuję z tymi pamięciami, a potem może (jeśli będzie taka potrzeba) pokombinuję z nim.
  • Poziom 27  
    1.tools -> megawizard plug-in -> create a new custom... /next
    na kartce ktora sie pokaze wybierz rodzine fpga
    a z dostepnych modulow: mem. compiler->rom 1-port
    wypelnij wymagane pola
    gdzies pod koniec trzeba zaznaczyc opcje:
    Allow In-System Memory Content Editor ...

    2.w podobny sposob generujesz pamiec na wyniki, ale tym razem
    RAM, nie ROM, rowniez z opcja 'Allow In-System...'

    3.tworzysz zgrabny top level, w ktorym laczysz rom jako
    zrodlo danych, Twoja logike i ram jako odbiornik danych

    4.jak sie skompiluje, zaladuje plik *.sof do plytki, to za pomoca
    Tools -> In System Memory Content Editor mozesz zaladowac/odczytac
    dane do/z obu pamieci;
    a po odczycie zrobic export do pliku;
    J.A
  • Poziom 9  
    Wygenerowałem pamięci ROM i RAM i spróbowałem na razie połączyć je tylko ze sobą. Niestety nie działają. Po wpisaniu jakiejś wartości do ROM i wybraniu Read Data from In-System Memory zmienia wartości całej pamięci na 0 a w RAMie po odczytaniu Write Data to In_System Memory też są same zera. Podłączyłem sygnał zegarowy clk do odpowiedniego pinu (nie wiem czy słusznie, ale próbowałem też bez). Rozumiem że w przypadku RAMu sygnał wren to write_enable więc powinien mieć wartość '1'. A oto listing mojego top levela:

    Code:
    LIBRARY IEEE;
    
    USE IEEE.std_logic_1164.all;
    USE IEEe.std_logic_arith.all;
    USE IEEE.std_logic_signed.all;
    LIBRARY altera_mf;
    USE altera_mf.all;

    ENTITY filtr_fir_ram IS
       PORT( clk                             :   IN    std_logic;
             clk_enable                      :   IN    std_logic;
             reset                           :   IN    std_logic;
             address      : IN STD_LOGIC_VECTOR (4 DOWNTO 0);
             );

    END filtr_fir_ram;

    ARCHITECTURE rtl1 OF filtr_fir_ram IS


    COMPONENT rom_we IS
       PORT
       (
          address      : IN STD_LOGIC_VECTOR (4 DOWNTO 0);
          clock      : IN STD_LOGIC  := '1';
          q      : OUT STD_LOGIC_VECTOR (27 DOWNTO 0)
       );
    END COMPONENT;

    COMPONENT ram_wy IS
       PORT
       (
          address      : IN STD_LOGIC_VECTOR (4 DOWNTO 0);
          clock      : IN STD_LOGIC  := '1';
          data      : IN STD_LOGIC_VECTOR (43 DOWNTO 0);
          wren      : IN STD_LOGIC ;
          q      : OUT STD_LOGIC_VECTOR (43 DOWNTO 0)
       );
    END COMPONENT;

    SIGNAL data_in   : std_logic_vector(27 downto 0);
    SIGNAL data_out   : std_logic_vector(43 downto 0);
    SIGNAL data_ram_out   : std_logic_vector(43 downto 0);
    SIGNAL ena   : std_logic :='1';



    BEGIN

    rom_we1: rom_we port map(address, clk, data_in);

    data_out(27 downto 0) <= data_in;
    data_out(43 downto 28) <= "0000000000000000"; --slowa ROMu i RAMu nie sa takie same, wiec stad dopisanie 0
    ram_wy1: ram_wy port map(address, clk, data_out, ena, data_ram_out);


    END rtl1;


    Co jest źle? Znaczy pewnie tak, tylko co? ;)
  • Poziom 27  
    po pierwsze:
    Cytat:
    address : IN STD_LOGIC_VECTOR (4 DOWNTO 0);
    );

    generuje blad kompilacji, niepotrzebny srednik;
    2.
    Cytat:

    Po wpisaniu jakiejś wartości do ROM i wybraniu Read Data from In-System Memory
    zmienia wartości całej pamięci na 0/.../

    tego nie jestem w stanie sprawdzic bez hardware, ale moze cos sie wyjasni,
    jak poprawisz bledy;
    3.
    Cytat:
    Podłączyłem sygnał zegarowy clk do odpowiedniego pinu
    (nie wiem czy słusznie, ale próbowałem też bez)

    bez zegara sie nie da, podobnie jak procesorek nic nie zrobi
    bez zegara;
    mam nadzieje, ze przypisales 'clk' do pinu, ktory podlaczony
    jest na plytce do jakiegos oscylatora;
    address : IN STD_LOGIC_VECTOR (4 DOWNTO 0)
    to nie powinny byc piny fpga, to musi byc wewnetrzny licznik
    inkrementowany zegarem clk;
    u ciebie najprawdopodobniej linie address 'wisza' w powietrzu,
    wiec pamieci nie sa adresowane;
    zwroc uwage na to, ze jesli podasz na rom adres 'X', to dana spod
    tego adresu pojawi sie na wyjsciu rom po 1 lub 2 taktach zegarowych,
    zaleznie od tego, jak ustawiles opcje w megawizard;
    jesli polaczysz adres do obu pamieci ten sam, to dana romu z adresu '0'
    wpisze sie do ramu pod adres 1 lub 2;

    dla rom powinienes wygenerowac jakis 'memory initialization file' *.mif
    za pierwszym razem mozesz to zrobic tak: [quartus]
    file -> new -> memory files;
    kompilator oczywiscie musi wiedziec, jakiego pliku ma uzyc,
    mozesz to wskazac otwierajac wygenerowany plik z rom-em i zmieniajac
    linijke z: 'init_file => "*.mif",

    zanim zaczniesz operacje na sprzecie, zobacz co sie dzieje
    na symulatorze, tak bedzie szybciej;
    JA
  • Poziom 9  
    Wielkie dzięki. Już mi wszystko działa (znaczy zapis z ROM do RAM). Ale teraz dorzucenie filtru to już bułka z masłem.
    Chciałbym jeszcze zapytać o te skrypty tcl. W jaki sposób one działają, jak się jej wywołuje i tworzy? Cały czas chodzi mi o automatyczne wrzucanie danych i odczytywanie z/do Matlaba.
  • Poziom 27  
    quartus ii handbook i rozdzial "tcl scripting";
    jakkolwiek nie jest to bardzo skomplikowane, to jednak trudno wszystko
    opisac w kilkuzdaniowej notce;
    jestem tez pewien, ze na stronie altery [support/examples] znajdziesz sporo
    przykladow skryptow;
    J.A
  • Poziom 9  
    Ostatnio miałem trochę czasu i spróbowałem pobawić się tymi skryptami tcl. Znalazłem listę komend odpowiedzialnych za obsługę In-system Memory Content Editora, jednakże próbując je uruchomić z wiersza poleceń za każdym razem wyskakuje błąd - ERROR - A memory edit sequence has not been started.

    Robię to tak:
    Code:
    quartus_stp --tcl_eval begin_memory_edit -hardware_name "USB-Blaster \[USB-0\]" -device_name "@1: EP3C25 (0x020F30DD)"

    I jest wszystko ok.
    A następnie próbuje na przykład zakończyć edytowanie pamięci poprzez:
    Code:
    quartus_stp --tcl_eval end_memory_edit

    No i wtedy wyskakuje wspomniany błąd. Popatrzyłem jak robi to In-system Memory Content Editor i robi dokładnie tak samo, więc nie wiem w czym tkwi błąd.
    Będę wdzięczny za pomoc.

    edit
    Aha, może jeszcze wpomnę, iż płytkę zaprogramowałem używając Programmera.
  • Poziom 27  
    nie czuje sie ekspertem od tcl;
    moze interpreter altery jest nadgorliwy i rozpoznaje brak takiej linii:
    update_content_to_memory_from_file -instance_index 0 -mem_file_type "mif" <ev. "hex"> -mem_file_path <file_name>
    czyli brak jakiejkolwiek 'aktywnosci' na pamieci;
    JA
  • Poziom 9  
    Myślę, że nie o to chodzi, bo po pierwsze sam In-system Memory Content Editor też tak robi, a po drugie ten błąd wyskakuje, po wpisaniu dowolnej komendy (oczywiście dotyczącej tego edytora).