www.mikrocontroller.net

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


Autor: FPGA_Beginner (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: fpgaküchle (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: FPGA_Beginner (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: FPGA_Beginner (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 :(

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jan M. (mueschel)
Datum:

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

Autor: FPGA_Beginner (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.