Forum: FPGA, VHDL & Co. Vector gleichzeitig shift_left und Bit am Ende


von DerGast (Gast)


Lesenswert?

Hallo Leute,

hab so ein kleines Problem, wo ich mir nicht ganz sicher bin, ob und wie 
ich es lösen soll.

Und zwar habe ich eine State Machine und die 2 Signale Register und 
NextRegister die aus einem eigenem Record bestehen.

Also in etwa:
1
type aRegSet is record
2
  State : aState;
3
  Data : std_ulogic_vector(15 downto 0);
4
  ...
5
end record;
6
7
...
8
9
signal Register, NextRegister : aRegSet;
10
11
...

In meiner State Machine gibt es nun einen State wo ich den Vector erst 
um 1 nach links schieben muss und dann sofort bei Vector(0) den Wert von 
einem Eingang anlege.

Es soll also der Wert von einem Eingang durch einen Vector geschoben 
werden und das bei jedem Takt.
Leider habe ich keine Idee, wie das funktioniere soll.

mfg

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


Lesenswert?

DerGast schrieb:
> signal Register, NextRegister : aRegSet;
Eins vorweg: der Ansatz ist unnötig abstrakt.

Denn jetzt hast du die Zwei-Prozess-Schreibweise mit all ihren 
"Vorteilen" an der Backe. So wird schon ein einfaches Schieberegister 
zur Herausforderung.

Prinzipiell geht ein Schieberegister so:
Data <= Data(14 downto 0) & Eingang;
Das muss dann natürlich noch getaktet werden, weil sonst eine 
kombinatorische Schleife entsteht.

von DerGast (Gast)


Lesenswert?

Naja, ich will ja die 2-Prozess-Schreibweise.

Bei mir sollte das dann so funktionieren:
NextRegister.Data <= Register.Data(14 downto 0) & Eingang;

Takt etc. ist natürlich alles vorhanden. Wollte hier nur unnötige Infos 
vermeiden, da es mir ja nur um die eine Operation ging.

mfg

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


Lesenswert?

DerGast schrieb:
> da es mir ja nur um die eine Operation ging.
Die heißt "Concatenation"...

> Bei mir sollte das dann so funktionieren:
> NextRegister.Data <= Register.Data(14 downto 0) & Eingang;
Ja, sollte es.

von Christoph Z. (christophz)


Lesenswert?

DerGast schrieb:
> NextRegister.Data <= Register.Data(14 downto 0) & Eingang;

Du kannst es auch gleich mit Hilfe von Attributen schreiben, dann passt 
es sich automatisch an die Definition von Data an:
1
NextRegister.Data <= Register.Data(Register.Data'HIGH-1 downto 0) & Eingang;
Oder sogar so:
1
NextRegister.Data <= Register.Data(Register.Data'HIGH-1 downto Register.Data'LOW) & Eingang;

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


Lesenswert?

Oder sogar so:
1
NextRegister.Data <= Register.Data(Register.Data'LEFT-1 downto Register.Data'RIGHT) & Eingang;

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.