Forum: FPGA, VHDL & Co. If und Port-Map Problem


von FPGA_Beginner (Gast)


Lesenswert?

Hallo zusamen,

kann mir jemand bitte sagen, warum dieser Code falsch ist und wie er 
richtig wäre ?

library ieee;
use ieee.std_logic_1164.all;
use work.all;

entity bcd is
port(   s:    in std_logic_vector(3 downto 0);
    k:    in std_logic_vector(3 downto 0);
    lx1:  out std_logic_vector(6 downto 0);
    lx2:  out std_logic_vector(6 downto 0);
    lx3:  out std_logic_vector(6 downto 0);
    lx4:  out std_logic_vector(6 downto 0);
    clk_50:  in  std_logic
  );
end bcd;
-- 
------------------------------------------------------------------------ 
-
architecture struct of bcd is


  component led_coder is
  port   (
      schalter:  in std_logic_vector(3 downto 0);
      led:    out std_logic_vector(6 downto 0)
      );
  end component;

begin
    P1:led_coder port map (schalter=>s, led=>lxx);

    auswahl:process(clk_50)
    begin

    if (k = "0001") then
        P1:led_coder port map ((schalter=>s, led=>lx1));
    end if;

    if (k = "0010") then
        P2:led_coder port map ((schalter=>s, led=>lx2));
    end if;

    if (k = "0100") then
        P3:led_coder port map ((schalter=>s, led=>lx3));
    end if;

    if (k = "1000") then
        P4:led_coder port map ((schalter=>s, led=>lx4));
    end if;


    end process;
end struct;



Danke

von fpgaküchle (Gast)


Lesenswert?

keine Instanziierung im Prozeß, port map ist nur direct in der 
architecture erlaubt, grad ein generate oder block drumherum geht.

Welche Hardware willst du den bauen?

von FPGA_Beginner (Gast)


Lesenswert?

Ich spiele damit nur herum.
Ich habe auf meinem EVA-Board vier taster, vier schalter und vier 7-Seg. 
anzeigen.

an den BCD- Schaltern wird ein Wert eingestellt und je nach schalter 
wird dieser werte einer der 7-Seg. anzeigen weitergeleitet.

von FPGA_Beginner (Gast)


Lesenswert?

library ieee;
use ieee.std_logic_1164.all;
use work.all;

entity bcd is
port(   s:    in std_logic_vector(3 downto 0);
    k:    in std_logic_vector(3 downto 0);
    lx1:  out std_logic_vector(6 downto 0);
    lx2:  out std_logic_vector(6 downto 0);
    lx3:  out std_logic_vector(6 downto 0);
    lx4:  out std_logic_vector(6 downto 0);
    clk_50:  in  std_logic
  );
end bcd;
-- 
------------------------------------------------------------------------ 
-
architecture struct of bcd is


  component led_coder is
  port   (
      schalter:  in std_logic_vector(3 downto 0);
      led:    out std_logic_vector(6 downto 0)
      );
  end component;

begin

    auswahl:process(clk_50)
    begin

    L1:
    if (k = "0001") GENERATE
        P1:led_coder port map ((schalter=>s, led=>lx1));
    end GENERATE;

    L2:
    if (k = "0010") GENERATE
        P2:led_coder port map ((schalter=>s, led=>lx2));
    end GENERATE;

    L3:
    if (k = "0100") GENERATE
        P3:led_coder port map ((schalter=>s, led=>lx3));
    end GENERATE;

    L4:
    if (k = "1000") GENERATE
        P4:led_coder port map ((schalter=>s, led=>lx4));
    end GENERATE;


    end process;
end struct;


geht leider auch nicht :(

von Falk B. (falk)


Lesenswert?

@ FPGA_Beginner (Gast)

>geht leider auch nicht :(

Kann ja auch gar nicht!

Generate bindet Komponenten ein, es werden quasi viruelle ICs in 
virtuelle Sockel gesteckt. Das kann nur während der Synthese erfolgen 
und nicht während der Laufzeit!

Generate geht nur ausserhalb eines Prozesses und dort mit if nur mit 
konstanen Werten, so ähnlich wie bedingte Kompilierung mit ifdef/endif 
in C.

MfG
Falk

von Jan M. (mueschel)


Lesenswert?

In deinem Fall brauchst du einfach einen Multiplexer, der dir das an den 
Eingang der component zu legende Signal auswaehlt.

von FPGA_Beginner (Gast)


Lesenswert?

Auf die folgende Art habe ich das problem gelöst :


library ieee;
use ieee.std_logic_1164.all;

entity led_coder is
  port( schalter : in std_logic_vector(3 downto 0);
      led :  out std_logic_vector(6 downto 0);
      aktiv: in std_logic
     );

end led_coder;


architecture behv of led_coder is
begin

  process  (schalter)
  begin
    if(aktiv='0') then
    case schalter is
                  -- GFEDCBA
      when "0000" => led <= NOT "0111111";
      when "0001" => led <= NOT "0000110";
      when "0010" => led <= NOT "1011011";
      when "0011" => led <= NOT "1001111";
      when "0100" => led <= NOT "1100110";
      when "0101" => led <= NOT "1101101";
      when "0110" => led <= NOT "1111101";
      when "0111" => led <= NOT "0000111";
      when "1000" => led <= NOT "1111111";
      when "1001" => led <= NOT "1101111";
      when others => led <= "ZZZZZZZ";
    end case;
    end if;
  end process;
end behv;

-------------------------------------------------------------
library ieee;
use ieee.std_logic_1164.all;
use work.all;

entity bcd is
port(   s:    in std_logic_vector(3 downto 0);
    k1:    in std_logic;
    k2:    in std_logic;
    k3:    in std_logic;
    k4:    in std_logic;
    lx1:  out std_logic_vector(6 downto 0);
    lx2:  out std_logic_vector(6 downto 0);
    lx3:  out std_logic_vector(6 downto 0);
    lx4:  out std_logic_vector(6 downto 0)

  );
end bcd;
-- 
------------------------------------------------------------------------ 
-
architecture struct of bcd is

  component led_coder is
  port(schalter:   in std_logic_vector(3 downto 0);
     led:     out std_logic_vector(6 downto 0);
     aktiv:     in std_logic
     );
  end component;

begin

    P1: led_coder port map (schalter=>s, led=>lx1, aktiv=>k1);
    P2: led_coder port map (schalter=>s, led=>lx2, aktiv=>k2);
    P3: led_coder port map (schalter=>s, led=>lx3, aktiv=>k3);
    P4: led_coder port map (schalter=>s, led=>lx4, aktiv=>k4);

end struct;


Aber ob dies so die beste Lösung ist bin ich mir garnicht sicher....
hat jemand einen besseren vorschlag... am besten in Source form ?

Danke

von Falk B. (falk)


Lesenswert?

@ FPGA_Beginner (Gast)

>Aber ob dies so die beste Lösung ist bin ich mir garnicht sicher....

Doch, die ist schon sehr gut, so würden das die Profis auch machen.

>hat jemand einen besseren vorschlag... am besten in Source form ?

Das Tristate in deinem LED Decoder ist meist ungünstig. Tristates 
sollten nicht in Modulen generiert werden, nur im Toplevel.

MFg
Falk

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
Noch kein Account? Hier anmelden.