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


von will wissen (Gast)


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!!!

1
library ieee;
2
use ieee.std_logic_1164.all;
3
use ieee.std_logic_arith.all;
4
use ieee.std_logic_unsigned.all;
5
6
entity off_del is
7
8
port( 
9
  inp: in std_logic;
10
  clk: in std_logic;  
11
  outp: out std_logic);  
12
  
13
end;
14
15
architecture behavioral of off_del is
16
17
signal counter : std_logic_vector (5 downto 0) := "000000";
18
19
begin
20
21
process(inp)
22
23
  begin 
24
  counter <= (others => '0');
25
  
26
    if falling_edge(inp)then
27
28
      while  counter < 20 loop
29
30
        if rising_edge(clk)then
31
        counter <= counter + 1;
32
        end if;
33
34
      end loop;
35
    
36
37
    outp <= '0';
38
39
    else
40
41
    outp <= '1';
42
43
    end if;
44
45
end process;
46
47
end behavioral;

von Falk B. (falk)


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

von Matthias (Gast)


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.

von will wissen (Gast)


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

von Hans Kummer (Gast)


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.

von iulius (Gast)


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.

von dave (Gast)


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.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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"

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
Noch kein Account? Hier anmelden.