Forum: FPGA, VHDL & Co. Shiften mit VHDL


von Marco M. (marco1987)


Lesenswert?

Hi Leute,

versuche hier ein erstes Programm zum laufen zu bringen.

Mein Ziel ist es eine 8 bit Zahlenfolge immer um eine Stelle nach links 
zu shiften. Dafür suchte ich mir den Befehl sll raus im folgenden sehr 
ihr mein Programm, nur leider bekomme ich noch einige Fehlermeldung:
1
library IEEE;
2
use IEEE.STD_LOGIC_1164.ALL;
3
use IEEE.STD_LOGIC_ARITH.ALL;
4
use IEEE.STD_LOGIC_UNSIGNED.ALL;
5
6
7
entity shift is
8
Port ( CLOCK : in STD_LOGIC;
9
10
zahl : out STD_LOGIC_VECTOR (7 downto 0));  --Meine 8 bit
11
end shift;
12
13
architecture Behavioral of shift is
14
15
variable zahl :bit_vector := "10010110";
16
17
begin
18
19
process (CLOCK)
20
begin
21
22
  if CLOCK='1' and CLOCK'event then  --steigende Flanke
23
24
        zahl sll 1;                      --zahl shiften um 1 nach links
25
    
26
    
27
        end if;
28
29
   end process;
30
31
end Behavioral;

von Thomas P. (pototschnig)


Lesenswert?

zum beispiel:
1
-- variable zahl :bit_vector := "10010110";
2
zahl := zahl(6 downto 0) & '0';

MfG
Thomas Pototschnig

von Marco M. (marco1987)


Lesenswert?

Thomas Pototschnig wrote:
> zum beispiel:
>
>
1
> -- variable zahl :bit_vector := "10010110";
2
> zahl := zahl(6 downto 0) & '0';
3
> 
4
>
>
> MfG
> Thomas Pototschnig

Sry verstehe die Syntax nicht so recht, was hast du da getan? Und soll 
ich das statt meiner Zeile schreiben?

von Thomas P. (pototschnig)


Lesenswert?

Ah, sorry ...

der bit_vector zahl hat Elemente von 7 downto 0.
Wenn du
zahl := zahl(6 downto 0) & '0';
schreibst, dann passiet das:
zahl(7) := zahl(6);
zahl(6) := zahl(5);
zahl(5) := zahl(4);
zahl(4) := zahl(3);
zahl(3) := zahl(2);
zahl(2) := zahl(1);
zahl(1) := zahl(0);
zahl(0) := '0';

Das & hängt hinten an den Vector einfach noch eine '0' ran, damit die 
Größe wieder passt.

Die Zeile wird in deinen Prozess statt dem "zahl ssl 1" reingeschrieben.

MfG
Thomas Pototschnig

von Marco M. (marco1987)


Lesenswert?

Vielen Dank für deine schnelle Antwort, aber ich muss es zwecks Uni mit 
dem Befehl ssl machen :-)

von Jan M. (mueschel)


Lesenswert?

Auch das ist kein Problem:

"zahl ssl 1"  ist also zahl um eins nach links geschoben, diesen Wert 
musst du aber jetzt auch noch irgendetwas zuweisen, so steht er einfach 
nur in der Gegend rum, also z.B.


geschobene_zahl <= zahl ssl 1

Nimm am besten ein signal statt variable, Variablen benutzt man nur fuer 
Zwischenergebnisse in einem Prozess um sich Schreibarbeit zu sparen.

Ausserdem: Du hast ja schon einen Port nahmens zahl, dann darf kein 
Signal ebenfalls den Namen zahl tragen!

von Marco M. (marco1987)


Lesenswert?

Ok hab ich geändert
--> und gleich mal die Fehleranzahl von 5 auf 2 reduziert :-)

