logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[VHDL] Filtr FIR i współczynniki odpowiedzi impulsowej

Genos182 04 Lip 2006 23:54 4890 15
REKLAMA
  • #1 2791681
    Genos182
    Poziom 13  
    Posty: 65
    Pomógł: 5
    Ocena: 4
    Witam,

    Chcialem napisać filtr FIR w VHDLu. Mam ogólną koncepcję jak to zrobić, jednak pojawił się problem współczynników odpowiedzi impulsowej. Nie jestem doświadczony w VHDLu, więc nie za bardzo wiem jak to zrobić. Sygnał wejściowy to próbki założmy 8mio bitowe, które poźniej bedzie trzeba przemnażać przez współczynniki. Owe współczynniki nie są liczbami całkowitymi, lecz ułamkami i za bardzo nie wiem jak mogą być reprezentowane w programie, tak aby kod był poprawny i syntezowalny.
    Jakby ktoś mogł mi podpowiedzieć coś w tej kwestii byłbym bardzo wdzięczny:)

    Genos182
  • REKLAMA
  • #2 2795399
    Zaquadnik
    Poziom 27  
    Posty: 998
    Pomógł: 103
    Ocena: 25
    Musiałbyś zastosować jeden ze standardów zapisu liczby ułamkowej. Może to być liczba zarówno stałoprzecinkowa, jak i zmiennoprzecinkowa. Stałoprzecinkową (na przykład 16-to bitową) zapisujesz jako 2^7 + 2^6 + 2^5 + 2^4 + 2^3 + 2^2 + 2^1 + 2^0, 2^-1 + 2^-2 + 2^-3 + 2^-4 + 2^-5 + 2^-6 + 2^-7 + 2^-8 (przykładowo, tutaj 8 starszych bitów jest częścią całkowitą, a młodszych - częścią ułamkową. Można zapisać to jako liczbę zmiennoprzecinkową w konwencji bit znaku, wykładnik (kilka bitów) i mantysa (kilkanaście bitów) długość części "wykładnikowej" zależy od tego jak duże liczby chcesz mieć. Wykładnik zapisujesz jako liczbę w kodzie U2 (no bo ujemne wykładniki się przydają ;) ). A mantysę zapisujesz normalnie, binarnie (bo bit znaku juz masz). Teraz tylko musisz zastanowić się nad układami arytmetycznymi ;)
    Pozdrawiam :)
  • #3 2796687
    Genos182
    Poziom 13  
    Posty: 65
    Pomógł: 5
    Ocena: 4
    Właśnie o te układy arytmetyki się boję najbardziej :wink: Póki co rozwiązałem to w ten sposób, że jeżeli mam współczynnik np. 0,324 to mnożę sygnał najpierw przez 324 a poźniej dzielę przez 1000 i wydaje się działać :) W ten sposób jest poźniej łatwiej nawet zmieniać wspólczynniki filtru, bo wpisuję sobie wartości dziesiętne jak leci do kodu, a nie muszę tego przeliczać na postać binarną.
  • REKLAMA
  • REKLAMA
  • #5 2860622
    Jacor
    Poziom 14  
    Posty: 114
    Pomógł: 3
    Ocena: 4
    Zależy na jakim układzie chcesz to zaimplementować i czy chodzi o cenny czas w pracy, czy robisz to dla nauki. Ja przy FIR korzystałem z gotowych megafunkcji Altery: mnożenia i dodawania itp., a całość implementowałem w Stratix II - FIR o 100 współczynnikach. Wszystkie megafunkcje są parametryzowane i za pomocą kreatora ustalasz tylko na jakich liczbach operujesz, gotowe moduły łączysz ze sobą i gotowe. Filtr był gotowy w 3 godziny.
  • REKLAMA
  • #6 2874745
    Genos182
    Poziom 13  
    Posty: 65
    Pomógł: 5
    Ocena: 4
    Witam,

    Filtr ten pisze raczej celem nauki niz jakiegos konknretnego zastosowania. Z tzw. core generatorow juz korzystalem, ale raczej chcialem sklecic cos swojego niz korzystac z tych automatow. Nie mam narazie zadnej plytki testowej, ale zastanawiam sie nad zakupem plytki Altiuma ktora gdzies na allegro widzialem, wydaje mi sie sensowna ale to jeszcze nie na moim poziomie zaawansowania. Filtr poki co dziala (narazie na symulacji :) ) i narazie jest 8mego rzedu. W sumie myslalem ze FIR 8mego rzedu bedzie juz dawal jakies efekty bo z tego co na razie widze to slabo filtruje i bede chyba musial zaaplikowac kolo 100ego rzedu.
  • #8 2888331
    Genos182
    Poziom 13  
    Posty: 65
    Pomógł: 5
    Ocena: 4
    Próbuję wykonać operację dzielenia:

    Suma := Suma / N;
    gdzie Suma i N sa zmiennymi typu integer. Oczywiscie symulacja działa ponieważ to działanie (dzielenie) jest w zestawie funkcji VHDL ale mam problem z syntezą dla układów Xilinxa. Dostaje następujący komunikat błedu:
    ERROR:Xst:769 - "E:/FPGA/filterek/Filtr/src/moj_fir_poprawiony.vhd" line 69: Operator <DIVIDE> must have constant operands or first operand must be power of 2

    jak mozna sie dowiedziec sprawdzajac ten nr błedu, operacja dzielenie ma pewne ograniczenia. Jak mozna wybrnać z powyzszej sytuacji, czy trzeba koniecznie napisac jakis bloczek realizujacy dzielenie?
  • #9 2892598
    sepher
    Poziom 19  
    Posty: 301
    Pomógł: 21
    Ocena: 4
    Ja próbowałbym przemnożyć wszystkie współczynniki przez liczbę na tyle dużą, żeby odpadła część ułamkowa współczynników. Liczbę tą dobrałbym tak, aby dało się ją przedstawić w postaci 2^n, gdzie n to jakaśtam wartość. Realizacja FIR byłaby standardowa, ale przy pomocy współczynników już przeskalowanych, a każdą próbkę odpowiedzi podzieliłbym przez 2^N (czyli wybrałbym tak naprawdę odpowiednią liczbę bardziej znaczących bitów z wyniku). Daje to możliwość skorzystania ze sprzętowych szybkich układów mnożących, a utrata precyzji związana z zaokrąglaniem części dziesiętnej nie powinna być duża.
  • #10 2929364
    Genos182
    Poziom 13  
    Posty: 65
    Pomógł: 5
    Ocena: 4
    Witam,

    męczę się już parę dni z pewnym problemem. Mianowicie, po implementacji dostaję pliki: time_sim.vhd oraz time_sim.sdf, następnie chcę przeprowadzić symulację czasową i nie mogę, bo wyskakują mi błędy podczas kompilacji pliku time_sim.vhd. oto kilka z nich:

    # Error: COMP96_0078: TIME_SIM.VHD : (18966, 7): Unknown identifier "LOC".
    # Error: COMP96_0078: TIME_SIM.VHD : (18967, 7): Unknown identifier "PATHPULSE".
    # Error: COMP96_0133: TIME_SIM.VHD : (18966, 7): Cannot find object declaration.
    # Error: COMP96_0112: TIME_SIM.VHD : (18966, 7): "LOC" does not match the formal name.
    # Error: COMP96_0078: TIME_SIM.VHD : (18975, 7): Unknown identifier "LOC".
    # Error: COMP96_0133: TIME_SIM.VHD : (18975, 7): Cannot find object declaration.

    Wygląda to tak jakby poszczególne komponenty z biblioteki SIMPRIM nie istniały, lecz ta biblioteka jest dołączona do tego pliku. Powiedzcie, co robię źle bo juz mi się skończyły wszelkie pomysły:)

    pozdrowienia,
    genos182
  • Pomocny post
    #11 2954499
    tony_tg
    Poziom 16  
    Posty: 140
    Pomógł: 13
    Ocena: 3
    Czesc,

    Te errory COMP96 to z Active-HDL'a? PATHPULSE jest generic'iem dla komponentow i wyglada na to, ze wersja SIMPRIMS ktorej uzywasz nie ma ich albo cala biblioteka nie jest widoczna. Zobacz czy masz skompilowana aktualna biblioteke SIMPRIMS. Jak nie to w instalacji Xilinx'a jest folder vhdl/src/simprims i tam sa zrodla do tej biblioteki. Przekompiluj ja sobie i ustaw jako globalna i upewnij sie ze symulator jej uzyje. Co to jest ten LOC? atrybut ktory pin jest zaalokowany dla portu?

    Pozdrawiam,
    Rafal
  • #12 2955121
    Genos182
    Poziom 13  
    Posty: 65
    Pomógł: 5
    Ocena: 4
    Witam,

    Miałeś rację z tą biblioteką. Po prostu trzeba było wgrać aktualne biblioteki Xilinxa do Active-HDL'a i sprawa się wyjaśniła. W starej bibliotece nie było pewnych komponentów i stąd ten błąd. Teraz cała symulacja fajnie działa:)

    Dzięki wielkie,
    genos182
  • #13 3452533
    mandrzej1
    Poziom 11  
    Posty: 41
    witam
    szukam jakiegos projektu... filt fir by mógł być nawet mogę komuś zapłacic jak mi go zrobi w quartusie i platformie altiuma
    gg 2958347
  • #14 3456609
    griva
    Poziom 17  
    Posty: 203
    Pomógł: 12
    Ocena: 1
    mandrzej1 napisał:
    witam
    szukam jakiegos projektu... filt fir by mógł być nawet mogę komuś zapłacic jak mi go zrobi w quartusie i platformie altiuma
    gg 2958347


    zainstaluj sobie nowego Matlaba, tam jest tool co sie zowie FDAtool - jest to GUI-owa wersja do generacji FIR-IIR ktorego chcesz rzedu z ajkimi chcesz wsp. z mozliwoscia generacji syntezowalnego kodu
  • #15 3475541
    mandrzej1
    Poziom 11  
    Posty: 41
    jak pokazac dzialanie filtru FIR na platformie altiuma, ona niema wejscia audio jak wysłac plik audio zeby bylo słychac ze obcina? przez usb mozna wyslac przepuscic przez filtr i spowrotem na kompa a da sie jakos w czasie rzeczywistym to włączyc? na przyklad układzie FT245BM firmy FTDI takie moduły USB sie robi ma ktos cos takiego zrobionego pod altiuma?

