Multiplexer - Problem

#1405418
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
Angehängte Dateien:
#1405449
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
#1405515
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
#1405577
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 !
#1405586
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;
#1405589
Lesenswert?

Passend zu deinem ersten Ansatz:
1
data3 <= data1 when sel = '0' else (others=>'Z');
2
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
Gast #1405597
Lesenswert?

also ich habs so gemacht:
1
library IEEE;
2
use IEEE.STD_LOGIC_1164.ALL;
3
use IEEE.STD_LOGIC_ARITH.ALL;
4
use IEEE.STD_LOGIC_UNSIGNED.ALL;
5

6
entity one_to_two_mux_inout_input is
7

8
   port(
9
         sel      : in std_logic;
10
         data1    : in std_logic_vector (7 downto 0);
11
         data2    : out std_logic_vector (7 downto 0);
12
         data3    : inout std_logic_vector (7 downto 0)
13
        );
14

15
end one_to_two_mux_inout_input;
16

17
architecture Behavioral of one_to_two_mux_inout_input is
18

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

21
begin
22

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

26

27
end Behavioral;

und synthese funzt super

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