Forum: FPGA, VHDL & Co. 5I25 von Mesa Electronics modifizieren


von Armin S. (arminst)


Lesenswert?

Hallo,

hat jemand schon mal mit dem 5I25-FPGA-Board von Mesa Electronics 
gearbeitet? (kostet rund 100 Euro, sieht professionell aus, mit SPARTAN6 
FPGA, wird in Deutschland von Lascar Electronics verkauft)

Ich versuche z.Zt. den VHDL-Code der Motion-Control-Algorithmen zu 
entfernen, um Platz für meine Applikation zu schaffen.

Es gibt da allerdings ein paar, für mich als Anfänger nicht direkt 
nachvollziehbare, Probleme .. z.B.:

Die Parity-Routine wird mit IPar <= parity(AD&NCBE&'0'); gerufen.

Warum hier mit '0' ver-undet wird ist mir nicht verständlich ...

Der Code der Routine ist:

package parity is
  function parity(data : std_logic_vector) return std_logic;
end parity;

package body parity is

  function parity(data: std_logic_vector) return std_logic is
  variable p : std_logic := '0';

  begin
    for i in data'right to data'left loop
      p := p xor data(i);
    end loop;
    return(p);
  end;

end parity;

Es wird allerding beim Synthesize diese Warnung ausgegeben:

Line 79: Range is empty (null range)

 und bezieht sich auf die Zeile "for i in data'right to data'left loop"

Wie ist denn das zu interpretieren ?

--Armin

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


Lesenswert?

Armin Steinhoff schrieb:
> function parity(data: std_logic_vector) return std_logic is
Ein unconstrained std_logic_vector ist definiert als 0 to x.
Konkret hat ein 8-Bit-Vektor dann den range 0 to 7.
Links steht die 0 und rechts die 7...

>     for i in data'right to data'left loop ...
Blöd also, dass hier dann steht:
     for i in 7 to 0 loop ...

Schreib das mal so:
     for i in data'range loop ...

> parity(AD&NCBE&'0')
> Warum hier mit '0' ver-undet wird
Die '0' wird nicht verundet, sondern an die anderen Bits angehängt. 
Der Vektor wird damit ein Bit länger. Das ist eine Concatenation...

In VHDL wird mit dem Schlüsselwort and verundet.

> ist mir nicht verständlich ...
Diese "Vektorverlängerung" mit der '0' ist unnötig. Die '0' ändert 
jedenfalls nichts am Ergebnis...

von Armin S. (arminst)


Lesenswert?

Lothar Miller schrieb:
> Armin Steinhoff schrieb:
[clip]
>
> Schreib das mal so:
>      for i in data'range loop ...

Brilliant ... das löst das Problem.

>
>> parity(AD&NCBE&'0')
>> Warum hier mit '0' ver-undet wird
> Die '0' wird nicht verundet, sondern an die anderen Bits angehängt.
> Der Vektor wird damit ein Bit länger. Das ist eine Concatenation...

Muß ich wohl noch verinnerlichen :)

Danke für die Kommentare.

--Armin

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


Lesenswert?

Armin Steinhoff schrieb:
>>> parity(AD&NCBE&'0')
>>> Warum hier mit '0' ver-undet wird
>> Die '0' wird nicht verundet, sondern an die anderen Bits angehängt.
>> Der Vektor wird damit ein Bit länger. Das ist eine Concatenation...
> Muß ich wohl noch verinnerlichen :)
Nehmen wir mal so ein Signal:
1
signal sig : std_logic_vector(7 downto 0);
Das ist z.B. ein Linksshift um 1 Bit:
1
    sig <= sig(6 downto 0) & '0';
Das ist ein Rotate Left:
1
    sig <= sig(6 downto 0) & sig(7);
So geht ein Rotate Right:
1
    sig <= sig(0) & sig(7 downto 1);
Hier werden die Nibbles getauscht:
1
    sig <= sig(3 downto 0) & sig(7 downto 4);

von Armin S. (arminst)


Lesenswert?

Lothar Miller schrieb:
> Armin Steinhoff schrieb:
>>>> parity(AD&NCBE&'0')
>>>> Warum hier mit '0' ver-undet wird
>>> Die '0' wird nicht verundet, sondern an die anderen Bits angehängt.
>>> Der Vektor wird damit ein Bit länger. Das ist eine Concatenation...
>> Muß ich wohl noch verinnerlichen :)
> Nehmen wir mal so ein Signal:
>
1
> signal sig : std_logic_vector(7 downto 0);
2
>
> Das ist z.B. ein Linksshift um 1 Bit:
>
1
>     sig <= sig(6 downto 0) & '0';
2
>
> Das ist ein Rotate Left:
>
1
>     sig <= sig(6 downto 0) & sig(7);
2
>
> So geht ein Rotate Right:
>
1
>     sig <= sig(0) & sig(7 downto 1);
2
>
> Hier werden die Nibbles getauscht:
>
1
>     sig <= sig(3 downto 0) & sig(7 downto 4);
2
>

Interessant ... hätte dem & Operator angewendet auf Vectoren nicht diese 
Semantik unterstellt.

Danke

--Armin

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.