Forum: FPGA, VHDL & Co. Einfacher Bus Multiplexer


von Achim (Gast)


Lesenswert?

Hallo Zusammen,

ich hänge gerade an einer, an sich simplen, Aufgabe.

Für ein Wishbone Interconnect will ich an den Master kombinatorisch die 
Daten des ausgewählten Slaves übergeben. Welcher Slave ausgewählt wurde, 
steht in einem Vector. Wenn also bspw. bei 3 Slaves der erste selektiert 
ist, steht in dem Vector "001", beim dritten "100". Ich habe mal 
geguckt, wie andere das gemacht haben und habe das gefunden:
1
gen_cs : for i in 0 to (g_memory_map'length - 1) generate
2
...
3
x_wb_master_o.dat <= x_wb_slave_array_i(i).dat when s_cs_vector(i) = '1' else (others => 'Z');
4
...
5
end generate;

Funktioniert in der Simu super, aber ich mag kein 'Z' für Sachen, die im 
FPGA laufen. Alternativ habe ich mir das überlegt:
1
  p_assign_dat_out : process(x_wb_slave_array_i, s_cs_vector) is
2
  begin
3
    for i in 0 to (g_memory_map'length - 1) loop
4
      if s_cs_vector(i) = '1' then
5
        x_wb_master_o.dat <= x_wb_slave_array_i(i).dat;
6
      end if;
7
    end loop;
8
  end process p_assign_dat_out;

Was natürlich auch murks ist, weil das ein Latch erzeugt.

Ich komme einfach nicht darauf, wie's richtig wäre. Habt ihr einen Tipp?

Danke und viele Grüße

Achim

von Sebastian V. (sebi_s)


Lesenswert?

Achim schrieb:
> Was natürlich auch murks ist, weil das ein Latch erzeugt.

Einfach vor der Schleife alle Werte von x_wb_master_o.dat auf irgendwas 
definiertes setzen?

von Nix verstahn (Gast)


Lesenswert?

Ich würde es mit einem schlichten case machen, wenn ich das Problem 
richtig verstanden haben sollte.

von Nix verstahn (Gast)


Lesenswert?

Oder ein sel?

von Achim (Gast)


Lesenswert?

Sebastian V. schrieb:
> Einfach vor der Schleife alle Werte von x_wb_master_o.dat auf irgendwas
> definiertes setzen?

Ich hau meinen Kopf auf den Tisch - so kann ich das Latch natürlich 
vermeiden. Danke! :D

von Klakx (Gast)


Lesenswert?

1
gen_cs : for i in 0 to (g_memory_map'length - 1) generate
2
...
3
x_wb_master_o.dat <= x_wb_slave_array_i(i).dat when s_cs_vector(i) = '1' else (others => 'Z');
4
...
5
end generate;

Davon ausgehend, wäre abgewandelt auch ein OR-Bus möglich.
1
gen_cs : for i in 0 to (g_memory_map'length - 1) generate
2
...
3
x_wb_master(i) <= x_wb_slave_array_i(i).dat when s_cs_vector(i) = '1' else (others => '0');
4
...
5
end generate; 
6
x_wb_master_o.dat <= x_wb_master(0) or x_wb_master(1) or ..

Hat natürlich das gleiche fiese Verhalten wie der Z-Bus. Wenn mal zwei 
Chipselects stehen, dann werden die Daten vermatscht. Sollte man 
vermeiden ;)

Ich vermute der OR-Bus benötigt auch weniger "Gatter" bzw. lässt sich 
mit geringerer Timingpfadtiefe realisieren. Vielleicht ist es auch nur 
marginal besser.

von Dose (Gast)


Lesenswert?

Du schreibst eine Funktion 1 aus N.

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.