VHDL Post-Synthesis Simulation liefert falsche Werte

Empa

Cadet 4th Year
Registriert
Juni 2010
Beiträge
82
Hey,
ich muss mich bezüglich meiner Diplomarbeit in VHDL einarbeiten. Leider hatten wir nie etwas in der Richtung gehabt, also musste ich es mir selber beibringen.
Nun habe ich Code für ein VGA Controller geschrieben, welcher leider nicht funktionierte. Also reduzierte ich die komplexität auf nur einen einfachen Counter, welcher nach 2 sekunden die LEDS toogelt. Lauft Behavior Simulation funktioniert das alles ohne Problem. Leider machen die Post-Synthesis und Post-Implemantation Simulation nicht mit (daher beim aufspielen auf den FPGA passiert auch nichts). Habe auch schon eine andere Software fürs Simulieren probiert ohne Erfolg :(
Könnte mir bitte einen Stoß in die richtige Richtung geben bzw. mir sagen warum das nicht funktioniert?
Sitze jetzt schon nen Stück dran und verzweifle langsam...

FPGA: Zynq-7000 series (Zedboard)
Suite: Vivado 2013.3 / ModelSim zur überprüfung

Code:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;


use IEEE.NUMERIC_STD.ALL;



entity ClockLED is
    Port (  
            --CLK : in std_logic;       -- only in non-Simulation
            LEDS : out std_logic_vector(7 downto 0)

    );
end ClockLED;

architecture Behavioral of ClockLED is

type state_LEDS is (CNT1, CNT2, SETLEDS); -- defines the states
signal state_LED : state_LEDS;

signal LEDACTIVE : std_logic_vector(7 downto 0) := "11100011";
signal SUM:integer range 0 to 2000005 := 0;
signal CLK:  std_logic;

begin

---------------CLK Simulation------------
    process
      begin
      wait for 500 ns;
      CLK <= '1';
      wait for 500 ns;
      CLK <= '0';
      
      
    end process;


-------------Counter and toogle--------------
    
    process(CLK)
    
        begin

            if rising_edge(CLK)THEN

                case state_LED is
                    When CNT1 =>
                        
                        if SUM>2000000 then
                            state_LED<=SETLEDS;
                        else
                            SUM <= SUM+1;

                        end if;
                        

                        
                    When SETLEDS =>
                        SUM<=0;
                        LEDACTIVE<= not LEDACTIVE;
                        state_LED<=CNT1;
                        
                    When others =>
                        state_LED<=CNT1;
                        
                end case;
                
            end if;
    
    end process;
    
LEDS<=LEDACTIVE;

end Behavioral;
 
ich könnte mich jetzt irren, aber müsste nicht bei process state_LED auch in der Klammer drin sein ?
damit gibts du ihm doch an welche signale er benutzen soll als eingabe
 
ne in dem process stehen nur die Variablen drinn, auf welche er reagieren (Zustandswechsel) soll um den Code abzuarbeiten.
 
Nachtrag: Sehe gerade, die CLK ist ja als Signal zugeführt... ist schon zu spät für mich ;)

Ich kann mich noch dunkel an meine Digitaltechnik Zeiten erinnern... VHDL war noch nie mein Steckenpferd ^^

Schau mal nach, ob Dinge wie
Code:
wait for 500 ns;
wirklich synthetisierbar sind. Ich kann mich dunkel daran erinnern, dass solche Angaben nur für die Simulation zu gebrauchen waren. Für die reale Schaltung brauchst du für solche Sachen dann einen "echten" Taktgeber... im schlimmsten Fall per manuellem Taster ;)
 
Zuletzt bearbeitet:
Probier mal folgendes aus:


Code:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL; 
use IEEE.NUMERIC_STD.ALL;
  
 
entity ClockLED is
    Port (  
            --CLK : in std_logic;       -- only in non-Simulation
            LEDS : out std_logic_vector(7 downto 0)
 
    );
end ClockLED;

library IEEE;
use IEEE.STD_LOGIC_1164.ALL; 
use IEEE.NUMERIC_STD.ALL;

.....

Wir haben ab und zu Probleme bei der Synthese wenn wir unterhalb der entity die library nicht nochmals neu definieren. Vielleicht hilft es.

Am Code scheint sonst alles richtig zu sein, bzw mir fällt so direkt nichts auf.


Edit:
Das es sich um eine Simulation handelt, sollte aus dieser Zeile hervorgehen:
Code:
 --CLK : in std_logic;       -- only in non-Simulation

Ansonsten ist der Clk Prozess nicht synthetisierbar.
 
Zuletzt bearbeitet:
Der CLK wurde ja eben aufkommentiert, weil es sich um die Simulation handelt.
Ansonsten wird ein 1MHZ peripherie clock angelegt.

@Jomelo
Habe deine Methode probiert. Leider ohne Erfolg.
 
Welche Fehlermeldungen gibt denn die Synthese aus ? Eigentlich kann man sich daraus doch einen reim machen.
 
es ist ja keine Fehler meldung, sondern wird der Counter anscheinend nicht hochgezählt und somit wird der LEDS ausgang nicht getoogelt.
Oder kann es sein das er rausoptimiert wurde?
 
