Forum: FPGA, VHDL & Co. Componente mit CLK und OHNE CLK


von Tilo (Gast)


Lesenswert?

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.

von Jörg (Gast)


Lesenswert?

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:
1
signal index_reg : integer := 0;
2
signal index_next: integer := 0;
3
4
signal a: what_ever_array_type := {4711,4712,4713,..};
5
signal b: what_ever_array_type := {0815,0816,0817,..};
6
signal r: what_ever_array_type;
7
signal r_next: what_ever_type;
8
9
signal a_in : what_ever_type;
10
signal b_in : what_ever_type;
11
signal r_out: what_ever_type;
12
13
inst__dein_filter:deine_filter
14
  port map
15
  (
16
    a <= a_in,
17
    b <= b_in,
18
    r <= r_out
19
  );
20
21
process(CLK , nRESET)
22
begin
23
  if rising_edge(CLK) then
24
    count_reg <= count_next;
25
    r[count_reg] <= r_next;
26
  end if;
27
end process;
28
29
count_next  <= count_reg + 1 when count_reg /= STREAM_WIDTH-1 else 0;
30
finish_flag <= '0' when count_reg /= STREAM_WIDTH-1 else '1';
31
32
a_in   <= a[count_reg];
33
b_in   <= b[count_reg];
34
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.

von Tilo (Gast)


Lesenswert?

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

von Jörg (Gast)


Lesenswert?

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??)

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
Noch kein Account? Hier anmelden.