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 | entity mux |
2 | Port ( |
3 | Clk : in std_logic; |
4 | RST : in std_logic; |
5 | EN : in std_logic; |
6 | A : in std_logic_vector(2 downto 0); |
7 | N : in std_logic_vector(2 downto 0); |
8 | com : out std_logic |
9 | );
|
10 | end mux; |
11 | |
12 | architecture behavioral of mux is |
13 | begin
|
14 | process(RST, Clk) |
15 | begin
|
16 | if (RST = '1') then |
17 | com <= '0'; |
18 | elsif rising_edge (Clk) then |
19 | if (EN = '1') then |
20 | com <= N(to_integer(unsigned(A))); |
21 | end if; |
22 | end if; |
23 | end process; |
24 | end behavioral; |
diesen in einem eigenen package abspeichern, und in einem anderen package dann diesen mux 6 mal instanzieren.
1 | entity mux6 |
2 | Port ( |
3 | Clk : in std_logic; |
4 | RST : in std_logic; |
5 | d : in std_logic_vector(2 downto 0); |
6 | d_ic : in std_logic_vector(2 downto 0); |
7 | N : in std_logic_vector(2 downto 0); |
8 | com : out std_logic_vector(2 downto 0) |
9 | );
|
10 | end mux6; |
11 | |
12 | architecture behavioral of mux6is |
13 | begin
|
14 | MUX_GEN: for i in d'range generate |
15 | inst: mux |
16 | port map ( |
17 | rst => rst, |
18 | clk => clk, |
19 | en => d(i), |
20 | a => d_ic(i), |
21 | n => n, |
22 | com => com |
23 | );
|
24 | end generate; |
25 | |
26 | |
27 | end behavioral; |
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
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.