mikrocontroller.net

Forum: FPGA, VHDL & Co. while syntax in vhdl


Autor: will wissen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich versuche eine einfache Ausschaltverzögerung mit vhdl zu beschreiben.
wenn das Eingangssignal auf Low geht sollen 19 Takte gewartet werden bis 
das Ausgangssignal auf low geht.

Um die Takte zu zählen habe ich es mit einer while loop versucht.
Doch die Syntax stimmt irgendwie nicht.

Bitte um Hilfe!!!

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;

entity off_del is

port( 
  inp: in std_logic;
  clk: in std_logic;  
  outp: out std_logic);  
  
end;

architecture behavioral of off_del is

signal counter : std_logic_vector (5 downto 0) := "000000";

begin

process(inp)

  begin 
  counter <= (others => '0');
  
    if falling_edge(inp)then

      while  counter < 20 loop

        if rising_edge(clk)then
        counter <= counter + 1;
        end if;

      end loop;
    

    outp <= '0';

    else

    outp <= '1';

    end if;

end process;

end behavioral;

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ will wissen

>ich versuche eine einfache Ausschaltverzögerung mit vhdl zu beschreiben.
>wenn das Eingangssignal auf Low geht sollen 19 Takte gewartet werden bis
>das Ausgangssignal auf low geht.

>Um die Takte zu zählen habe ich es mit einer while loop versucht.
>Doch die Syntax stimmt irgendwie nicht.

So geht es auch nicht. Solche Loop sind zur Generierung von parallen 
Logikstrukturen gedacht, aber nciht zu Zählen von Pulsen. Eher so.


process(clk)
begin
  if rising_edge(clk) then

    if din='1' then
      cnt <= "00000";
    elsif cnt /=19 then
      cnt <= cnt+1;
    end if;

    if cnt=19 then
      dout <='0';
    else
      dout <='1';
    end if;

  end if;
end process;

MfG
Falk

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Lass ihn doch, er könnte doch 19 solcher Strukturen bauen, die alle auf 
einander warten. So wird parallele Hardware wieder resequentialisiert 
und erfüllt die Anforderungen moderner Hardwareentwicklung (durch 
Softwerker).

Ich freue mich immer, wenn ich sowas antreffe.

Autor: will wissen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für die Antworten und das Beispiel,
geht super.

als absoluter Neuling in vhdl hab ich das zwar noch nicht verstanden 
warum da parallele Hardware aufgebaut wird.

Mit einem µC in C wäre eine while loop zu diesem zweck jedenfalls ok.
Vhdl ist dann doch nicht wie C, werd wohl noch etwas üben müssen.
mfg

Autor: Hans Kummer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich bin gerade dabei VHDL zu lernen und wollte zu der While Schleife mit 
einem Vektor als Bedingung was wissen.

signal countout:  std_logic_vector(4 downto 0) := (others => '0');
signal enableout:   std_logic := '0';
begin

  process(clk, rst)
  begin

        if(rising_edge (clk)) then

     if (enableout = '1') then

              while(countout /= 10) loop

    countout <= countout + "00001";

        end loop;
          end if;
         end if;
end process;
end behave;

So sieht ein Abschnitt meines Programms aus und wenn ich im Wave mir die 
Signale anschaue, bleibt das Programm genau dort hängen. Es scheint als 
ob ich in einer Endlosschleife wäre. Das Programm sollte mit 
ansteigender Flanke die Variable countout hoch bis 10 zählen.

Ich würde gerne wissen ob es möglich ist als Bedingung in der While 
Schleife Vektoren zu benutzen und was in meinem Quellcode falsch ist.

Autor: iulius (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
lies dir doch einfach mal die Beiträge über deinem durch dann weist du 
auch warum das nicht geht.

Was du hier versuchst wäre ein busy waiting und das geht nunmal in der 
hardware so nicht.

mach aus dem while einfach ein if und alles ist gut :

if (countout < 10) then
    countout <= countout + "00001";
end if;

dann wird das 10 takte lang ausgeführt bis countout auf 10 ist.

Autor: dave (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
nehmt bitte keine while-loops in vhdl ! das funktioniert zwar in der 
simulation, beim synthetisieren gibt es aber probleme.

eine schleife in vhdl wird ja nicht wie in c seriell abgearbeitet, 
sondern in hardware "ausgerollt". die anzahl der schleifendurchgänge 
muss also bekannt sein. dies kann man nur sinnvoll mit einer 
for-schleife erreichen.

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

Bewertung
0 lesenswert
nicht lesenswert
> nehmt bitte keine while-loops in vhdl
Allgemein gilt:
Liebe Softwerker, eine Schleife (loop) in der Beschreibungssprache VHDL 
macht umgesetzt in Hardware nicht das, was eine Schleife in einer 
prozeduralen Programmiersprache (Basic, C,...) macht.
Wenn ihr zum ersten Mal VHDL macht, dann braucht ihr keine VHDL-Loops. 
Garantiert nicht  :-o

BTW:
Genausowenig braucht ihr die ersten 3 Monate Variablen in Prozessen.

BTW2:
> countout <= countout + "00001";
Mit Vektoren rechnet man nicht.
Dafür gibt es integer und/oder die Datentypen signed bzw. unsigned.
Siehe auch den Beitrag "Re: Schleife in ModelSim"

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.