Podsumowanie tematu

✨ Dyskusja dotyczy implementacji filtru FIR w VHDL, ze szczególnym uwzględnieniem reprezentacji współczynników odpowiedzi impulsowej, które są liczbami ułamkowymi. Proponowane rozwiązania obejmują stosowanie liczb stałoprzecinkowych z podziałem na część całkowitą i ułamkową lub liczb zmiennoprzecinkowych z mantysą i wykładnikiem w kodzie U2. W praktyce sugerowano skalowanie współczynników przez mnożenie przez dużą liczbę będącą potęgą dwójki, co umożliwia efektywne wykorzystanie sprzętowych mnożarek i prostą implementację dzielenia przez przesunięcie bitowe. Autor stosował tymczasowe rozwiązanie mnożenia przez liczbę całkowitą i dzielenia przez stałą, co działało w symulacji, ale napotkał problemy z syntezą operacji dzielenia w narzędziach Xilinx, które wymagają stałych operandów lub potęg dwójki. Wskazano również na wykorzystanie gotowych megafunkcji Altery do szybkiej implementacji filtru FIR o dużej liczbie współczynników (np. 100) na układzie Stratix II. Problemy z symulacją czasową w Active-HDL rozwiązano przez aktualizację i rekompilację biblioteki SIMPRIMS Xilinxa. W dyskusji pojawiły się także pytania o sprzęt testowy, w tym płytkę Altium, oraz o metody przesyłania i przetwarzania sygnału audio w czasie rzeczywistym na platformie Altium z wykorzystaniem modułu USB FT245BM firmy FTDI. Wspomniano także o narzędziu FDAtool w Matlabie do generacji syntezowalnego kodu filtrów FIR/IIR.
Wygenerowane przez model językowy.
REKLAMA