Fehler hab ich als Kommentar geschrieben
1
library IEEE;
2
use IEEE.STD_LOGIC_1164.ALL;
3
use IEEE.STD_LOGIC_ARITH.ALL;
4
use IEEE.STD_LOGIC_UNSIGNED.ALL;
5
6
7
entity shift is
8
Port ( CLOCK : in STD_LOGIC;
9
10
zahlergebnis : out STD_LOGIC_VECTOR (7 downto 0));  --Meine 8 bit
11
end shift;
12
13
architecture Behavioral of shift is
14
15
signal zahl :bit_vector := "10010110";  --Signal zahl is not constrained. 
16
17
begin
18
19
process (CLOCK)
20
begin
21
22
  if CLOCK='1' and CLOCK'event then  --steigende Flanke
23
24
zahlergebnis <=zahl sll 1;  --  Type of zahlergebnisis 
25
                             -- incompatible with type of sll.links
26
    
27
    
28
        end if;
29
30
   end process;
31
32
end Behavioral;

von Marco M. (marco1987)


Lesenswert?

Kann vielleicht nochmal jmd drüber schauen?

Danke

von Thomas P. (pototschnig)


Lesenswert?

Marco M. wrote:
>
1
> signal zahl :bit_vector := "10010110";  --Signal zahl is not
2
> constrained.
3
4
signal zahl:bit_vector(7 downto 0) := "10010110";

Zu dem zweiten Fehler kann ich nichts genaues sagen, weil ich sll eben 
noch nie verwendet hab. Aber evtl gehts nur mit integer oder man muss 
noch was anderes USEn.

MfG
Thomas Pototschnig

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


Lesenswert?

> ich muss es zwecks Uni
Sag deinem Lehrer mal, dass diese Libs
> use IEEE.STD_LOGIC_ARITH.ALL;
> use IEEE.STD_LOGIC_UNSIGNED.ALL;
nicht mehr Stand der Zeit sind.
Heutzutage nimmt man die
> use IEEE.NUMERIC_STD.ALL;

Und sowas gibt auch nur an Instituten:
> ... bit_vector ...

Wenn du als Ausgangsport einen STD_LOGIC_VECTOR hast,
warum nicht auch zur Berechnung?
1
library IEEE;
2
use IEEE.STD_LOGIC_1164.ALL;
3
use IEEE.STD_LOGIC_ARITH.ALL;
4
use IEEE.STD_LOGIC_UNSIGNED.ALL;
5
6
entity shift is
7
   Port ( CLOCK : in STD_LOGIC;
8
         zahlergebnis : out STD_LOGIC_VECTOR (7 downto 0));  --Meine 8 bit
9
   end shift;
10
11
architecture Behavioral of shift is
12
signal zahl :STD_LOGIC_VECTOR(7 downto 0) := "10010110";  --Bereich angeben. 
13
begin
14
15
  process (CLOCK) begin
16
     if rising_edge(CLOCK) then  --steigende Flanke
17
        zahlergebnis <= zahl sll 1;  -- kann man bit_vectoren shiften?
18
     end if;
19
  end process;
20
21
end Behavioral;

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


Lesenswert?

> versuche hier ein erstes Programm zum laufen zu bringen.
Du bekommst auf einem FPGA kein Programm zum laufen (es sei denn, du 
implementierst einen CPU-Core).
Sondern du versuchst zum ersten Mal Hardware_zu_beschreiben.

von Marco M. (marco1987)


Lesenswert?

> Sondern du versuchst zum ersten Mal Hardware_zu_beschreiben.

Jep danke für den Hinweis, ist natürlich richtig

Danke an  Lothar Miller habe deine Hinweise berücksichtig, jetzt hab ich 
nur noch einen Fehler

1
library IEEE;
2
use IEEE.STD_LOGIC_1164.ALL;
3
use IEEE.NUMERIC_STD.ALL;
4
5
6
7
entity shift is
8
Port ( 
9
10
  CLOCK : in STD_LOGIC;
11
  zahlergebnis : out STD_LOGIC_VECTOR (2 downto 0));  --Meine 3 bit
