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


von Andre (Gast)


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;

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

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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)  );

von Andre (Gast)


Angehängte Dateien:

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??

von Rick Dangerus (Gast)


Lesenswert?

1
signal clk, rst, enable : std_logic;
clk ist am Anfang 'U'. Und das negierte davon bleibt 'U'.

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

Rick

von Andre (Gast)


Angehängte Dateien:

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

von berndl (Gast)


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...

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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...

von Andre (Gast)


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
1
signal s : std_logic_vector(3 downto 0);

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

und
1
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;

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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...

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.