Einfacher Bus Multiplexer

Gast #5039784
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
Gast #5040048
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren