with select / case - Frage

#3373418
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.
#3374257
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.
Gast #3377197
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren