Hallo, ich muss einen sinc^k dezimierungsfilter in vhdl schreiben. Ich versuche mich zu diesem Filter "einzulesen", leider finde ich keine ausreichenden Informationen zum Filter. Kennt Ihr vielleicht eine Homepage oder ein Buch, wo das ganz gut erklärt ist. Danke
:
Bearbeitet durch User
Hallo, schade, dass sich bisher keiner gemeldet hat.. :d... also ich bin heute während meiner suche auf den aufbau eines sinc^3 fitlers gestoßen.. 3 summierer, 1 down sampler (d-latch) und 3 differenzierer. ich weiß leider nicht wie ich das in vhdl umsetzen kann, bin in vhdl nur soweit, dass ich einzelne latches, flipflops, de/encoder und multiplexer schreiben kann. kann mir jemand eventuell bezüglich der umsetzung helfen, danke.
Schreibs erstmal als Modell in einer beliebigen "normalen" Sprache (C, Perl, Matlab, ...). Brauchst du nachher ohnehin, um Testvektoren zu erzeugen ;)
Das ist wirklich alles, was du nach einigen Recherchen gefunden hast? Also ich bin mir ziemlich sicher, dass du das auch durch ausprobieren herausgefunden hättest... Noch dazu, dass das Modell weder effizient rechnet, noch besonders komfortabel ist. Schlimmer: Wenn du bei deinem geposteten Bild nicht weißt wieso das in etwa das tut, was es soll, solltest du lieber die Finger von FPGAs lassen...
:
Bearbeitet durch User
Dieses Filter wird auch als CIC-Filter bezeichnet. Wenn Du in Wikipedia unter diesem Begriff suchst, findest Du eine Literaturstelle auf das Originalpaper von Hogenauer (Erfinder dieses Filters). Auf der ersten Seite von Google habe ich folgenden Link gefunden: http://www.embedded.com/design/configurable-systems/4006446/Understanding-cascaded-integrator-comb-filters Beim CIC handelt des sich um mehrere hintereinander geschaltete Filter mit einer Rechteck-Impulsantwort. Die Länge der Impulsantwort in Abtastwerten entspricht dem Dezimationsfaktor des Filters. Zur Realisierung einer Rechteck-Impulsantwort kann ein Integration mit einer anschließenden Differenzwertbildung verwendet werden. Werden mehrere Stufen dieser Rechteckfilter hintereinander geschaltet, können wegen der LTI-Eigenschaft die Reihenfolge der einzelnen Blöcke vertauscht werden. So kommen alle Integrierer nach vorne und alle Differenzierer nach hinten. Das in meinen Augen schwierigste beim CIC-Filter ist die Dimensionierung der Wortbreiten der einzelnen Stufen. Je nach Stufenanzahl und Dezimationsfaktor können hohe Wortbreiten auftauchen. Das ist ein komplexes Thema und je nach Anforderung (Eingangswortbreite, Stufenanzahl, Dezimationsfaktor, gewünschte Genauigkeit) kann es aufwendig werden. Vielleicht hilft Dir ja ein IP-Block? Markus
Hallo, ich beschäftige mich derzeit mit diesem Thema und hatte vorher nichts mit FPGA´s zutun. Habe nur einiges in VHDL geschrieben und auf Modelsim angesehen, ob es so reagiert, wie ich es mir vorgestellt habe. Ich will nicht das "gesamte" Sprektrum anlernen, was man mit FPGA´s so anstellen kann. Bei meiner Aufgabenstellung muss ich "nur" einen sinc^n Filter (in meinem Fall ein sinc^3) in VHDL realisieren. Ob diese Schaltung super ist oder total schlecht (@marcusaw) ist so gesehen sch... egal. @georga: ich weiß nicht was das mit den "testvektoren" sein soll. @marcusaw: keine ahnung was ich dazu sagen soll.. @MJF (Gast): als "Gast" hast du mir bisher die informatifste Antwort gegeben, danke, ich lese mich da mal durch ----- Ich war nun soweit, dass ich folgenden VHDL Code zu der bereits angegebenen Schaltung realisieren konnte. Ist das im Bezug auf die Schaltung ok? danke Dezimierungsrate 64.. 3. Ordnung ----- library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; entity sinc3 is port(RESN, MDAT, MCLK, MCLKM : in std_logic; CN5 : out std_logic_vector(19 downto 0)); end sinc3; architecture behav of sinc3 is signal DN0, DN1, DN3, DN5 : std_logic_vector(19 downto 0); signal CN0, CN1, CN2, CN3, CN4 : std_logic_vector(19 downto 0); begin process(RESN, MCLK) begin if RESN = '0' then CN0 <= (others => '0'); CN1 <= (others => '0'); CN2 <= (others => '0'); elsif MCLK'event and MCLK = '1' then if MDAT = '1' then CN0 <= CN0 + 1; CN1 <= CN1 + CN0; CN2 <= CN2 + CN1; end if; end if; end process; process(RESN, MCLKM) begin if RESN = '0' then DN0 <= (others => '0'); DN1 <= (others => '0'); DN3 <= (others => '0'); DN5 <= (others => '0'); elsif MCLKM'event and MCLKM = '1' then DN0 <= CN2; DN1 <= DN0; DN3 <= CN3; DN5 <= CN4; end if; end process; CN3 <= DN0 - DN1; CN4 <= CN3 - DN3; CN5 <= CN4 - DN5; end behav;
:
Bearbeitet durch User
> ich weiß nicht was das mit den "testvektoren" sein soll. Du willst/musst doch deinen Code irgendwie simulieren, um festzustellen, ob er auch das Richtige tut. Also musst du Eingangsdaten erzeugen und auch "korrekte" Ausgangsdaten zum Vergleich mit dem VHDL-Output. Zum besseren Verständnis des Algorithmus (und evtl. Anforderungen bzgl. Rechengenauigkeit) ist es meistens auch besser/schneller, das erstmal "normal" zu programmieren.
Hallo, also testen tue ich das ganze immer mit Modelsim. Da kann man den Eingängen Werte zuordnen und sehen, was dann passiert. Also ich mache das immer so und das geht dann auch ganz zügig mit dem VHDL Code. Danke
> also testen tue ich das ganze immer mit Modelsim. Da kann man den > Eingängen Werte zuordnen und sehen, was dann passiert. Klar musst du mit irgendwas simulieren. Modelsim, ghdl, etc. Aber WOHER kommen denn die Eingangswerte bei so DSP-Kram? Das ist ja dann schon etwas mehr als nur mal ein paar Statemachines triggern. Vergleichst du die potentiell Abermillionen von Ausgangswerten im Waveform-Viewer?
@georga: ja, du hast recht. scheint nur bei einfachen dingen zu funktionieren mit modelsim usw. ich will meinen sinc filter in quartus auf einem fpga laden und über signaltap die sprungantwort sehen. ich weiß leider nicht, wie man das in quartus anstellt. gibt es da eventuell ein tutorial zu, wie man vhdl code einbindet.. danke
Hallo, also ich bin nun soweit angekommen, dass ich meine VHDL Datei in Quartus korrekt einbinden konnte. Normalerweise müsste ich laut einem gefundenen Tutorial jetzt die Pinbelegung machen und mit einem Funktionsgenerator Signale an den Eingang legen und schauen was so am Ausgang passiert. Ich möchte aber einen 8 Bit an den Eingang legen (00001111) und im Signal Tap sehen, was passiert, also ohne Pin Belegung und Funktionsgenerator. Wie kann ich das realisieren? Also wie bringe ich das zustande, dass ich ein clk, clk/M (Dezimierungsrate), Mdat und resn an den Eingang lege und im Signal Tap das Ergebis sehe..? Ich wäre sehr dankbar für eine hilfreiche Antwort.
:
Bearbeitet durch User
Also den MCLK habe ich. Ich nehme einfach den clk von dem FPGA, also verbinde ich da einfach den Pin im Pin Planer. Kann mir bitte jemand helfen, wie ich die anderen Inputs hinkriege und es dann im Signal Tap darstelle?? (MCLKM (MCLK / 64), MDAT (00001111), RESN) Danke
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.