mikrocontroller.net

Forum: FPGA, VHDL & Co. Quartus 18.0


Autor: Student (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

ich ersuche eure Hilfe und zwar habe ich mich vor kurzem mit VHDL und 
Quartus beschäftigt und bin auf ein komisches Verhalten vom Quartus 
gestoßen und zwar wenn der Ausgangszustand sein Wert nicht veränder wird 
kein Design erstellt. Kann man irgend-wo dem Kompiler sagen, dass er 
dies nicht tun soll?

Gruss
A
 library IEEE;
 use IEEE.STD_LOGIC_1164.ALL;
 use IEEE.numeric_std.all;
 
 entity blink2 is
    Port ( 
           clk : in  std_logic;
           LED : out std_logic
    );
 end blink2;
 
 architecture RTL of blink2 is
    constant max_count : natural := 48000000;
    signal Rst : std_logic;
   
 begin

    Rst <= '0';

compteur1 : process
  variable count : natural range 0 to max_count;
    begin
      wait until rising_edge(clk);
      if Rst = '1' then
        count := 0;
        led <= '1';
      elsif rising_edge(clk) then
        if count < max_count/2 then
           count := count + 1;
           led <= '1';
        elsif count < max_count then
           led <= '0';
           count := count + 1;
        else
           led <= '1';
           count := 0;
        end if;
      end if;
    end process compteur1; 
  
 end RTL;

dabei wird etwas generiert, wenn ich aber nur eine Zeile auskommentiere 
dann erzeugt der Kompiler nichts und gibt keine Fehlermeldung aus:
 library IEEE;
 use IEEE.STD_LOGIC_1164.ALL;
 use IEEE.numeric_std.all;
 
 entity blink2 is
    Port ( 
           clk : in  std_logic;
           LED : out std_logic
    );
 end blink2;
 
 architecture RTL of blink2 is
    constant max_count : natural := 48000000;
    signal Rst : std_logic;
   
 begin

    Rst <= '0';

    compteur1 : process
      variable count : natural range 0 to max_count;
    begin
      wait until rising_edge(clk);
      if Rst = '1' then
        count := 0;
        led <= '1';
      elsif rising_edge(clk) then
        if count < max_count/2 then
           count := count + 1;
           led <= '1';
        elsif count < max_count then
           --led <= '0';
           count := count + 1;
        else
           led <= '1';
           count := 0;
        end if;
      end if;
    end process compteur1; 
  
 end RTL;


Autor: Sigi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Student schrieb:
> wenn ich aber nur eine Zeile auskommentiere
> dann erzeugt der Kompiler nichts und gibt keine Fehlermeldung aus:

Btw, wenn kein Fehler da ist, dann wird auch keine Meldung
ausgegeben, warum auch?

Zu "nichts": Da Counter etc. in Deinem Desing ja
nicht gebraucht werden, werden sie vom Compiler
vollständig entfernt. Das ist nicht komisch, sonder
sehr gut! Schau Dir aber mal die Ausgangspins im
ChipPlaner an. Da diese ja einen (konstanten) Wert
treiben, müssen sie auch intern so beschaltet sein.

Autor: Donni D. (donnidonis)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie schon angemerkt, genau so soll es auch sein. Was willst du denn 
sonst als Ergebnis haben, einen Zähler der zählt und nichts macht?
Für alles andere kannst du ModelSim nutzen und gucken ob es generell 
funktioniert, aber halt nur Simuliert

Autor: Lothar M. (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Student schrieb:
> zwar wenn der Ausgangszustand sein Wert nicht veränder wird kein Design
> erstellt.
Wenn man von dem Design an den FPGA Pins nichts "merkt", weil sie sich 
nie ändern, dann wird das Design so optimiert, dass die Pins einfach den 
richtigen Pegel haben.
Und wenn es da keine Vorgabe gibt, dann werden sie auf irgendeinen Pegel 
geklemmt.

Das passiert aber erst spät im Designprozess. Den RTL Schaltplan, den 
dein Synthesizer erzeugt, kannst du trotzdem noch anschauen...

BTW:
>>  variable count : natural range 0 to max_count;
Ich würde da ein Signal nehmen und das zudem noch mit einem Startwert 
initialisieren.
Dazu der Klassiker: Beitrag "Variable vs Signal"

: Bearbeitet durch Moderator
Autor: Weltbester FPGA-Pongo (Gast)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
Student schrieb:
> ich ersuche eure Hilfe und zwar habe ich mich vor kurzem mit VHDL und
> Quartus beschäftigt und bin auf ein komisches Verhalten vom Quartus
> gestoßen

Das Verhalten ist deshalb nicht komisch, weil es so definiert ist, eine 
Schaltung über die Funktion zu definieren und denn du Teile dieser 
Definition nicht gibts, dann kommt nicht das Gewünschte raus.

Stell dir vor, du beauftragst deine Tochter damit, Zum Supermarkt zu 
fahren, Waren in den Korb zu legen und zu bezahlen. Wenn du dann 
vergisst, sie zu beauftragen, Dir was vpr die Türe zu legen, dann 
vereinfacht sie deine Aufgabe dahingehend, dass sie sich das Auto 
schnappt und das Gald in der Disco verprasst.

Das Ergebnis ist dasselbe: Du hast das bekommen, was du abgefragt hast, 
nämlich nichts.

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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.