www.mikrocontroller.net

Forum: FPGA, VHDL & Co. Probleme beim Verbinden der Signale zwischen zwei Modulen


Autor: Andre (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,


ich bin VHLD-Anfänger und bin gerade dabei, eine Aufgabe zu lösen, in 
dem ein Zähler einen 7 Segment Anzeige füttert.

Der Zähler macht genau was er soll, dieser hat einen clk,rst, und 
enable.

Mein Problem liegt darin, das Ausgangssignal des Zählers, in die 
7Segment anzeige zu führen.

Der Zähler und der Code für die 7 Segment Anzeige, werden richtig 
kompiliert.

Der bei der Testbench kommen folgende Fehler:
tb_7segment.vhd(32): (vcom-1027) Number of positional association 
elements (2) exceeds number of formals (1).

tb_7segment.vhd(32): (vcom-1272) Length of formal "display" is 7; length 
of actual is 4.


Danke im voraus

Der Code sieht so aus:

Zähler:
------------------------------------------------------------------------ 
---
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;


entity zaehler is

  port(clk:     in std_logic;
       rst:     in std_logic;
       enable:  in std_logic;
       q:       out std_logic_vector(3 downto 0)  );

end zaehler;

architecture bevofzaehler of zaehler is
begin

  p1: process(clk, rst, enable)
    variable var : std_logic_vector(3 downto 0);
  begin

    if(rst = '1') then
      q   <= "0000";
      var := "0000";
    else
       if(clk'event and clk='1') then
         if(enable = '0') then
          q <= var;

         else

          if (var = "1001") then
            var := "0000";
          else
            var := var + '1';
          end if;
          q <= var;
         end if;
       end if;
    end if;
  end process;


end bevofzaehler;

------------------------------------------------------------------------ 
--
------------------------------------------------------------------------ 
--

7Segment-Anzeige
------------------------------------------------------------------------ 
--

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;


entity segment is

  port(q      : in  std_logic_vector(3 downto 0);
       display: out std_logic_vector(6 downto 0)  );

end segment;

architecture bevofsegment of segment is

signal clk, rst, enable : std_logic ;
signal s : std_logic_vector(3 downto 0);

component zaehler

  port(clk:     in std_logic;
       rst:     in std_logic;
       enable:  in std_logic;
       q:       out std_logic_vector(3 downto 0)  );

end component;

begin
z1:zaehler port map(clk, rst, enable, s);



p2:process(s)
begin

case s is

    when "0000" =>
          display   <= "1111110";

    when "0001" =>
          display   <= "0110000";

    when "0010" =>
          display   <= "1101101";

    when "0011" =>
          display   <= "1111001";

    when "0100" =>
          display   <= "0110011";

    when "0101" =>
          display   <= "1011011";

    when "0110" =>
          display   <= "1011111";

    when "0111" =>
          display   <= "1110000";

    when "1000" =>
          display   <= "1111111";

    when "1001" =>
          display   <= "1111011";

    when others =>
          display   <= "0000001";

  end case;
end process p2;

end bevofsegment;

------------------------------------------------------------------------ 
--
------------------------------------------------------------------------ 
--

Testbench

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

entity test_segment is
end test_segment;

architecture benchsegment of test_segment is

signal clk, rst, enable : std_logic;
signal s      : std_logic_vector(3 downto 0);
signal display : std_logic_vector(6 downto 0);

component segment

  port(
       display: out std_logic_vector(6 downto 0)  );

end component;

component zaehler

port(clk:     in std_logic;
       rst:     in std_logic;
       enable:  in std_logic;
       q:       out std_logic_vector(3 downto 0)  );
end component;

begin

DUT0:zaehler port map(clk, rst, enable, s);
DUT1:segment port map(s, display);

rst    <= '0', '1' after 20 ns;
enable <= '0', '1' after 40 ns;


process
  begin
    wait for 20 ns;
    clk <= not clk;
end process;



end benchsegment;

------------------------------------------------------------------------ 
--

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
In deiner Testbench wird der Port falsch deklariert:
  port(
       display: out std_logic_vector(6 downto 0)  );

Im Segment sieht er noch so aus:
  port(q      : in  std_logic_vector(3 downto 0);
       display: out std_logic_vector(6 downto 0)  );

Autor: Andre (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Danke für die schnelle Antwort:

Hab es jetzt simulieren können. Doch die clk werden nicht getaktet(siehe 
Bild)

Wenn ich den Zähler alleine teste gehts.
Jemand eine Idee??

Autor: Rick Dangerus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
signal clk, rst, enable : std_logic;
clk ist am Anfang 'U'. Und das negierte davon bleibt 'U'.

Versuch das mal:
signal clk         : std_logic := '0';
signal rst, enable : std_logic;

Rick

Autor: Andre (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Danke Rick,

durch die Initialisierung, wurde das das clk Problem gelöst.



Doch im Segment, wird die Case Option "s" nicht richtig abgefragt, und 
wird immer in den others Zweig durch gereicht.(siehe Bild).

Habe ich am Case-Konstrukt was falsch gemacht??

Gruß
Andre

Autor: berndl (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
schmeiss mal die variable var im Zaehler raus und nimm stattdessen ein 
Signal. Eine Variable ist wirklich nur als temporaerer Wert zu 
verstehen. Wenn du dafuer ein Signal nimmst, dann wird auch ein FF 
draus...

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Eine Variable ist wirklich nur als temporaerer Wert zu verstehen.
> Wenn du dafuer ein Signal nimmst, dann wird auch ein FF draus...
Das FF wird auch aus der Variable gemacht, allerdings eher implizit.

Aber: Variablen können im Prozess, in dem sie definiert werden, nicht in 
der Sensitivliste auftauchen...

Autor: Andre (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

das Problem ist gelöst.

Der Zähler wurde zwei mal verwendet: einmal in "segment" und in der 
"Testbench".

Die Lösung ist:
Im segment die Zeilen
signal s : std_logic_vector(3 downto 0); 

und
component zaehler 
 port(clk:     in std_logic;
 rst:     in std_logic;
 enable:  in std_logic;
       q: out std_logic_vector(3 downto 0)  );
 end component;

und
z1:zaehler port map(clk, rst, enable, s);

zu entfernen.

Und die Testbench so abzuändern:


library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

entity test_segment is
end test_segment;

architecture benchsegment of test_segment is

signal clk         : std_logic :='0' ;
signal rst         : std_logic :='0';
signal enable      : std_logic :='1';
signal s          : std_logic_vector(3 downto 0);
signal display     : std_logic_vector(6 downto 0);

component zaehler

port(clk:     in std_logic;
       rst:     in std_logic;
       enable:  in std_logic;
       q:       out std_logic_vector(3 downto 0)  );
end component;

component segment

  port(q      : in  std_logic_vector(3 downto 0);
       display: out std_logic_vector(6 downto 0)  );

end component;


begin

DUT0:zaehler port map(clk, rst, enable, s);
DUT1:segment port map(s, display);

rst    <= '1', '0' after 20 ns;
enable <= '0', '1' after 40 ns;


process
  begin

    wait for 20 ns;
    clk <= not clk;
end process;



end benchsegment;

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Und die Testbench so abzuändern:
Naja, es ist recht unüblich, in der Testbench interne Verdrahtungen zu 
beschreiben. Denn die Testbench wird ja später nicht auf einen Baustein 
abgebildet...

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.