www.mikrocontroller.net

Forum: FPGA, VHDL & Co. Multiplexer - Problem


Autor: Dete Kosschlovsski (dete)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
hallo zusammen,

folgendes Problem beschäftigt mich:

ich benötige einen Multiplexer bei dem man aber nicht z.B. 2 Eingänge 
auf 1 Ausgang schaltet oder umgekehrt, sondern der im Zustand A  die 
Daten in die eine Richtung schaltet und im Zustand B in die umgekehrte 
Richtung. Dem entsprechend muß ein Anschluß ein "inout" sein.

(Siehe dazu die skizze im anhang)


Hier mein vorläufige Ergebnis:  (nur das wichtigste)

sel      : in std_logic;   --auswahl
data1    : in std_logic_vector (7 downto 0); -- Eingang für die Richtung 
A
data2    : out std_logic_vector (7 downto 0); -- Ausgang für die 
Richtung B
data3    : inout std_logic_vector (7 downto 0) -- Daten fließen in beide 
richtungen

signal data2_i : std_logic_vector(7 downto 0) := "00000000";

data3 <= data1 when sel = '0' else data2_i;
data2 <= data2_i;

In den 2 zeilen Logik steckt aber ein Fehler, den ich nicht sehe. Oder 
ist mein Ansatz falsch ?

Bitte helft mir

Gruß und vielen Dank im voraus

dete

Autor: Nephilim (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
data2_i bekommt in deiner beschreibung nie einen neuen wert zugewiesen 
und der Fall sel = '1' wird auch nie abgefragt.

Autor: Dete Kosschlovsski (dete)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
der Fall Sel = '1' ist mit ... else data2_i;  erledigt

wie muß ich   ....data2 <= data2_i;   ändern?

Autor: Stanko T. (newie)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Date,

probier es mal so:

data1    : in std_ulogic_vector (7 downto 0); -- Eingang für die 
Richtung A
data2    : out std_ulogic_vector (7 downto 0); -- Ausgang für die
data3    : inout std_logic_vector (7 downto 0) -- Daten fließen in beide
richtungen

signal data2_i : std_ulogic_vector(7 downto 0) := "00000000";

data3 <= ToStdLogicVector(data1) when sel = '0' else ToStdLogicVector 
(data2_i);
data2 <= ToStdULogicVector (data2_i);

Und wenn du auf den Bus nicht schreiben möchtest dann setz einfach den 
Bus auf high Impedance data3 <= "ZZZZZZZZ";

Gruss
Stanko

Autor: Dete Kosschlovsski (dete)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo stanko,

hier mal mein code, bei der Compilierung tritt eine Fehlermeldung auf:


------------------------------------------------------------------------ 
--
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity one_to_two_mux_inout_input is

   port(
         sel      : in std_logic_vector (7 downto 0);
         data1    : in std_ulogic_vector (7 downto 0);
         data2    : out std_ulogic_vector (7 downto 0);
         data3    : inout std_logic_vector (7 downto 0)
        );

end one_to_two_mux_inout_input;

architecture Behavioral of one_to_two_mux_inout_input is

signal data2_i : std_ulogic_vector(7 downto 0) := "00000000";

begin

data3 <= to_stdlogicvector(data1) when sel = "11100000" else 
to_stdlogicvector(data2_i);
data2 <= to_stdlogicvector(data2_i);

end Behavioral;
-----------------------------------------------------------------
wo liegt mein fehler? ich habe mit std_ulogic_vector noch nicht 
gearbeitet

gruß dete

Autor: Nephilim (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
poste doch auch mal den Fehler dazu. warum nutzt du überhaupt 
std_ulogic_vector und nich gleich std_logic_vector?

Autor: Dete Kosschlovsski (dete)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
also der felher lautet:

.......     \test\one_to_two_mux_inout_input.vhd(27): No feasible 
entries for subprogram "to_stdlogicvector".


warum nutzt du überhaupt
std_ulogic_vector und nich gleich std_logic_vector?

--> weil Stanko T. das las beispiel gepostet hat ! und ich seinen 
Versuch getestet habe !

Autor: Doung W. (honeyleabe)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;


entity one_to_two_mux_inout_input is

   port(
         sel      : in std_logic;
         data1    : in std_ulogic_vector (7 downto 0);
         data2    : out std_ulogic_vector (7 downto 0);
         data3    : inout std_ulogic_vector (7 downto 0)
        );

end one_to_two_mux_inout_input;

architecture Behavioral of one_to_two_mux_inout_input is

begin
    process(sel)
       begin
    if (sel = '1') then
      data3 <= data1;
   else
      data2 <= data3;
   end if;
 end process;
end Behavioral;

Autor: Roger Steiner (edge)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Passend zu deinem ersten Ansatz:
data3 <= data1 when sel = '0' else (others=>'Z');
data2 <= data3 when sel = '1' else (others=>'X');

Bei data2 wird ein Latch verhindert und in der Simulation sollte es 
auffallen wenn der Pfad im deselektierten Zustand gelesen wird.

Cheers, Roger

Autor: Nephilim (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
also ich habs so gemacht:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity one_to_two_mux_inout_input is

   port(
         sel      : in std_logic;
         data1    : in std_logic_vector (7 downto 0);
         data2    : out std_logic_vector (7 downto 0);
         data3    : inout std_logic_vector (7 downto 0)
        );

end one_to_two_mux_inout_input;

architecture Behavioral of one_to_two_mux_inout_input is

signal data2_i : std_logic_vector(7 downto 0) := "00000000";

begin

data3 <= data1 when sel = '0' else "ZZZZZZZZ";
data2 <= data3 when sel = '1' else "ZZZZZZZZ";


end Behavioral;

und synthese funzt super

Autor: Dete Kosschlovsski (dete)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hab deinen code kopiert, er funktiert, auch in der Simulation.
Genauso wie ich das wollte, Und ich hab noch was dazu gelernt.

Super, Vielen Dank  Nephilim

Gruß Dete

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.