12
13
end shift;
14
15
16
architecture Behavioral of shift is
17
  begin
18
19
    process (CLOCK)
20
21
    signal zahl :STD_LOGIC_VECTOR(2 downto 0) <= "100";
22
      begin
23
24
        if CLOCK='1' and CLOCK'event then  --steigende Flanke
25
  
26
27
          zahlergebnis <=zahl sll 1;                      --zahl shiften um 1 nach links
28
    
29
    
30
        end if;
31
32
    end process;
33
34
  end Behavioral;

von Marco M. (marco1987)


Lesenswert?

den einen Fehler hab ich bei

signal zahl :STD_LOGIC_VECTOR(2 downto 0) <= "100";

-->

parse error, unexpected SIGNAL

von abderahim (Gast)


Lesenswert?

--vhdl 87
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity shift is
   Port ( CLOCK : in STD_LOGIC;
         zahlergebnis : out STD_LOGIC_VECTOR (7 downto 0));  --Meine 8 
bit
   end shift;

architecture Behavioral of shift is
signal zahl :STD_LOGIC_VECTOR(7 downto 0) := "10010110";  --Bereich 
angeben.
begin

  process (CLOCK)
   begin
     if rising_edge(CLOCK) then  --steigende Flanke
       -- zahlergebnis <= zahl sll 1;  -- kann man bit_vectoren shiften?
        zahlergebnis (0)<= zahl (7);
        zahlergebnis (7 downto 1)<= zahl (6 downto 0);
     end if;
  end process;

end Behavioral;

von Martin K. (mkohler)


Lesenswert?

Marco M. wrote:
> jetzt hab ich nur noch einen Fehler
Nur noch einen syntaktischen Fehler vielleicht...


Aber:
1
    process (CLOCK)
2
    signal zahl :STD_LOGIC_VECTOR(2 downto 0) <= "100";
3
      begin
4
        if CLOCK='1' and CLOCK'event then  --steigende Flanke
5
           zahlergebnis <=zahl sll 1;      --zahl shiften um 1 nach links
6
        end if;
7
    end process;

Da wird gar nichts geschoben, nur wiederholt um 1 Bit versetzt geladen.
Du lädst bei jeder Taktflanke den Startwert von "zahl" erneut um eins 
geschoben in "zaehlergebnis". "zahl" selbst wird nicht verändert.

von Marco M. (marco1987)


Lesenswert?

> Da wird gar nichts geschoben, nur wiederholt um 1 Bit versetzt geladen.
> Du lädst bei jeder Taktflanke den Startwert von "zahl" erneut um eins
> geschoben in "zaehlergebnis". "zahl" selbst wird nicht verändert.


Genau das will ich doch, eine Variable nach und nach verschieben und in 
eine andere Abspeichern und mir dann ausgeben (weiss ich auch nicht wie 
ich das machen sol :-))


Zu abderahim:

Danke für deine Hilfe, aber ich muss schon den Operator sll benutzen!
Leider gibts dazu auch keine Beispiele im Netz.


MFG

von Marco M. (marco1987)


Lesenswert?

Kann ja auch nochmal die Syntax von so einer Operation reinstellen:



variable zahl :bit_vector := "10100110";
  zahl srl 2;

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


Lesenswert?

> jetzt hab ich nur noch einen Fehler...
Ja, wo werden Signale deklariert?
1
architecture Behavioral of shift is
2
signal zahl :STD_LOGIC_VECTOR(2 downto 0) <= "100";
3
begin
4
  process (CLOCK) begin
5
     if rising_edge(CLOCK) then  -- steigende Flanke
6
       zahl <=zahl sll 1;        -- zahl shiften um 1 nach links
7
     end if;
8
  end process;
9
  zahlergebnis <= zahl;          -- zahl ausgeben
10
end Behavioral;

von Marco M. (marco1987)


Lesenswert?

Lothar Miller wrote:

> Ja, wo werden Signale deklariert?

