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;
------------------------------------------------------------------------
--
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) );
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??
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
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
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...
> 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...
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;
> 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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.

