Datum: 13.05.2008 18:27
Hallo habe ein mehr oder weniger großes Verständnisproblem. Habe einen Filter in dem sich multiplizierer und addierer befinden. alle componenten werden ohne clock angesteuert. nun will ich aber pipelinen und brauche die clk in den componenten. wenn ich nun den multiplizierer mit einer clk versehe, kommen falsche werte bei der simulation raus. hat einer ne idee woran es liegen kann? bin für jeden tipp dankbar.
Datum: 13.05.2008 20:35
Es gibt verschiedene Style/Coding-Guidelines, die sequentielle von kombinatorischer Logik trennen. Register/Memory ist sequentiell, Verknüpfungen (ohne Rückkopplung) kombinatorisch (wie ja auch Bool. Operationen,Addition, etc.). Soweit ist Deine Komponente also wohl kombinatorischer Natur. Ich gehe mal davon aus, dass Du eigentich streamen statt pipelinen möchtest, sonst müsstest Du ja die Komponente in Teilschritte zerlegen. Du hast also eine Aufgabe wie z.B. r[i] = F(a[i] ,b[i],..) oder dergleichen. Also muss Deine sequentielle Logik z.B. zu jeder Taktflanke die Indices der Parameter berechnen und Deine Komponente mit den Signalen a[i],b[i],.. "versorgen" während die Komponente selbst den r[i]-Wert berechnet:
signal index_reg : integer := 0; signal index_next: integer := 0; signal a: what_ever_array_type := {4711,4712,4713,..}; signal b: what_ever_array_type := {0815,0816,0817,..}; signal r: what_ever_array_type; signal r_next: what_ever_type; signal a_in : what_ever_type; signal b_in : what_ever_type; signal r_out: what_ever_type; inst__dein_filter:deine_filter port map ( a <= a_in, b <= b_in, r <= r_out ); process(CLK , nRESET) begin if rising_edge(CLK) then count_reg <= count_next; r[count_reg] <= r_next; end if; end process; count_next <= count_reg + 1 when count_reg /= STREAM_WIDTH-1 else 0; finish_flag <= '0' when count_reg /= STREAM_WIDTH-1 else '1'; a_in <= a[count_reg]; b_in <= b[count_reg]; r_next <= r_out; |
Zu jeder pos.Taktflanke werden also die Indices für die Parameter berechnet, dann wird in der kombinatorischen Logik entsprechend den neuen Parametern r_next berechnet, was sich bis zur nächsten Taktflanke stabilisieren sollte (=>max Frequenz) und dort dann das Ergebnis der Filterung im r-Array abgelegt wird.
Datum: 13.05.2008 21:55
Danke für deine Mühe doch zuerst mal ist nicht der Filter die Comp, sondern die Addierer und Multis des Filters. Ist auch eigentlich egal. Nein ich möchte wirklich Pipelinen. Adder wird zerlegt und mit Registern versorgt. Habe herausgefunden, dass ich irgendwo ein verzögerungsglied zuviel bzw. zu wenig drin habe. man man eine sch...arbeit trotzdem herzlichsten dank
Datum: 13.05.2008 22:04
Dann ist Deine Aufgabe aber mit der des Streamens vergleichbar. Statt Register-Arrays werden dann die Register zwischen den Pipelinestufen verwendet, die Logik muss dann nur die entsprechenden Register "aktivieren",z.B. über Multiplexer. Mein Code sollte ja nur die Idee verdeutlichen, trotzdem noch viel Spass (oder viel Mühe??)
Antwort schreiben
Die Angabe einer Email-Adresse ist freiwillig. Wenn Sie automatisch per Email über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.
Wichtige Regeln - erst lesen, dann posten!
- Suchfunktion und Betreffsuche benutzen - vielleicht gibt es schon einen ähnlichen Beitrag
- Aussagekräftigen Betreff wählen
- Im Betreff angeben um welchen Controllertyp es geht (AVR, PIC, ...)
- Groß- und Kleinschreibung verwenden
- Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang
- JPEG-Dateien (.jpg) nur für Fotos und Scans verwenden
- Schaltpläne, Screenshots usw. als PNG oder GIF anhängen
Formatierung (mehr Informationen...)
- [c]C-Code[/c]
- [avrasm]AVR-Assembler-Code[/avrasm]
- [vhdl]VHDL-Code[/vhdl]
- [pre]vorformatierter Text (z.B. Code in anderen Sprachen)[/pre]
- [math]Formel in LaTeX-Syntax[/math]
- [[Titel]] - Link zu Artikel


