Shift Reg das mehr als ein Bit shiftet

Gast #3013850
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
Gast #3013934
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 :)
#3013980
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;
Moderator (Firma: Titel) Persönliche Seite #3015258
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');
#3015355
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.

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