Forum: FPGA, VHDL & Co. with select / case - Frage


von Felix O. (felixanius)


Lesenswert?

Hallo,

folgender Code:
1
output: process(clk)
2
begin
3
if rising_edge(clk) then
4
      if (rotary_push_use = '1') then
5
    with rotary_push select
6
100        led_pos <=  "00000001" when 0,
7
101                   "00000010" when 1,
8
...                   "00000100" when 2,
9
                   "00001000" when 3,
10
                   "00010000" when 4,
11
                   "00100000" when 5,
12
                   "01000000" when 6,
13
                   "10000000" when 7;
14
      .....

Hier wird mir gesagt: (100) Illegal sequentiell statement

Wenn ich das ganze mit case mache:
1
output: process(clk)
2
begin
3
if rising_edge(clk) then
4
      if (rotary_push_use = '1') then
5
    case rotary_push is
6
          when 0 => led_pos <= "00000001";
7
          when 1 => led_pos <= "00000010"; 
8
          when 2 => led_pos <= "00000100";
9
          when 3 => led_pos <= "00001000";
10
          when 4 => led_pos <= "00010000";
11
          when 5 => led_pos <= "00100000"; 
12
          when 6 => led_pos <= "01000000";
13
          when 7 => led_pos <= "10000000";
14
        end case; 
15
.....

funktionierts. Warum?


Danke.

von Sven P. (Gast)


Lesenswert?

Weil die Konstruktion mit with-select nunmal nicht innerhalb von 
Prozessen stehen darf.

Alternativ zum case könntest du eine bedingte Zuweisung mit 'when' 
benutzen.

von ... (Gast)


Lesenswert?

Er koennte es wahrscheinlich auch voellig nebenlaeufig hinter
den process schreiben.

von Felix O. (felixanius)


Lesenswert?

Aber einen Sinn warum das mit dem with/select nicht geht gibt es nicht 
oder? Das ist einfach von den Synthesetools so festgelegt?

von Christian R. (supachris)


Lesenswert?

Es gibt nun mal im VHDL Standard verschiedene Beschreibungen Prozesse 
und für außerhalb von Prozessen. Außerhalb von Prozessen geht z.B. auch 
kein if-then-else zu verwenden. Da muss man dann when nehmen, was 
wiederum innerhalb eines Prozesses nicht zulässig ist. Zumindest im 93er 
VHDL. Mit VHDL2008 ist da einiges etwas freier geworden.

von FPGA-Vollprofi (Gast)


Lesenswert?

Bei the WITH-Kontrukt kann man halt keinen Takt ins Spiel bringen. Das 
ist ein statischer Multiplexer. Bei CASE kann man verschachteln und 
zeitliche Abhängigkeiten verwenden, womit erst klassische State Machines 
möglich werden.

Im Prinzip kann man sich das WITH sparen, wie so viele Sachen in VHDL 
gibt es mehrere Wege nach ROM.

von Fpgakuechle K. (Gast)


Lesenswert?

Felix O. schrieb:
> Aber einen Sinn warum das mit dem with/select nicht geht gibt es nicht
> oder? Das ist einfach von den Synthesetools so festgelegt?

Doch, denn gibt es. Das eine ist ein sequentielles Konstrukt, 
(nacheinander abarbeiten der Bedingungen) das anders ein paralleles 
(concurruent), bedingungen werden gleichzeitig abgearbeitet.

Bei der uC programmierung ist fast alles sequential, alle Befehle werden 
nacheinander abgearbeitet, in der Hardware dagegen gibt bei der 
Beschreibung von Kombinatorik (Logikgatter) den Fall das alle bedingung 
gleichzeitig abgearbeitet werden.

In Hardwarebeschreibungssprachen wird also nicht nur die Abbildung 
Ausgangvector = F(Eingangsvektor) beschrieben, sondern auch wie diese 
Abbildung in der Zeitebene gebildet wird.

bei einem Process kann man festlegen mit welchen signal der Process 
abgearbeitet wird (wenn das in der senseliste sich ändert); bei with .. 
select werden die bedingungen immer dann abgecheckt und abgearbeit wenn 
sich das Signal hinter with ändert.

Man kann es so verkürzen,

alles wo FF im Spiel sind (FSM) -> Process(clk) mit case
reine kombinatorik bspw encoder -> ausserhalb Process mit with oder
                                   Process mit allen encode eingängen in 
der sense liste und case im process.

MfG

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.