Forum: FPGA, VHDL & Co. Shift Reg das mehr als ein Bit shiftet


von Matze (Gast)


Lesenswert?

Hallo,

ich habe ein Shiftgegister

shiftreg : std_logic_vector(255 downto 0);

Zunächst wird es folgendermaßen initialisiert:

shiftreg <= (255 downto 192 => '1' , others => '0');

nun möchte ich den Inhalt um jeweils 64 Bit nach rechts verschieben. In 
etwa so:
1
process(clk)
2
if rising_edge(clk) then
3
4
         shiftreg <=   "0064Nullen000"  & shiftreg(255 downto 63);
5
6
end if;
7
end process;

wie kann ich das schreiben ohne alle 64 Nullen angeben zu müssen?

Danke
Matze

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


Lesenswert?

Matze schrieb:
> wie kann ich das schreiben ohne alle 64 Nullen angeben zu müssen?
Teil es auf:
1
 process(clk)
2
   if rising_edge(clk) then
3
     shiftreg <= (others=>'0');                         -- default: alles auf 0 
4
     shiftreg(191 downto 0) <= shiftreg(255 downto 63); -- die gweünschten Bits übernehmen 
5
   emd if;
6
 end process;

von Fetz (Gast)


Lesenswert?

Lothar Miller schrieb:
> Matze schrieb:
>> wie kann ich das schreiben ohne alle 64 Nullen angeben zu müssen?
> Teil es auf: process(clk)
>    if rising_edge(clk) then
>      shiftreg <= (others=>'0');                         -- default: alles auf 0
>      shiftreg(191 downto 0) <= shiftreg(255 downto 63); -- die gweünschten Bits 
übernehmen
>    emd if;
>  end process;

Da bin ich gespannt, ob Matze nachfrägt, wieso das so geht :)

von Thomas W. (donka)


Lesenswert?

oder auch so ...
1
process(clk)
2
if rising_edge(clk) then
3
     shiftreg <=   ((63 downto 0) => '0')  & shiftreg(255 downto 64);
4
end if;
5
end process;

oder so mit nur 16 Nullen ;-)
1
process(clk)
2
if rising_edge(clk) then
3
     shiftreg <=   x"0000000000000000"  & shiftreg(255 downto 64);
4
end if;
5
end process;

von Matze (Gast)


Lesenswert?

Wieso geht das so? :-)

von user (Gast)


Lesenswert?

es geht auch das
1
 process(clk)
2
   if rising_edge(clk) then
3
     shiftreg <= ((255 downto 63) => shiftreg(255 downto 63), others => '0'); 
4
   end if;
5
 end process;

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


Lesenswert?

user schrieb:
> es geht auch das
Beweisen!
1
shiftreg <= ((255 downto 63) => shiftreg(255 downto 63), others => '0');
Ich bekomme mit XST für diese Zuweisungszeile den Fehler
ERROR:HDLCompiler:806 - : Syntax error near ")".

Und dafür bekomme ich diesen Fehler auch:
1
shiftreg <= ((63 downto 0) => '0')  & shiftreg(255 downto 64);

Beidesmal logisch: da dürfen in der Klammer nur konstante Literale 
vorkommen, die zudem zum Typ passen müssen.

Nur sowas simples geht:
1
    signal shiftreg : std_logic_vector(255 downto 0) := (63 downto 0 => '1', others=> '0');
Und das:
1
    signal shiftreg : std_logic_vector(255 downto 0) := ('1', '0', '1', 237 => '1', 127 downto 0 => '1', others=> '0');
Aber sowas schon nicht mehr:
1
    signal shiftreg : std_logic_vector(255 downto 0) := (x"1234", 63 downto 0 => '1', others=> '0');

von Kritiker (Gast)


Lesenswert?

Da sieht man wieder mal, dass VHDL zu einer eit entwickel wurde, wo sie 
noch mit nur 8 bits hantiert haben :-)

von Thomas W. (donka)


Lesenswert?

Lothar Miller schrieb:
> Und dafür bekomme ich diesen Fehler auch:shiftreg <= ((63 downto 0) => '0')  & 
shiftreg(255 downto 64);

Uppps, eine Klammerung war zuviel. So sollte es aber gehen, zumindest 
mit Riviera.
1
process(clk)
2
begin
3
    if rising_edge(clk) then
4
        shiftreg <= (63 downto 0 => '0')  & shiftreg(255 downto 64);
5
    end if;
6
end process;

Das sollte nun auch mit XST funktionieren.

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


Lesenswert?

Thomas Wendt schrieb:
> Das sollte nun auch mit XST funktionieren.
Das tut es auch  ;-)

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.