mikrocontroller.net

Forum: FPGA, VHDL & Co. mit sll shiften


Autor: abumarcel (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

if (r.i /= 5) then

  v.Mem_in := r.Mem_in sll 32;
  v.Mem_in(31 downto 0) := config_data;  
  v.i := r.i + 1 ;        
  else if (r.ready(1) = '0') then
  v.Mem_in := r.Mem_in sll 2;
  v.Mem_in(1 downto 0) := config_data(1 downto 0);
  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

Autor: Duke Scarring (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Definition von SLL sieht so aus:
...
package NUMERIC_STD is
...

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

function "sll" (ARG: SIGNED; COUNT: INTEGER) return SIGNED is
...
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

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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:
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...

Autor: Duke Scarring (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: abumarcel (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: D. I. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und was glaubst du kommt bei diesem Shifter raus?

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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:
use ieee.numeric_std.all;
und daraus den Datentyp
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:
use ieee.numeric_std.all;
:
:
  v.Mem_in := std_logic_vector(unsigned(r.Mem_in) sll 32);

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.