If und Port-Map Problem

Gast #646681
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
Gast #646694
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.
Gast #646698
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 :(
#646722
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
Gast #646760
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
#646765
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

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