Shiften mit VHDL

OP #1068288
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;
OP #1068299
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?
#1068300
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
#1068306
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!
OP #1068316
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;
#1068414
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
Moderator (Firma: Titel) Persönliche Seite #1068466
> 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;
OP #1068551
> 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;
Gast #1068699
--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;
#1068792
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.
OP #1068801
> 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
Moderator (Firma: Titel) Persönliche Seite #1068811
> 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;
Moderator (Firma: Titel) Persönliche Seite #1068919
>> 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.
#1068973
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 ;-)
Gast #1068987
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ß
Gast #1479758
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.
Gast #3907685
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?
Gast #3907878
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;

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.