Ich versuche ein Multiplexer mittels VHDL zu schreiben, der mir auch
Parallel mehrere Signale gleichzeizig multipleziert...
(da ich neu mit VHDL bin) ich habe aber paar Verständnis Probleme...
ich habe 6 Multiplexer erstellt IC1,IC2...IC6, ich habe aber nur eine
definiert (denn sie sollen ähnliche Eigenschaften haben) und davon den 6
gewünschten Multiplexern instanziert..
architecture Behavioral of behav is
component IC
Port ( Clk : in STD_LOGIC;
RST : in STD_LOGIC;
A : in STD_LOGIC_VECTOR(2 downto 0);
EN : in STD_LOGIC;
N01 : in STD_LOGIC;
N02 : in STD_LOGIC;
N03 : in STD_LOGIC;
N04 : in STD_LOGIC;
N05 : in STD_LOGIC;
N06 : in STD_LOGIC;
COM : out STD_LOGIC);
end component IC;
begin
--Instantiate Components
--IC1: Process
IC1 : IC
port map (
Clk => CLK,
RST => RST,
A => D_IC1,
EN => D8,
N01 => N1,
N02 => N2,
N03 => N3,
N04 => N4,
N05 => N5,
N06 => N6,
COM => COM6
);
--end process IC1;
--IC2: Process
IC2 : IC
port map (
Clk => CLK,
RST => RST,
A => D_IC2,
EN => D7,
N01 => N1,
N02 => N2,
N03 => N3,
N04 => N4,
N05 => N5,
N06 => N6,
COM => COM5
);
--end process IC2;
--IC3: Process
IC3 : IC
port map (
Clk => CLK,
RST => RST,
A => D_IC3,
EN => D6,
N01 => N1,
N02 => N2,
N03 => N3,
N04 => N4,
N05 => N5,
N06 => N6,
COM => COM4
);
--end process IC3;
--IC4: Process
IC4 : IC
port map (
Clk => CLK,
RST => RST,
A => D_IC4,
EN => D5,
N01 => N1,
N02 => N2,
N03 => N3,
N04 => N4,
N05 => N5,
N06 => N6,
COM => COM3
);
--end process IC4;
--IC5: Process
IC5 : IC
port map (
Clk => CLK,
RST => RST,
A => D_IC5,
EN => D4,
N01 => N1,
N02 => N2,
N03 => N3,
N04 => N4,
N05 => N5,
N06 => N6,
COM => COM2
);
--end process IC5;
--IC6: Process
IC6 : IC
port map (
Clk => CLK,
RST => RST,
A => D_IC6,
EN => D3,
N01 => N1,
N02 => N2,
N03 => N3,
N04 => N4,
N05 => N5,
N06 => N6,
COM => COM1
);
--end process IC6;
end Behav;
die 6 multiplexer IC1...6 sollen auch paralle Signale Steurn:
deswegen habe ich mir gedacht ich kann sie Als Process deklarieren da
wie es komentiert ist.
oder soll ich Process deklarieren beim definition der IC:
begin
Mux:process
begin
if ( RST = '1' ) then COM <= '0';
else
if rising_edge (Clk) then
if(EN = '1') then
if( A = "001") then COM <= N01;
elsif( A = "010") then COM <= N02;
elsif( A = "011") then COM <= N03;
elsif( A = "100") then COM <= N04;
elsif( A = "101") then COM <= N05;
elsif( A = "110") then COM <= N06;
end if;
end if;
end if;
end if;
end process;
end Behavioral;
LG Eddy
@ Eddy Hoffmann (Firma student) (eddy_2007)
>ich habe 6 Multiplexer erstellt IC1,IC2...IC6, ich habe aber nur eine>definiert (denn sie sollen ähnliche Eigenschaften haben) und davon den 6>gewünschten Multiplexern instanziert..
OK, aber mal ein paar Hinweise. Für breite Dateneingänge nutzt man
Vekoren, nicht N1, N2, N3 ...
Mir ist nicht wirklich klar, was du da machen willst. Dein MUX Prozess
unten ist auch ungünstig. Die vielen IFs erzeugen ungewollte
Prioritäten, die das Design ggf. verlangsamen bzw. aufblähen. Ein CASE
Statement ist dort das Mittel der Wahl.
MFG
Falk
@Falk
danke für die Hinweise.
> OK, aber mal ein paar Hinweise. Für breite Dateneingänge nutzt man> Vekoren, nicht N1, N2, N3 ...
die eingänge N01...N06 sind Signale die kommen von meiner externen HW
die will ich je nach A(steuersignal) zum Output COM multiplexen
> Mir ist nicht wirklich klar, was du da machen willst. Dein MUX Prozess> unten ist auch ungünstig. Die vielen IFs erzeugen ungewollte> Prioritäten, die das Design ggf. verlangsamen bzw. aufblähen. Ein CASE> Statement ist dort das Mittel der Wahl.
habe ich jetzt geändert:
architecture Behavioral of IC is
begin
process(N01,N02,N03,N04,N05,N06,A)
begin
--use Case statement
case A is
when "001" => COM <= N01;
when "010" => COM <= N02;
when "011" => COM <= N03;
when "100" => COM <= N04;
when "101" => COM <= N05;
when "110" => COM <= N06;
when others => COM <= "ZZZ";
end case;
end process;
end Behavioral;
bin immer nich sicher ob die ICs so parallel die signale multiplezieren
können ?
LG Eddy
@ Eddy Hoffmann (Firma student) (eddy_2007)
>> OK, aber mal ein paar Hinweise. Für breite Dateneingänge nutzt man>> Vekoren, nicht N1, N2, N3 ...>die eingänge N01...N06 sind Signale die kommen von meiner externen HW>die will ich je nach A(steuersignal) zum Output COM multiplexen
Ja und? Die kann man trotzdem sinnvollerweise zu einem Vektor
zusammenfassen.
>bin immer nich sicher ob die ICs so parallel die signale multiplezieren>können ?
Welcher? IC? Ein FPGA/CPLD? Sicher, warum nicht?
MG
Falk
@Falk Brunner
> Welcher? IC? Ein FPGA/CPLD? Sicher, warum nicht?
die ICs!!
ich will sicher gehen dass die ICs signale gleichzeitig multiplezieren
können. (parallel) --> deswegen habe ich vorhin mit Presess versucht(was
ich komentiert habe) !!
mein Ziel ist sicher zu stellen dass die IC1,IC2...und IC6 Signale
parallel multiplezieren werden.
@ Eddy Hoffmann (Firma student) (eddy_2007)
>> Welcher? IC? Ein FPGA/CPLD? Sicher, warum nicht?>die ICs!!
Ahhhh, du meinst deine Komponenten. Das sind keine ICs, naja, vielleicht
könnte man sie als virtuelle ICs bezeichnen. Der Rest der Designer nennt
sie Components.
>ich will sicher gehen dass die ICs signale gleichzeitig multiplezieren>können. (parallel)
Warum sollten sie das nicht?
>mein Ziel ist sicher zu stellen dass die IC1,IC2...und IC6 Signale>parallel multiplezieren werden.
Wenn es nicht total vergurkst werden sie dass.
MFG
Falk
@ Falk Brunner
> Ahhhh, du meinst deine Komponenten. Das sind keine ICs, naja, vielleicht> könnte man sie als virtuelle ICs bezeichnen. Der Rest der Designer nennt> sie Components.
genau Komponenten! (sorry ich bin neu Einsteiger mit VHDL..)
ich habe sie in meinem Design IC genannt, denn ich versuche ein
vorhandener WH mit VHDL zu Simulieren :-)
Danke sehr Falk
LG
Eddy
Hallo Eddy,
so wie ich dich verstanden habe,
würde ich zunächst einen Multiplexer definieren:
1
entitymux
2
Port(
3
Clk:instd_logic;
4
RST:instd_logic;
5
EN:instd_logic;
6
A:instd_logic_vector(2downto0);
7
N:instd_logic_vector(2downto0);
8
com:outstd_logic
9
);
10
endmux;
11
12
architecturebehavioralofmuxis
13
begin
14
process(RST,Clk)
15
begin
16
if(RST='1')then
17
com<='0';
18
elsifrising_edge(Clk)then
19
if(EN='1')then
20
com<=N(to_integer(unsigned(A)));
21
endif;
22
endif;
23
endprocess;
24
endbehavioral;
diesen in einem eigenen package abspeichern,
und in einem anderen package dann diesen mux
6 mal instanzieren.
1
entitymux6
2
Port(
3
Clk:instd_logic;
4
RST:instd_logic;
5
d:instd_logic_vector(2downto0);
6
d_ic:instd_logic_vector(2downto0);
7
N:instd_logic_vector(2downto0);
8
com:outstd_logic_vector(2downto0)
9
);
10
endmux6;
11
12
architecturebehavioralofmux6is
13
begin
14
MUX_GEN:foriind'rangegenerate
15
inst:mux
16
portmap(
17
rst=>rst,
18
clk=>clk,
19
en=>d(i),
20
a=>d_ic(i),
21
n=>n,
22
com=>com
23
);
24
endgenerate;
25
26
27
endbehavioral;
Diese werden auf jeden Fall alle parallel schalten
(sofern das physikalisch überhaupt möglich ist).
Das ist nur ein Vorschlag und nicht getestet. Ist
übrigens ein gutes Beispiel für das "generate"
Statement.
Gruß
Ralf