Shiften mit VHDL

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

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