Forum: FPGA, VHDL & Co. Generischer MUX?


von Martin (Gast)


Angehängte Dateien:

Lesenswert?

Hallo an alle,

ich möchte einen generischen Multiplexer implementieren.
Der Eingang ist ein N*32 breiter Vektor. Mittels eines Multiplexers kann 
nun das m-te 32 Bit Wort aus diesem Vektor selektiert werden.

Um das besser darzustellen habe ich ein Bild angehängt, bei dem der 
Eingangsvektor 128-bit breit ist.
Die Steuerleitung ist log2(N) breit.

Wie kann ich diese Schaltung in VHDL generisch für N>=1 
implementieren?

lg Martin

von VHDL hotline (Gast)


Lesenswert?

1
out(31 downto 0) <= in((to_integer(m)+1)*32 - 1 downto (to_integer(m)+1)*32 -32)

von Martin (Gast)


Lesenswert?

VHDL hotline schrieb im Beitrag #4015212:
> out(31 downto 0) <= in((to_integer(m)+1)*32 - 1 downto
> (to_integer(m)+1)*32 -32)

Leider sind solche Konstrukte in Vivado nicht synthetisierbar, da beide 
Ranges dynamisch sind. Siehe dazu [1]. Wie kann man solche vermeiden?

Danke & lg
Martin

[1] http://www.xilinx.com/support/answers/52302.html

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


Lesenswert?

Martin schrieb:
> Der Eingang ist ein N*32 breiter Vektor. Mittels eines Multiplexers
> kann nun das m-te 32 Bit Wort aus diesem Vektor selektiert werden.
> Um das besser darzustellen habe ich ein Bild angehängt, bei dem der
> Eingangsvektor 128-bit breit ist.
Mir kommt die Anwendung etwas eigenartig vor, aber wenns unbedingt sein 
muss...

> Die Steuerleitung ist log2(N) breit.
Das ist eine Kommazahl, das ist dir klar?
Also musst müsstest du erst mal passend runden:
http://www.lothar-miller.de/s9y/archives/72-Breite-eines-Vektors-berechnen-log2.html

> Wie kann man solche vermeiden?
Mit einer Schleife?
1
  process (m, input) begin
2
    for i in 0 to 31 loop
3
      output(i) <= input(i + m*32); 
4
    end loop;
5
  end process;

: Bearbeitet durch Moderator
von Martin (Gast)


Lesenswert?

Hallo Lothar,

Danke für die Antwort.

Lothar Miller schrieb:
> Martin schrieb:
>> Der Eingang ist ein N*32 breiter Vektor. Mittels eines Multiplexers
>> kann nun das m-te 32 Bit Wort aus diesem Vektor selektiert werden.
>> Um das besser darzustellen habe ich ein Bild angehängt, bei dem der
>> Eingangsvektor 128-bit breit ist.
> Mir kommt die Anwendung etwas eigenartig vor, aber wenns unbedingt sein
> muss...

Das Anwendungsgebiet ist relativ einfach erklärt.
Ein Algorithmus arbeitet auf Blöcken (die sind N*32-bit breit). Das 
Dateninterface ist jedoch nur 32-bit breit. Irgendwie müssen die Daten 
nun serialisiert werden. Die generische Implementierung deshalb, um 
verschiedene Algorithmen einfach austauschen zu können.

Wie würdest du sowas realisiseren?

Lothar Miller schrieb:
> Das ist eine Kommazahl, das ist dir klar?

Das ist klar. Die wird schon entsprechend generiert.

Lothar Miller schrieb:
>> Wie kann man solche vermeiden?
> Mit einer Schleife?  process (m, input) begin
>     for i in 0 to 31 loop
>       output(i) <= input(i + m*32);
>     end loop;
>   end process;

Danke, funktioniert!

lg Martin

von VHDL hotline (Gast)


Lesenswert?

Martin schrieb:
> Wie würdest du sowas realisiseren?

Schieberegister.

von Martin (Gast)


Lesenswert?

VHDL hotline schrieb im Beitrag #4015297:
> Martin schrieb:
>> Wie würdest du sowas realisiseren?
>
> Schieberegister.

Funktioniert nicht. Da möglicherweise die unteren Blöcke ungültig sind.

von VHDL hotline (Gast)


Lesenswert?

Martin schrieb:
> Funktioniert nicht. Da möglicherweise die unteren Blöcke ungültig sind.

Dann nimm halt nur die oberen, zwingt dich ja keiner den Gesamtblock 
komplett durchzuschieben.

von Duke Scarring (Gast)


Lesenswert?

Martin schrieb:
> Irgendwie müssen die Daten
> nun serialisiert werden. Die generische Implementierung deshalb, um
> verschiedene Algorithmen einfach austauschen zu können.
So oder so bräuchtest Du noch eine Signalisierung, die Dir angibt, wann 
die Daten gültig sind.

Duke

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.