Na vor dem begin des Prozesses oder nicht?

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


Lesenswert?

>> Ja, wo werden Signale deklariert?
> Na vor dem begin des Prozesses oder nicht?
Ja, aber sehr weit davor   ;-)
1
architecture Behavioral of shift is
2
signal zahl :STD_LOGIC_VECTOR(2 downto 0) <= "100";
3
begin
4
:
5
:

Ein Tipp: schenk dir zu Weihnachten das Buch "VHDL-Synthese" - 
Reichhardt/Schwarz - ISBN 3486581929.

von Marco M. (marco1987)


Lesenswert?

> Ein Tipp: schenk dir zu Weihnachten das Buch "VHDL-Synthese" -
> Reichhardt/Schwarz - ISBN 3486581929.

Genau das hab ich AUflage 4 !

ABer da steht nichts drin über srl und sll :-(

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


Lesenswert?

Marco M. wrote:
>> Reichhardt/Schwarz - ISBN 3486581929.
> Genau das hab ich AUflage 4 !
> ABer da steht nichts drin über srl und sll :-(
Richtig, weils in der alltäglichen harten Praxis keiner verwendet :-/

von Martin K. (mkohler)


Lesenswert?

Lothar Miller wrote:
> Ein Tipp: schenk dir zu Weihnachten das Buch "VHDL-Synthese" -
> Reichhardt/Schwarz - ISBN 3486581929.

Wird gemacht ;-)
Ich wollte das Buch schon lange mal beschaffen.

Lothar, was hast du sonst noch für hilfreiche VHDL Literatur auf dem 
Schreibtisch liegen? Die Bücher, die im Schrank stehen bleiben, 
interessieren mich weniger ;-)

von Marco M. (marco1987)


Lesenswert?

Alles klar hab das Problem gelöst, es geht endlich , vielen Dank an alle

von StephanG (Gast)


Lesenswert?

Hallo,

das shiften mit sll oder srl funktioniert nur mit bit_vector

wenn das Signal zahl also bit_vector ist, und es funktioniert.
musst du das ganze noch in std_logic_vector konvertieren!


so dürfte es gehen:

....
zahl <= zahl sll 1 ;
zahlergebnis <=to_stdlogicvector (zahl) ;
.....


gruß

von Alex (Gast)


Lesenswert?

Hallo, mein Compiler findet die sll nicht, scheinbar hab ich nicht die 
richtige lib eingebunden. In welcher lib. ist denn die funktion zu 
finden?

Vielen Dank.

von Armando (Gast)


Lesenswert?

Thomas Pototschnig schrieb:
>
> der bit_vector zahl hat Elemente von 7 downto 0.
> Wenn du
> zahl := zahl(6 downto 0) & '0';
> schreibst, dann passiet das:
> zahl(7) := zahl(6);
> zahl(6) := zahl(5);
> zahl(5) := zahl(4);
> zahl(4) := zahl(3);
> zahl(3) := zahl(2);
> zahl(2) := zahl(1);
> zahl(1) := zahl(0);
> zahl(0) := '0';
>
> Das & hängt hinten an den Vector einfach noch eine '0' ran, damit die
> Größe wieder passt.
>
> Die Zeile wird in deinen Prozess statt dem "zahl ssl 1" reingeschrieben.



Wie müsste ich das schreiben wen ich anstatt sll, srl machen will?

von natürlich (Gast)


Lesenswert?

zahl <= '0' & zahl(7 downto 1);

von Armando (Gast)


Lesenswert?

natürlich schrieb:
> zahl <= '0' & zahl(7 downto 1);

Danke, natürlicher Gast

von peter (Gast)


Lesenswert?

Wenn du unsigned nimmst kannst du es auch rollen:
1
    wert_sll_u  <= wert_sll_u sll 2;
2
 
3
    wert_srl_u  <= wert_srl_u srl 3;
4
 
5
    wert_rol_u  <= wert_rol_u rol 3;

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.