Zuletzt bearbeitet:
Ich grübel gerade. Ans weg optimieren glaub ich nicht so ganz.

Wird denn der Bezeichnung CLK auch wirklich der interne Takt zugewiesen ?


Edit:
Für den FPGA muss man ja noch ein ucf File erstellen mit PlanAHead (genaue Bezeichnung kenn ich gerade nicht).

In diesem File werden soweit mir bekannt, die Ports mit den Bezeichnungen verknüpft.
 
Zuletzt bearbeitet:
Hi,

state_LED ist nicht vorbelegt z.B. mit (signal state_LED : state_LEDS := CNT1), ist aber eigentlich nicht schlimm da im case other abgefangen.

Für den clk Versuchs mal so (clk auch mit '0' vorbelegen):

process(clk)
begin
clk <= not clk after 500 ns;
end process;

Was zeigt Modelsim im Wave-Fenster??
 
Der CLK kriegt sein richtiges Signal in der Behavior Simulation. In den anderen Simulationen muss ich das noch prüfen.
Das UCF file wird wie gesagt in PlanAHead benutzt daher das ich Vivado benutze ist es ein xdc file. Das habe ich soweit angelegt und das funktioniert auch.
Ich kriege die LEDS ja auch zum leuten nur wollen sie nicht toogeln.

@goldmomo
bei den states wird immer der erste Wert vorinitialisiert und muss daher nicht nochmal extra initialisiert werden.
Das Wave-Fenster habe ich noch nicht benutzt nur die standard Simulation.
 
Zuletzt bearbeitet:
Sehe jetzt eigentlich auch kein Problem in deinem Code.

Aber am einfachsten ist bei der Simulation einfach deine Signal selektieren und 'Add Wave' machen.
Dann Simluation starten und du wirst dein Problem sehen.

P.s.:
Bin auch gerade auf Bug-Suche:
modelsim.png
 
achso meinst du das. Ja das habe ich soweit gemacht. Da geht es ja aber eben. Dort wird auch nach 2 sec meine LEDS getoogelt. Soweit wie du bin ich noch nicht freue mich aber schon drauf :(

Hier wie es sein soll
Unbenannt.jpg
 
Zuletzt bearbeitet:
Wenn es in der Simulation funktioniert (siehst das Led-Toggle im Wave-Fenster), dann hast wohl eher ein Problem mit der Hardware.
Entweder dein Clock ist nicht ok (wo kommt der her? PLL?) oder dein Pin-Assignment hat ein Problem?

Ich kenne mich leider nur mit Altera aus (machs VHDL auch nur zum Spass), aber die Xilinx Tools müssen auch eine Timing Analyse machen (was sagt der).
Ist dein Pin-Assignment ok (siehst zumindest die 11100011 bei den LEDS)?
 
Die 11100011 werden so an den LEDS ausgegeben.
Der Clock kommt von einem IO PLL und geht dann direkt an den Eingang.
Aber wie gesagt geht es leider schon in der Post-implementation bzw der Post-Synthesis Simulation nicht richtig.
Das ist ja der teil, der mich so wurmt.
Die timing analyse werde ich testen.
 
Der Code ist 100% ok (habs auch mal schnell mit Modelsim getestet).
Es bleibt also nur der Clock Eingang (wie hoch ist der Takt??? Locked die PLL) als Fehlerursache wenns auf der Hardware nicht läuft.
 
Der Clock ist auf 1 MHZ gesetzt und wird auch als 1 MHZ erzeugt siehe Bild.
Aber für die Simulation ist das doch eh egal, da ich den Clock doch quasi im Code erzeuge oder?

Unbenannt.jpg
 
In der Simulation ist das egal (bei Modelsim, ich habe keine Ahnung von den Xilinx zeug), das kannst den Clock mit wait for XXX ns erzeugen. In der Hardware brauchst halt einen richtigen Clock Eingang (da geht nicht wait for ...).

Davon mal abgesehen braucht auch die PLL einen Clock als Eingang (!), dann muss man auch aufpassen ob die PLL den Eingangs-Takt auch zu den Ausgangs-Takt umsetzen kann (die PLL Divider beschränkungen).
 
Die PLL hat auch einen Clock als eingang. Man kann dann aber für die verschiedenen Clocks eine Frequenz einstellen und diese wird durch die devider eingestellt. Somit kriegt man dann den ausgangsclock.

Das die wait for nur für die Simulation ist mir bewusst. Jedoch wenn noch nicht mal die Simulation geht kann es ja nicht an den zu einstellen Clock liegen.

Habe leider auch kein Oszi hier damit ich ein paar Debug Signale auf nen Pin ziehen kann.
 
Zuletzt bearbeitet:
Also bei mir (mit Modelsim altera starter edition 10.1d) funktioniert dein Code (ich sehe den LED toggle).

Ich habe leider keine Ahnung warum bei dir die Simulation nicht funktioniert, der Code ist ok, wird wohl irgend ein Problem mit irgendwelchen Einstellungen sein. Vielleicht fragst mal auf http://www.mikrocontroller.net (im FPGA Forum), vielleicht können die dir helfen (da sind auch viele Leute die sich mit Xilinx Software auskennen).
 

Ähnliche Themen

Zurück
Oben