Forum: FPGA, VHDL & Co. Multiplexer VHDL code vereinfachen


von Mark W. (kram) Benutzerseite


Lesenswert?

Hallo,

wie koennte ich folgenden VHDL code verkuerzt schreiben?
Das Ganze soll ein 96zu1 Multiplexer mal werden.
1
with S select
2
Y <=   E(0) when "0000000",
3
E(1) when "0000001",
4
...
5
E(96) when "1100000"

Und gleich noch die Frage nach der Testbench. Koennte ich da eleganter 
Weise auch diese in kuerzerer Form schreiben?
1
E1 <=   "0000...96Nullen...0000",  
2
"0000...95Nullen...0001" after 480ns,
3
usw...
4
5
S1 <=   "0000000", 
6
"0000001" after 5ns,
7
usw...

Ich habe mir zur Grundlage den 4X1 Multiplexer aus dem 
Reichardt-Schwarz-Buch gemacht. Die Funktionsweise ist mir klar, ich 
habe das Beispiel auch schon erweitert und getestet.
Aber nun wollte ich 96 parallele Eignagssignale serialisieren und da 
komme ich mit dieser Schreibweise nicht weiter. Das wird eifach zu viel 
und ich bekomme eine Knoten im Kopf. Selbst mit copy+paste ist das 
muehsame Tipparbeit, selbst wenn die Funktion klar ist.

Und hier noch der VHDL code fuer den 4X1 Multiplexer.
1
library IEEE;
2
3
use IEEE.std_logic_1164.all;
4
5
entity MUX4X1 is
6
7
  port(  S : in bit_vector(1 downto 0);
8
        E : in bit_vector(3 downto 0);
9
        Y : out bit);
10
11
end mux4x1;
12
13
architecture behavior of MUX4X1 is
14
15
begin
16
17
  with S select
18
  Y <=   E(0) when "00",
19
      E(1) when "01",
20
      E(2) when "10",
21
      E(3) when "11";
22
      
23
end behavior;


Gruss,
Mark

von Achim S. (Gast)


Lesenswert?

Mark W. schrieb:
> Aber nun wollte ich 96 parallele Eignagssignale serialisieren und da
> komme ich mit dieser Schreibweise nicht weiter.

das machst du besser und einfacher über ein Schieberegister als über 
einen MUX:
- zu einem bestimmten Zeitpunkt (immer nach 96 Takten) werden die 96 
parallelen Eingangsdaten in einen internes Signal übertragen.
- Das niederwertigste Element dieses internen Signals wird jeweils nach 
y ausgegeben.
- In jedem Takt werden alle Elemente des Signals um eine Stelle nach 
rechts geschoben.

von Christoph Z. (christophz)


Lesenswert?

Mark W. schrieb:
> wie koennte ich folgenden VHDL code verkuerzt schreiben?
1
use ieee.numeric_std.all;
2
...
3
Y <= E(to_integer(unsigned(S));

Mark W. schrieb:
> Und gleich noch die Frage nach der Testbench. Koennte ich da eleganter
> Weise auch diese in kuerzerer Form schreiben?

Ich würde in der Testbench einen Zähler bauen oder das Zufallszahl 
Package von synthworks.com einbinden.

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


Lesenswert?

Mark W. schrieb:
> Aber nun wollte ich 96 parallele Eignagssignale serialisieren und da
> komme ich mit dieser Schreibweise nicht weiter.
Man darf da gerne mal bei uCs spicken, wie die das machen. Und wo werden 
da parallele Daten seriell ausgegeben? Z.B. bei der RS232 Schnitte oder 
beim SPI. Und wie wird das gemacht? Mit einem Schieberegister.

Und diese Lösung ist tatsächlich wesentlich einfacher und schneller als 
so ein 96:1 Monstermegamultiplexer...

Sieh dir mal die SPI-Schnitte da an, da könntest du bei Laenge einfach 
96 reinschreiben und fertig ist der 96:1 Parallel-Seriell Wandler ;-)
http://www.lothar-miller.de/s9y/categories/45-SPI-Master

: Bearbeitet durch Moderator
von Mark W. (kram) Benutzerseite


Lesenswert?

Danke fuer die Informationen.
Schieberegister scheint wohl die bessere Wahl zu sein.

@Lothar;
hast Du fuer den konfigurierbaren SPI-Master auch ein Syntheseergebnis?
Oder, weis jemand wie ich in Libero(11.2) mein VHDL Design grafisch 
anzeigen lassen kann?

Gruss,
Mark

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.