Forum: FPGA, VHDL & Co. Fragen zum Datentyp boolean


von Andi Z. (duderino65)


Lesenswert?

hallo,

ich habe eine frage zum boolean datentyp in vhdl.
mir ist aufgefallen dass ich diesen datentyp in 2 oder evtl auch in 
mehreren prozessen ändern kann. (natürlich nicht gleichzeitig)

ich habe es mit einem std_logic typ versucht wobei der compiler ja schon 
schreit. beim boolean typ gibt es keine meldung.
lieg ich da richtig, dass ich bool'sche typen in mehreren prozessen 
ändern kann? also wie ne art semaphore?!

ich habe das auch durch ein bsp-programm ausprobiert und möchte da doch 
noch eure meinung hören.

verwende den MachXO von lattice und habe ispLEVER 7.2

hier mal das bsp-programm:
1
architecture arch_led of led is
2
  signal EN : boolean := false;
3
begin
4
  process  
5
  begin  
6
    if rising_edge(clk) then
7
      if EN = true then      
8
        EN<= false;
9
      end if;
10
    end if;
11
      wait for 1000 ms;
12
  end process;
13
14
  process
15
  begin
16
    if rising_edge(clk) then
17
     if EN = false then
18
      EN <= true;
19
     end if;  
20
    end if;
21
    wait for 1000 ms;
22
  end process;
23
24
  with EN select
25
    led <= '1' when true;
26
    led <= '0' when false; 
27
...

nach dem routing oder vllt noch davor meldet der compiler
       logical net 'clk' has no load
somit kann ich dann das signal auch nicht einem clk-pin des MachXO 
zuweisen. woran liegt das denn? daran dass ich keine sensitivity-list 
verwende??

mfg

andi

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


Lesenswert?

std_logic kann nur von einem (in Zahlen 1) Prozess getrieben werden. 
Deine Beschreibung wird in einem "multiple source" Fehler resultieren.

Mit boolean wirst du das bestenfalls noch simuliert bekommen. Bei der 
Erzeugung von Hardware wirst du dann aber den selben Fehler erhalten.

Viel schlimmer ist das:
1
  wait for 1000 ms;
Sowas wird der Synthesizer einfach ignorieren. Zeiten können nicht 
synthetisiert werden. Um eine Zeit zu reaslisieren, brauchst du einen 
Zähler.

von Nephilim (Gast)


Lesenswert?

dieses konstrukt ist doch durch das "wait for ..." eh nicht 
synthetisierbar. und ja, bei einer rising_edge abfrage muss das signal 
eigentlich auch in der sensitivity-list stehen.

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


Lesenswert?

> liegt das daran dass ich keine sensitivity-list verwende??
Das kann durchaus die Ursache für deinen fehlenden clock sein.

> dass ich keine sensitivity-list verwende??
Das bedeutet, dass zudem deine Simulation falsch sein wird.

Du hast ziemlich grundlegende Probleme mit dieser Beschreibung, der 
clock ist das Kleinste davon  :-o

von Andi Z. (duderino65)


Lesenswert?

ok, danke.

gibt es den eine möglichkeit sowas wie semaphoren in vhdl zu realisieren 
ausser das ganze mit case-states zu machen?? also dass mein 2.prozess 
erst beginnt wenn er die erlaubnis des 1. prozesses bekommt.

mfg andi

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


Lesenswert?

Du setzt ein Enable Signal im ersten Prozess, und wenn der 2. Prozess 
gestartet wurde, nimmst du im ersten Prozess das Enable wieder weg. Das 
läuft umgangssprachlich unter "Handshake"...

von Thomas R. (Firma: abaxor engineering) (abaxor)


Lesenswert?

Hallo,

bei deinem Beispiel fehlt zwar die Deklaration der Entity, trotzdem 
würde ich sagen, dass du kein Ausgangssignal treibst, zumindest hängt 
von EN kein Ausgangssignal ab. Darum ist keine Logik in deinem MACHX0, 
es wird alles weg optimiert. Somit wird das Clk-Signal nicht genutzt.

Tom

von Andi Z. (duderino65)


Lesenswert?

naja ich treibe eigentlich eine led die ja am port angeschlossen ist. 
diese kann ich ja auch zuweisen. das war ja auch nur ein beispiel womit 
ich das mit dem boolean datentyp testen konnte.

mfg

andi

von nixda (Gast)


Lesenswert?

hi,

signals mit unresolved typen (zb. _ulogic) koennen nur einen treiber 
haben, d.h. die koennen nur aus einem process oder parallel logic 
getrieben werden. resolved types koennen aus beliebig vielen quellen 
getrieben werden, vhdl/simulator uebernehmen fuer dich die driver 
resolution (sodass 0+1->X, und Z+1->1,... wird)

boolean ist definiert in std standard und muesste unresolved sein.

'semaphore' ist etwas anderes, resolved/unresolved sind statische 
eigenschaften.

regards/mfg

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


Lesenswert?

> das war ja auch nur ein beispiel womit
> ich das mit dem boolean datentyp testen konnte.
Wie schon gesagt: es liegt nicht am boolean :-/

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.