Forum: FPGA, VHDL & Co. component stufenweise (Takt bei Takt) aufrufen


von vendi (Gast)


Lesenswert?

Hallo Leute,

Ich hab in einem VHDL-Modul eine Komponente(pipeline aufgebaut) 
einbinde. Und in diesem Modul wird diese Komponent vielmalig aufrufen. 
Ich möchte z.B am ersten Takt diese Komponent aufrufen,und am nächsten 
Takt wieder aufrufen(neue Daten rein),so schreib ich wie folgend:

COMPO: COMPONENT_PIPELINE

       PORT MAP(CLK,
                X1_TO_CO,X2_TO_CO,
                X1_OUT_CO,X2_OUT_CO );

PROCESS1:process(CLK,ENABLE)
         begin
         if CLK'EVENT and CLK = '1' then
            if ENABLE = '1' then
              -- 1.Takt
              X1_TO_CO <= E_RE_REG(k)(3);
              X2_TO_CO <= E_RE_REG(k)(0);
              -- 2.Takt
              X1_TO_CO <= E_RE_REG(k-2)(3);
              X2_TO_CO <= E_RE_REG(k-2)(1);
            end if;
         end if;
         end process;

Aber ich finde dass die alle Daten gleichzeitig getaktet wurden. so kann 
mir jemand helfen um diese Problem zu lösen?
Also am 1.Takt  X1_TO_CO <= E_RE_REG(k)(3);
                X2_TO_CO <= E_RE_REG(k)(0);

     am 2.Takt  X1_TO_CO <= E_RE_REG(k-2)(3);
                X2_TO_CO <= E_RE_REG(k-2)(1);

Danke euch im voraus!!

von conan (Gast)


Lesenswert?

ich versteh noch nicht genau was das soll aber vllt. so

Das Signal  X1_TO_CO und X2_TO_CO über einen Multiplexer steuern. Das 
select Signal mit jeder Taktflanke toggeln

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

vendi schrieb:
1
    if CLK'EVENT and CLK = '1' then
2
        if ENABLE = '1' then
3
            -- 1.Takt                      <---  Das ist der gleiche Takt ...
4
            X1_TO_CO <= E_RE_REG(k)(3);
5
            X2_TO_CO <= E_RE_REG(k)(0);
6
            -- 2.Takt                      <---  ... wie der hier.
7
            X1_TO_CO <= E_RE_REG(k-2)(3);  <--- Achtung: die letzte Zuweisung an ein Signal im Prozess gewinnt
8
            X2_TO_CO <= E_RE_REG(k-2)(1);
9
        end if;
10
    end if;
Du hast hier erst mal das Problem, dass der Synthesizer Kommentare nicht 
auswertet. Deshalb ist es ihm schnurzegal, wenn du da 1. Takt und 2. 
Takt hinschreibst.

Das zweite Problem ist, dass in einem Prozess die letzte Zuweisung an 
ein Signal gewinnt. Weil hier hintereinander verschiedene Werte an 
X1_TO_CO zugewiesen werde, gewinnt dei die letzte Zuweisung.

Es wurde schon erwähnt, was du brauchst: einen Multiplexer. Und dann 
vermutlich noch einen Zähler, der mitzählt, in welchem Zyklus du bist. 
Allerdings habe ich wegen dieser Beschreibung noch sehr grundlegende 
Bedenken, dass du nicht weißt, was du tust:
vendi schrieb:
> Ich möchte z.B am ersten Takt diese Komponent aufrufen,und am nächsten
> Takt wieder aufrufen(neue Daten rein)
Ein Komponente wird nicht "aufgerufen", eine Komponente ist IMMER da. 
Sie kann nur evtl. gerade inaktiv oder aktiv sein. Du hast offenbar noch 
eine sehr softwareorientierte Denkweise, das geht auf der Hardware 
schief.

Schreib also besser mal, WAS du machen willst und WOFÜR du diese 
verketteten Komponenten verwenden willst...

von vendi (Gast)


Lesenswert?

Hallo Lothar,
Danke dir.

Meine Komponente(COMPONENT_PIPELINE) hat eine Pipeline Struktur, und sie 
braucht 10 Takte.E_RE_REG ist beispielsweise eine 4X4 Matrix.Am ersten 
Takt möchte ich die 2 Elemente ( E_RE_REG(k)(3), E_RE_REG(k)(0))in k-ter 
Zeile, und am zweiten Takt die 2 Elemente ( 
E_RE_REG(k-2)(3),E_RE_REG(k-2)(1)) in (k-2)-ter Zeile in diese 
Komponente eingeben, so werden diese Elemente durch die Komponente 
berechnet,also die Berechnung für k-te Zeile fängt am ersten Takt an und 
für (k-2)-te Zeile am zweiten Takt, sie brauchen jeweils 10Takte.So am 
10ten und 11ten Takt werden die Ergebnisse für die beide Zeile (k-te und 
(k-2)-te Zeile) hintereinander bekommt und wieder in dieser zwei Zeile 
gespeichert.
Kann mir noch mal helfen?

Danke sehr!!

Gruß!

von Duke Scarring (Gast)


Lesenswert?

vendi schrieb:
> Meine Komponente(COMPONENT_PIPELINE) hat eine Pipeline Struktur, und sie
> braucht 10 Takte.E_RE_REG ist beispielsweise eine 4X4 Matrix.Am ersten
> Takt möchte ich die 2 Elemente ( E_RE_REG(k)(3), E_RE_REG(k)(0))in k-ter
> Zeile,
So oder so empfiehlt sich eine State-Machine.
Was mir aber noch nicht ganz klar ist: Du startest die Komponente mit 2 
Werten. Jetzt dauert es zehn Takte bis das Ergebnis rauskommt. So weit 
ok, aber: Kannst Du im zweiten Takt schon die nächsten zwei Werte 
anlegen, oder musst Du erst 10 Takte warten und das Ergebnis 
wegspeichern?

Duke

von Peter (Gast)


Lesenswert?

Hallo vendi,

Ich empfehle dir dich mit den Grundlagen der digitalen Schaltungstechnik 
auseinander zusetzen. Dann kannst du formulieren was für eine Art von 
Schaltung du in VHDL beschreiben möchtest.

von vendi (Gast)


Lesenswert?

Duke Scarring schrieb:
> So oder so empfiehlt sich eine State-Machine.
Danke Duke, ich hatte eine State-Machine schon bearbeitet,aber es 
benötigt zu viele zustände,und kostet zu viel Zeit,so wird nicht 
bevorzugt.
> Was mir aber noch nicht ganz klar ist: Du startest die Komponente mit 2
> Werten. Jetzt dauert es zehn Takte bis das Ergebnis rauskommt. So weit
> ok, aber: Kannst Du im zweiten Takt schon die nächsten zwei Werte
> anlegen, oder musst Du erst 10 Takte warten und das Ergebnis
> wegspeichern?
Also ich kann im zweiten Takt schon die nächsten zwei Werte anlegen.So 
können die alle Werte parallel bearbeitet werden.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

vendi schrieb:
> Danke Duke, ich hatte eine State-Machine schon bearbeitet,aber es
> benötigt zu viele zustände,und kostet zu viel Zeit,so wird nicht
> bevorzugt.
Egal, wie du das Kind nennen wirst, es wird eine Statemachine sein.
Denn wenn du den Index nicht einfach berechnen kannst, dann mußt du das 
Ganze manuell abarbeiten. Natürlich könntest du auch eine Tabelle mit 
dem Index aufbauen...

Übrigens: wie laufen diese Indices weiter? Oder war das schon alles?

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.