mit sll shiften

Gast #1965216
Lesenswert?

Hallo,

ich versuche einen vektor der größe 166 zu füllen, und zwar durch die 
sll funktion. ich will in 5 takte 5 mal 32 bit rein schreiben. wobei ich 
erstmal die Inhalt verschiebe und dann die neuen bits anhänge.
1
if (r.i /= 5) then
2

3
  v.Mem_in := r.Mem_in sll 32;
4
  v.Mem_in(31 downto 0) := config_data;  
5
  v.i := r.i + 1 ;        
6
  else if (r.ready(1) = '0') then
7
  v.Mem_in := r.Mem_in sll 2;
8
  v.Mem_in(1 downto 0) := config_data(1 downto 0);
9
  v.ready(1) := '1';

aber ich bekomme immer einen Fehler: "sll can not have such operands in 
this context."

ich freue mich sehr auf eure Vorschläge.
Danke
Gast #1965786
Lesenswert?

Die Definition von SLL sieht so aus:
1
...
2
package NUMERIC_STD is
3
...
4

5
function "sll" (ARG: UNSIGNED; COUNT: INTEGER) return UNSIGNED is
6
...
7

8
function "sll" (ARG: SIGNED; COUNT: INTEGER) return SIGNED is
9
...
Deine 32 sieht sehr nach integer aus. Aber wie ist v.Mem_in und r.Mem_in 
definiert? SLL nimmt nur unsigned und signed ...

Duke
Moderator (Firma: Titel) Persönliche Seite #1965828
Lesenswert?

Duke Scarring schrieb:
> Die Definition von SLL sieht so aus:
D.h. auch wenn Mem_in ein unsigned oder signed wäre, wäre trotzdem 
der Syntax des Funktionsaufrufs falsch. Besser wäre dann das:
1
v.Mem_in := sll(r.Mem_in,32);

Aber diese unglaubliche Anhäufung von Variablen verleitet mich sehr zur 
Annahme, dass hier ein Softwerker mal Hardware beschreiben will. Dazu 
sollte aber erst mal die Denkweise umgestellt werden...

abumarcel schrieb:
> ich versuche einen vektor der größe 166 zu füllen, und zwar durch die
> sll funktion.
Das ist evtl. die falsche Vorgehensweise. Ich würde hier einen Mux 
nehmen und den Index für den Vektorzugriff entsprechend berechnen. Denn 
nur so wird das dann in der Hardware umgesetzt werden können...
Gast #1965875
Lesenswert?

Lothar Miller schrieb:
> Aber diese unglaubliche Anhäufung von Variablen verleitet mich sehr zur
> Annahme, dass hier ein Softwerker mal Hardware beschreiben will.

Nunja, für mich sieht es nach der 2-Prozess-Methode aus [1].
Für Fortgeschrittene eine sehr feinde Sache m.E., aber nicht für 
Anfänger geeignet, die noch kein Gefühl dafür haben, was aus einer 
Beschreibung synthetisiert wird.

Duke

[1] http://www.gaisler.com/doc/vhdl2proc.pdf
Gast #1966166
Lesenswert?

Hallo leute,

erstmal danke für den Antworten.

Duke Scarring schrieb:
> Die Definition von SLL sieht so aus:

ja aber wie kann man dann so was schreiben : x <= x sll 1;

und

Lothar Miller schrieb:
> Das ist evtl. die falsche Vorgehensweise. Ich würde hier einen Mux
>
> nehmen und den Index für den Vektorzugriff entsprechend berechnen. Denn
>
> nur so wird das dann in der Hardware umgesetzt werden können...

ja aber das ist eine schlichte verfahren was du meinst, weil so werden 
viele leitungen gesetzt um diesen Mux. zu realisieren und das verbraucht 
viele resourcen. und ich habs am anfang so gemacht wie du gesagt hast, 
aber dann hat mich mein Betreuer darauf hingewiesen und mit sll zu 
arbeiten.

Duke Scarring schrieb:
> Nunja, für mich sieht es nach der 2-Prozess-Methode aus [1].
>
> Für Fortgeschrittene eine sehr feinde Sache m.E., aber nicht für

genau, die ganze projekt soll in der 2 prozess-methode implementiert 
werden, und Mem_in ist von type std_logic_vector(161 downto 0).

Gruß, Hani
Moderator (Firma: Titel) Persönliche Seite #1966227
Lesenswert?

abumarcel schrieb:
> ja aber das ist eine schlichte verfahren was du meinst, weil so werden
> viele leitungen gesetzt um diesen Mux. zu realisieren und das verbraucht
> viele resourcen.
Wie, meinst du denn, sollte das ohne Mux gehen?
Ein Barrelshifter braucht garantiert mindestens genausoviel Platz.
Denn auch ein Barrelshifter ist ein Multiplexer... :-o

> ja aber wie kann man dann so was schreiben : x <= x sll 1;
Welche Libs verwendest du? Als Tipp:
1
use ieee.numeric_std.all;
und daraus den Datentyp
1
signal x : unsigned(160 downto 0);
Dann geht das.

abumarcel schrieb:
> und Mem_in ist von type std_logic_vector(161 downto 0).
Also, du wolltest es so:
1
use ieee.numeric_std.all;
2
:
3
:
4
  v.Mem_in := std_logic_vector(unsigned(r.Mem_in) sll 32);

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