mikrocontroller.net

Forum: FPGA, VHDL & Co. Fehler im VHDL-Quellcode


Autor: Halberraum (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe ein VHDL-Quellcode zusammengesetllt, bei dem ein Signal 
heruntergetaktet wird und dieses Signal nutze ich um eine 
7-Segment-Anzeige anzusteuern.
Leider funktioniert dies nicht. Er zeigt eine 8 auf der 
7-Segment-Anzeige an und der Reseteingang startet den Vorgang des 
Zählens nicht.
Hat jemand eine Idee???
library IEEE;
  use IEEE.std_logic_1164.all;           -- importiere std_logic types
  use IEEE.std_logic_arith.all;         -- importiere add/sub vom std_logic_vector
  use IEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITY sieben_segment IS
  PORT ( -- Eingänge
      clk               : IN  std_logic;      -- Eingangstakt
      reset              : IN  std_logic;      -- Zähler Rücksetzeingang
    --  updown             : IN  std_logic;      -- Zählrichtung up/down
      -- Ausgänge 
      a, b, c, d, e, f, g  : OUT std_logic);     -- Eingänge der 7-Segment-Anzeige
END sieben_segment;

ARCHITECTURE Behavioral OF sieben_segment IS
-- interne Signal Deklaration
  SIGNAL teiler: integer range 0 to 999999;       -- Signal teiler deklariert: Mit diesem Wert kann aus 1MHz Sekundentakt gemacht werden
  SIGNAL clk_neu : std_logic := '0';            -- Neues Taktsignal
  SIGNAL DD : std_logic_vector(3 DOWNTO 0);        -- Zähler - Mehrbitvektor 
  SIGNAL segm: STD_LOGIC_VECTOR(6 DOWNTO 0);      -- Segmente der 7-Segment-Anzeige - Mehrbitvektor

BEGIN

PROCESS BEGIN                             -- FREQUENZTEILER
wait until rising_edge(clk);                  -- Warten auf ansteigende Flanke des Taktsignals clk.
  if (teiler<999999) then                    -- Wenn teiler kleiner als 999999 dann
    teiler   <= teiler+1;                  -- wird teiler der Wert teiler+1 zugewiesen und
    clk_neu <= '0';                      -- clk_neu wird der Wert 0 zugewiesen
  else                                -- sonst
    teiler   <= 0;                        -- wird teiler der Wert 0 und
    clk_neu <= '1';                      -- clk_neu der Wert 1 zugewiesen
  end if;
END PROCESS;

PROCESS BEGIN                                -- VORWÄRTSZÄHLER
WAIT UNTIL rising_edge(clk_neu);                    -- warten auf ansteigende Flanke von clk_neu(0->1)
  IF (clk='1') THEN                           -- Wenn 1 Sekunde vorbei dann
    IF reset = '0' THEN                        -- WENN reset den Wert Null hat DANN
      DD <= (others => '0');                    -- setze alle Zählerbits auf Null
    ELSE                                  -- SONST
      DD <= CONV_STD_LOGIC_VECTOR(UNSIGNED(DD) + 1, 4);  -- DD nach oben zählen: n, n+1, n+2, ..., 15, 0, 1, ...
    END IF;
  END IF;
END PROCESS;

PROCESS BEGIN                            -- BCD_DECODER
IF (reset = '1') then                      -- WENN Signal reset den Wert 1 hat DANN
         segm <= "0000000";                  -- weise segm den Wert 0000000 zu
      elsif (clk_neu'event and clk_neu = '1') then    -- SONST WENN warten auf ansteigende Flanke von clk_neu(0->1) DANN
    -- Wenn 1 Sekunde vorbei dann
  CASE DD IS                            -- Fallunterscheidung -> Wenn Kontrollausdruck DD
  WHEN "0000"=>segm<="0000001"; -- 0               den Testausdruck 0000 hat dann weise segm den Wert 0000001 zu, us.w.
  WHEN "0001"=>segm<="1001111";  -- 1
  WHEN "0010"=>segm<="0010010";  -- 2
  WHEN "0011"=>segm<="0000110";  -- 3
  WHEN "0100"=>segm<="1001100";  -- 4
  WHEN "0101"=>segm<="0100100";  -- 5
  WHEN "0110"=>segm<="0100000";  -- 6
  WHEN "0111"=>segm<="0001111";  -- 7
  WHEN "1000"=>segm<="0000000";  --  8
  WHEN "1001"=>segm<="0000100";  -- 9
  WHEN "1010"=>segm<="0000010";  -- A
  WHEN "1011"=>segm<="1100000";  -- b
  WHEN "1100"=>segm<="0110001";  -- C
  WHEN "1101"=>segm<="1000010";  -- d
  WHEN "1110"=>segm<="0010000";  --  E
  WHEN "1111"=>segm<="0111000";  -- F
  WHEN OTHERS=>segm<="0000000"; -- mögliche andere Fälle
  END CASE;
END IF;
END PROCESS;
-- Verbinde die internen Zähler mit den Ausgängen  
  a <= segm (6);
  b <= segm (5);
  c <= segm (4);
  d <= segm (3);
  e <= segm (2);
  f <= segm (1);
  g <= segm (0);
END Behavioral;

Autor: Michael S. (fandjango)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Probier mal
PROCESS BEGIN                                -- VORWÄRTSZÄHLER
WAIT UNTIL rising_edge(clk_neu);                    -- warten auf ansteigende Flanke von clk_neu(0->1)
  IF (clk_neu='1') THEN                           -- Wenn 1 Sekunde vorbei dann
bei dem zweiten Prozess. Ich würde da clk_neu nehmen anstelle von clk.

Außerdem ist eine Awareness Liste beim PROCESS nötig:

z.B.:
PROCESS (clk_neu) BEGIN
beim zweiten PROCESS. Beim ersten wäre es wohl (clk).

Meine Meinung.

Autor: Boris M. (borism)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
- den zweiten Prozess würde ich anders schreiben...
process begin
wait until rising_edge(clk);
if (clk_neu) = '1' then
  ...
end if;

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

Bewertung
0 lesenswert
nicht lesenswert
Ohne das genauer angeschaut zu haben, hast du eine Anfängerregel 
verletzt: Nur 1 Takt im Design. Ein Takt ist alles, was mit 'event oder 
rising_edge() oder falling_edge()zu tun hat.

Fazit: Dreh das mal etwa so um
WAIT UNTIL rising_edge(clk);  
  IF (clk_neu='1') THEN       -- Wenn 1 Sekunde vorbei dann

:
PROCESS BEGIN                            -- BCD_DECODER
  IF (reset = '1') then                      -- WENN Signal reset den Wert 1 hat DANN
       segm <= "0000000";                  -- weise segm den Wert 0000000 zu
  elsif (clk'event and clk = '1') then    -- SONST WENN 
    IF (clk_neu='1') THEN       -- Wenn 1 Sekunde vorbei dann
:

EIDT:
> Außerdem ist eine Awareness Liste beim PROCESS nötig:
Eine Sensitivliste ist nur bei einem Prozess ohne wait nötig.

Autor: Hubert Fischer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was ich so auf den ersten Blick feststelle:

* Ich würde mal einen sauberen/einheitlichen Codingstil verwenden. Alle 
Prozesse sind geclockt und sollten somit mal einen sauberen Resetzweig 
und Clockabfrage beinhalten:

z.B.

Prozess 1:  if reset= '1'then
              teiler  <=  0;  -- eventuell unsigned verwenden
              clk_neu <= '0';
            elsif clk = '1' and clk'event then
              *
              *
              *
            end if;

Prozess 1:  if reset= '1'then
             DD <=(others => '0');
            elsif clk_neu = '1' and clk_neu'event then
              *
              *
              *
            end if;

* Im Prozess zwei ist der Reset Low Sensitiv und im Prozess drei High 
Sensitiv!!!!!??

* In Prozess werden beide Clocks vermischt.

Meine Meinung, hoffe es hilft.

Gruss Hubert

Autor: Halberraum (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schreibe ich
PROCESS (clk_neu) BEGIN
 will er die wait-Anweisng nicht mehr haben.

Oder ist vielleicht die Frequenz zu hoch? da er ja am Anfang eine 8 
stehen hat. Das Taktsignal ist 1 MHz groß.

Beim längeren drücken der resettaste zeigt er zwischenzeitlich ein paar 
Zahlen.

Hat sonst noch jemand eine Idee???

Autor: Boris M. (borism)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Halberraum schrieb:
> Hat sonst noch jemand eine Idee???

Poste mal deinen aktuellen Code...

> PROCESS (clk_neu) BEGIN

Ich glaube du hast etwas falsch verstanden. Es gibt nur eine Clock und 
die heißt bei dir clk! Da du immer auf clk triggerst brauchst du keine 
Sensitivitylist... clk_neu ist nur eine Art  Enable-Signal und keine 
Clock!

Autor: Hubert Fischer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Zur Vervollständigung:

clk_div : process (clk, reset)
begin
    if reset= '1'then
       teiler  <=  0;  -- eventuell unsigned verwenden
       clk_neu <= '0';
    elsif clk = '1' and clk'event then
       *
       *
       *
    end if;
end process;


Du muss deinen Code aufräumen, vor allem die Resetbedingungen!

Gruss, Hubert

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

Bewertung
0 lesenswert
nicht lesenswert
Entweder alles so:
process begin
   wait until rising_edge(clk);          
   if reset='1' then
       :
   else
       :
   end if;
end process;
Oder alles so:
process (clk, reset) begin
   if rising_edge(clk) then
      if reset='1' then
       :
      else
       :
      end if;
   end if;
end process;
Oder alles so:
process (clk, reset) begin
   if reset='1' then
      :
   elsif rising_edge(clk) then
       :
   end if;
end process;
Aber wenigstens alles gleich.

Wobei ich die erste Variante (aus verschiedenen Gründen) bevorzuge  ;-)

EDIT:
> Du muss deinen Code aufräumen, vor allem die Resetbedingungen!
Am besten: den Reset gleich weglassen...

Autor: Oli (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Falls du Xilinx FPGAs hast, ist dieses Whitepaper über (nicht nötige) 
Resets sehr zu empfehlen:
http://www.xilinx.com/support/documentation/white_...

Autor: Hubert Fischer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Lothar

Aus welchen Gründen bevorzugts du die erste Variante?

Was mir noch auffällt:

Du willst ja mit clk_neu zählen und das Ergebnis in Abhängig von DD in 
"segm" dekodieren und speichern.

So wirst du immer um einen Zählschritt hinten nach sein. Soll heissen, 
wenn er z.B. auf 7 zählt wird er noch 6 speichern, dekodieren und 
darstellen.

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

Bewertung
0 lesenswert
nicht lesenswert
> Aus welchen Gründen bevorzugts du die erste Variante?
Siehe dort:
http://www.lothar-miller.de/s9y/archives/16-Takt-i...

Und dazu kommt die bereits angesprochene Reset-Geschichte. Asynchrone 
Resets bringen urige Probleme mit sich. Siehe dazu den 
Beitrag "Re: FSM Problem(Ein zustand als Taktverzögerung)"

EDIT:
> So wirst du immer um einen Zählschritt hinten nach sein.
Richtig, aus diesem Grund sollte die ganze Decodiergeschichte eigentlich 
concurrent oder in einem kombinatorischen Prozess ablaufen.

Autor: Hubert Fischer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jep, die Dekodierung sollte kombinatorisch sein!

Ja ja, die bösen Sensitivity Listen. Ist mir leider auch schon öfters 
passiert.

Gruss, Hubert

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

Bewertung
0 lesenswert
nicht lesenswert
> Ist mir leider auch schon öfters passiert.
Keine Sorge, das passiert anderen auch:
Beitrag "Re: Variable vs Signal"

Autor: Duke Scarring (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Halberraum:
>Hat jemand eine Idee???

Abgesehen von den vielen (und richtigen) Hinweisen zum Code: Sind denn 
die Pinzuweisungen richtig? Hast Du überhaupt welche vorgenommen?

Duke

Autor: Halberraum (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Aktuell sieht der Code noch so aus: (und funktioniert immer noch nicht)
library IEEE;
  use IEEE.std_logic_1164.all;           -- importiere std_logic types
  use IEEE.std_logic_arith.all;         -- importiere add/sub vom std_logic_vector
  use IEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITY sieben_segment IS
  PORT ( -- Eingänge
      clk               : IN  std_logic;      -- Eingangstakt
      reset              : IN  std_logic;      -- Zähler Rücksetzeingang
    --  updown             : IN  std_logic;      -- Zählrichtung up/down
      -- Ausgänge 
      a, b, c, d, e, f, g  : OUT std_logic);     -- Eingänge der 7-Segment-Anzeige
END sieben_segment;

ARCHITECTURE Behavioral OF sieben_segment IS
-- interne Signal Deklaration
  SIGNAL teiler: integer range 0 to 999999;       -- Signal teiler deklariert: Mit diesem Wert kann aus 1MHz Sekundentakt gemacht werden
  SIGNAL clk_neu : std_logic := '0';            -- Neues Taktsignal
  SIGNAL DD : std_logic_vector(3 DOWNTO 0);        -- Zähler - Mehrbitvektor 
  SIGNAL segm: STD_LOGIC_VECTOR(6 DOWNTO 0);      -- Segmente der 7-Segment-Anzeige - Mehrbitvektor

BEGIN

PROCESS BEGIN                             -- FREQUENZTEILER
wait until rising_edge(clk);                  -- Warten auf ansteigende Flanke des Taktsignals clk.
if (teiler<999999) then                    -- Wenn teiler kleiner als 999999 dann
    teiler   <= teiler+1;                  -- wird teiler der Wert teiler+1 zugewiesen und
    clk_neu <= '0';                      -- clk_neu wird der Wert 0 zugewiesen
  else                                -- sonst
    teiler   <= 0;                        -- wird teiler der Wert 0 und
    clk_neu <= '1';                      -- clk_neu der Wert 1 zugewiesen
  end if;
END PROCESS;

PROCESS BEGIN                                -- VORWÄRTSZÄHLER
WAIT UNTIL rising_edge(clk);                          -- warten auf ansteigende Flanke von clk_neu(0->1)
IF (clk_neu='1') THEN                         -- Wenn 1 Sekunde vorbei dann
    IF reset = '0' THEN                        -- WENN reset den Wert Null hat DANN
      DD <= (others => '0');                    -- setze alle Zählerbits auf Null
    ELSE                                  -- SONST
      DD <= CONV_STD_LOGIC_VECTOR(UNSIGNED(DD) + 1, 4);  -- DD nach oben zählen: n, n+1, n+2, ..., 15, 0, 1, ...
    END IF;
  END IF;
END PROCESS;

PROCESS BEGIN                            -- BCD_DECODER
IF (reset = '1') then                      -- WENN Signal reset den Wert 1 hat DANN
         segm <= "0000000";                  -- weise segm den Wert 0000000 zu
      elsif (clk'event and clk = '1') then          -- SONST WENN warten auf ansteigende Flanke von clk_neu(0->1) DANN
if (clk_neu='1') then                      -- Wenn 1 Sekunde vorbei dann
  CASE DD IS                            -- Fallunterscheidung -> Wenn Kontrollausdruck DD
  WHEN "0000"=>segm<="0000001"; -- 0               den Testausdruck 0000 hat dann weise segm den Wert 0000001 zu, us.w.
  WHEN "0001"=>segm<="1001111";  -- 1
  WHEN "0010"=>segm<="0010010";  -- 2
  WHEN "0011"=>segm<="0000110";  -- 3
  WHEN "0100"=>segm<="1001100";  -- 4
  WHEN "0101"=>segm<="0100100";  -- 5
  WHEN "0110"=>segm<="0100000";  -- 6
  WHEN "0111"=>segm<="0001111";  -- 7
  WHEN "1000"=>segm<="0000000";  --  8
  WHEN "1001"=>segm<="0000100";  -- 9
  WHEN "1010"=>segm<="0000010";  -- A
  WHEN "1011"=>segm<="1100000";  -- b
  WHEN "1100"=>segm<="0110001";  -- C
  WHEN "1101"=>segm<="1000010";  -- d
  WHEN "1110"=>segm<="0010000";  --  E
  WHEN "1111"=>segm<="0111000";  -- F
  WHEN OTHERS=>segm<="0000000"; -- mögliche andere Fälle
  END CASE;
END IF;
END IF;
END PROCESS;
-- Verbinde die internen Zähler mit den Ausgängen  
  a <= segm (6);
  b <= segm (5);
  c <= segm (4);
  d <= segm (3);
  e <= segm (2);
  f <= segm (1);
  g <= segm (0);
END Behavioral;

Autor: Duke Scarring (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Halberraum:
Hast Du eine funktionieren VHDL Testbench dazu?

Autor: Hubert Fischer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du hast noch immer zwei verschieden sensitive Resets:

Prozess 2: IF reset = '0' THEN ....

Prozess 3: IF (reset = '1') then ....

In dem Fall zählt er und dekodiert nicht oder umgekehrt.

Gruss, Hubert

Autor: Halberraum (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
die passenden Warnungen:
WARNING:HDLParsers:1406 - "D:/Probe-Simulation/Probe/counter_updown.vhd" 
Line 65. No sensitivity list and no wait in the process
WARNING:Xst:819 - "D:/Probe-Simulation/Probe/counter_updown.vhd" line 
67: One or more signals are missing in the process sensitivity list. To 
enable synthesis of FPGA/CPLD hardware, XST will assume that all 
necessary signals are present in the sensitivity list. Please note that 
the result of the synthesis may differ from the initial design 
specification. The missing signals are:
   <clk>
WARNING:Xst:819 - "D:/Probe-Simulation/Probe/counter_updown.vhd" line 
65: One or more signals are missing in the process sensitivity list. To 
enable synthesis of FPGA/CPLD hardware, XST will assume that all 
necessary signals are present in the sensitivity list. Please note that 
the result of the synthesis may differ from the initial design 
specification. The missing signals are:
   <reset>
WARNING:NgdBuild:1012 - The constraint <INST "/" KEEP_HIERARCHY = TRUE> 
is
   overridden on the design object sieben_segment by the constraint 
<INST "/"
   KEEP_HIERARCHY = TRUE>.
WARNING:NgdBuild:1012 - The constraint <INST "/" KEEP_HIERARCHY = TRUE> 
is
   overridden on the design object sieben_segment by the constraint 
<INST "/"
   KEEP_HIERARCHY = TRUE>.
WARNING:NgdBuild:1012 - The constraint <INST "/" KEEP_HIERARCHY = TRUE> 
is
   overridden on the design object sieben_segment by the constraint 
<INST "/"
   KEEP_HIERARCHY = TRUE>.

Autor: Halberraum (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich spiele alles direkt auf ein Demoboard.

Autor: Halberraum (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mit der kleinen Änderung des Resets im Prozess 3 habe ich das Programm 
zum Laufen gebracht. DANKE, Ihr seit klasse!!!
library IEEE;
  use IEEE.std_logic_1164.all;           -- importiere std_logic types
  use IEEE.std_logic_arith.all;         -- importiere add/sub vom std_logic_vector
  use IEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITY sieben_segment IS
  PORT ( -- Eingänge
      clk               : IN  std_logic;      -- Eingangstakt
      reset              : IN  std_logic;      -- Zähler Rücksetzeingang
    --  updown             : IN  std_logic;      -- Zählrichtung up/down
      -- Ausgänge 
      a, b, c, d, e, f, g  : OUT std_logic);     -- Eingänge der 7-Segment-Anzeige
END sieben_segment;

ARCHITECTURE Behavioral OF sieben_segment IS
-- interne Signal Deklaration
  SIGNAL teiler: integer range 0 to 999999;       -- Signal teiler deklariert: Mit diesem Wert kann aus 1MHz Sekundentakt gemacht werden
  SIGNAL clk_neu : std_logic := '0';            -- Neues Taktsignal
  SIGNAL DD : std_logic_vector(3 DOWNTO 0);        -- Zähler - Mehrbitvektor 
  SIGNAL segm: STD_LOGIC_VECTOR(6 DOWNTO 0);      -- Segmente der 7-Segment-Anzeige - Mehrbitvektor

BEGIN

PROCESS BEGIN                             -- FREQUENZTEILER
wait until rising_edge(clk);                  -- Warten auf ansteigende Flanke des Taktsignals clk.
if (teiler<999999) then                    -- Wenn teiler kleiner als 999999 dann
    teiler   <= teiler+1;                  -- wird teiler der Wert teiler+1 zugewiesen und
    clk_neu <= '0';                      -- clk_neu wird der Wert 0 zugewiesen
  else                                -- sonst
    teiler   <= 0;                        -- wird teiler der Wert 0 und
    clk_neu <= '1';                      -- clk_neu der Wert 1 zugewiesen
  end if;
END PROCESS;

PROCESS BEGIN                                -- VORWÄRTSZÄHLER
WAIT UNTIL rising_edge(clk);                          -- warten auf ansteigende Flanke von clk_neu(0->1)
IF (clk_neu='1') THEN                         -- Wenn 1 Sekunde vorbei dann
    IF reset = '0' THEN                        -- WENN reset den Wert Null hat DANN
      DD <= (others => '0');                    -- setze alle Zählerbits auf Null
    ELSE                                  -- SONST
      DD <= CONV_STD_LOGIC_VECTOR(UNSIGNED(DD) + 1, 4);  -- DD nach oben zählen: n, n+1, n+2, ..., 15, 0, 1, ...
    END IF;
  END IF;
END PROCESS;

PROCESS BEGIN                            -- BCD_DECODER
IF (reset = '0') then                      -- WENN Signal reset den Wert 1 hat DANN
         segm <= "0000000";                  -- weise segm den Wert 0000000 zu
      elsif (clk'event and clk = '1') then          -- SONST WENN warten auf ansteigende Flanke von clk_neu(0->1) DANN
if (clk_neu='1') then                      -- Wenn 1 Sekunde vorbei dann
  CASE DD IS                            -- Fallunterscheidung -> Wenn Kontrollausdruck DD
  WHEN "0000"=>segm<="0000001"; -- 0               den Testausdruck 0000 hat dann weise segm den Wert 0000001 zu, us.w.
  WHEN "0001"=>segm<="1001111";  -- 1
  WHEN "0010"=>segm<="0010010";  -- 2
  WHEN "0011"=>segm<="0000110";  -- 3
  WHEN "0100"=>segm<="1001100";  -- 4
  WHEN "0101"=>segm<="0100100";  -- 5
  WHEN "0110"=>segm<="0100000";  -- 6
  WHEN "0111"=>segm<="0001111";  -- 7
  WHEN "1000"=>segm<="0000000";  --  8
  WHEN "1001"=>segm<="0000100";  -- 9
  WHEN "1010"=>segm<="0000010";  -- A
  WHEN "1011"=>segm<="1100000";  -- b
  WHEN "1100"=>segm<="0110001";  -- C
  WHEN "1101"=>segm<="1000010";  -- d
  WHEN "1110"=>segm<="0010000";  --  E
  WHEN "1111"=>segm<="0111000";  -- F
  WHEN OTHERS=>segm<="0000000"; -- mögliche andere Fälle
  END CASE;
END IF;
END IF;
END PROCESS;
-- Verbinde die internen Zähler mit den Ausgängen  
  a <= segm (6);
  b <= segm (5);
  c <= segm (4);
  d <= segm (3);
  e <= segm (2);
  f <= segm (1);
  g <= segm (0);
END Behavioral;

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
> und funktioniert immer noch nicht...
Mach mal eine Testbench, dann kommst du bald auf das "WARUM?"
Bei mir gehts... :-/

Um auf Duke Scarrings Frage zurückzukommen:
Hast du auch eine UCF-Datei?

EDIT:
> Mit der kleinen Änderung des Resets...
Allerdings hast du etliche Warnungen des Synthesizers einfach ignoriert. 
Daran solltest du noch arbeiten...  :-/

Autor: Boris M. (borism)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Auch verwendst du im letzten Prozess noch einen asynchronen Reset, im 
Prozess davor aber einen synchronen.

Ich würde an deiner Stelle den Code nochmal überarbeiten -> jetzt weisst 
du ja, dass das Prinzip richtig ist...

Autor: Halberraum (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe die kombinatorische Version von kmiller gerade getestet auf dem 
Demoboard. Es zeigt nur eine Null an und startet nicht den Zählvorgang.
Fehlermeldungen kamen keine.

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

Bewertung
0 lesenswert
nicht lesenswert
> Es zeigt nur eine Null an
Mit dem richtigen Pegel am Reset geht das...
Oder mach den Reset ganz raus.

> Fehlermeldungen kamen keine.
Das ist wichtig ;-)

Autor: Halberraum (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe versucht den Reset auf 1 oder 0 zu setzen. Bei keinen der 
Varianten fängt er an zu zählen.

Und der Reset-Eingang sollte drin bleiben...

Autor: Hubert Fischer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Laut deinem Posting wo es funktioniert ist dein Reset Low Sensitiv. Da 
du den Code von Lothar verwendest muss der Prozess 2 wiefolgt 
funktionieren:
PROCESS BEGIN                   
  WAIT UNTIL rising_edge(clk);  
  IF (clk_neu='1') THEN         
    IF reset = '0' THEN    -- Polarität Reset                
      DD <= (others => '0');             
    ELSE                                 
      DD <= DD+1;  ---- wenn schon  std_logic_arith, dann so
------      DD <= CONV_STD_LOGIC_VECTOR(UNSIGNED(DD) + 1, 4);  
    END IF;
  END IF;
END PROCESS;

Also den auskommentieren reset einkommentieren! Den anderen löschen.

Autor: Halberraum (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Leider geht das auch nicht.(hatte ich ja bereits geschrieben)

Mir ist aufgefallen, dass wenn ich IF reset = '0' THEN  schreibe, der 
svf-File um mehr als das doppelte größer wird als sonst.

Autor: Boris M. (borism)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
spätestens jetzt würde ich an eine Testbench denken...
(die Tools gibts es ja für lau und der Zeitaufwand ist sehr gering)

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

Bewertung
0 lesenswert
nicht lesenswert
> Leider geht das auch nicht.(hatte ich ja bereits geschrieben)
Hast du das schon wieder auf 999999 korrigiert?
  if (teiler<99) then                   
Ich hatte den Wert nur für die Simulation so niedrig angesetzt.

> Mir ist aufgefallen, dass wenn ich IF reset = '0' THEN  schreibe, der
> svf-File um mehr als das doppelte größer wird als sonst.
Das SVF-File ist ein etwas ungeeigneter Ort, um die auslastung eines 
FPGAs festzustellen. Dafür gibt es entsprechende Analysetools.

Autor: Halberraum (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Alles klar!

Das war der Fehler

DANKE

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.