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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.