mikrocontroller.net

Forum: FPGA, VHDL & Co. Shiften mit VHDL


Autor: Marco M. (marco1987)
Datum:

Bewertung
0 lesenswert
nicht 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:
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;

zahl : out STD_LOGIC_VECTOR (7 downto 0));  --Meine 8 bit
end shift;

architecture Behavioral of shift is

variable zahl :bit_vector := "10010110";

begin

process (CLOCK)
begin

  if CLOCK='1' and CLOCK'event then  --steigende Flanke

        zahl sll 1;                      --zahl shiften um 1 nach links
    
    
        end if;

   end process;

end Behavioral;

Autor: Thomas Pototschnig (pototschnig)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
zum beispiel:
-- variable zahl :bit_vector := "10010110";
zahl := zahl(6 downto 0) & '0';


MfG
Thomas Pototschnig

Autor: Marco M. (marco1987)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Thomas Pototschnig wrote:
> zum beispiel:
>
>
> -- variable zahl :bit_vector := "10010110";
> zahl := zahl(6 downto 0) & '0';
> 
> 
>
> MfG
> Thomas Pototschnig

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

Autor: Thomas Pototschnig (pototschnig)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Marco M. (marco1987)
Datum:

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

Autor: Jan M. (mueschel)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Marco M. (marco1987)
Datum:

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

Fehler hab ich als Kommentar geschrieben

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 :bit_vector := "10010110";  --Signal zahl is not constrained. 

begin

process (CLOCK)
begin

  if CLOCK='1' and CLOCK'event then  --steigende Flanke

zahlergebnis <=zahl sll 1;  --  Type of zahlergebnisis 
                             -- incompatible with type of sll.links
    
    
        end if;

   end process;

end Behavioral;


Autor: Marco M. (marco1987)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kann vielleicht nochmal jmd drüber schauen?

Danke

Autor: Thomas Pototschnig (pototschnig)
Datum:

Bewertung
-1 lesenswert
nicht lesenswert
Marco M. wrote:
>

> signal zahl :bit_vector := "10010110";  --Signal zahl is not
> constrained.

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

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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?
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?
     end if;
  end process;

end Behavioral;

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Marco M. (marco1987)
Datum:

Bewertung
0 lesenswert
nicht 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

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;



entity shift is
Port ( 

  CLOCK : in STD_LOGIC;
  zahlergebnis : out STD_LOGIC_VECTOR (2 downto 0));  --Meine 3 bit

end shift;


architecture Behavioral of shift is
  begin

    process (CLOCK)

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

        if CLOCK='1' and CLOCK'event then  --steigende Flanke
  

          zahlergebnis <=zahl sll 1;                      --zahl shiften um 1 nach links
    
    
        end if;

    end process;

  end Behavioral;




Autor: Marco M. (marco1987)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
den einen Fehler hab ich bei

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

-->

parse error, unexpected SIGNAL

Autor: abderahim (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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;

Autor: Martin Kohler (mkohler)
Datum:

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


Aber:
    process (CLOCK)
    signal zahl :STD_LOGIC_VECTOR(2 downto 0) <= "100";
      begin
        if CLOCK='1' and CLOCK'event then  --steigende Flanke
           zahlergebnis <=zahl sll 1;      --zahl shiften um 1 nach links
        end if;
    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.

Autor: Marco M. (marco1987)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Marco M. (marco1987)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kann ja auch nochmal die Syntax von so einer Operation reinstellen:



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

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

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

Autor: Marco M. (marco1987)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Lothar Miller wrote:

> Ja, wo werden Signale deklariert?

Na vor dem begin des Prozesses oder nicht?

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

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

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

Autor: Marco M. (marco1987)
Datum:

Bewertung
-1 lesenswert
nicht 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 :-(

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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 :-/

Autor: Martin Kohler (mkohler)
Datum:

Bewertung
0 lesenswert
nicht 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 ;-)

Autor: Marco M. (marco1987)
Datum:

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

Autor: StephanG (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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ß

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Armando (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: natürlich (Gast)
Datum:

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

Autor: Armando (Gast)
Datum:

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

Danke, natürlicher Gast

Autor: peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn du unsigned nimmst kannst du es auch rollen:

    wert_sll_u  <= wert_sll_u sll 2;
 
    wert_srl_u  <= wert_srl_u srl 3;
 
    wert_rol_u  <= wert_rol_u rol 3;

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.