mikrocontroller.net

Forum: FPGA, VHDL & Co. Bit verschieben VHDL


Autor: Richard B. (rbrose)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

wie kann ich ein Bit rechts oder links hin verschieben?
  signal count_int : STD_LOGIC_VECTOR (7 downto 0) := (others => '0');

mit
  count_int <= count_int + 1;

zählt er ja Binär hoch. Will aber
 00000001
 00000010
 00000100
 00001000
 ...


Vielen dank für eure Mühe.

Autor: Markus R. (marol)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

signal count_int : STD_LOGIC_VECTOR (7 downto 0) := X"01";
....
-- bit nach links schieben
count_int <= count_int(6 downto 0) & count_int(7);

Zum rechtsschieben:
....
count_int <= count_int(0) & count_int(7 downto 1);


Falls die 1 beim achten Shift nach links rausfallen soll:
count_int <= count_int(6 downto 0) & B"0";

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Richard B. (rbrose)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke euch!

Es kommen aber jetzt mehr fragen auf:
signal count_int : STD_LOGIC_VECTOR (7 downto 0) := X"01";

Was heißt das X"01"; ?

count_int <= count_int(6 downto 0) & B"0";
Das nur dann machen wenn das bit schon ganz links ist?


http://www.vhdl-online.de/tutorial/deutsch/t_87.htm
count_int <= count_int rol 1;
Wenn ich rol und ror benutzen will kriege ich diese Fehlermeldung:
Line 58. rol can not have such operands in this context.

Autor: Axel Preuss (funkydunky)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hi,

also x"01"  ist hexadezimalschreibweise.
und wenn du das bit zu weit nach links oder rechts schiebst, dann 
"fällt" es raus.

verhindern sollte dies der befehl ROR, der das zu weit geschobene bit 
auf der anderen seite wieder anfügt.

ich habe den befehl noch nie benutzt, und kann deshalb auch nix zu 
beisteuern woran es liegen könnte. geht rol evtl. nur mit einem 
bit_vector? du hast da standardlogic verwendet.
an der uni wird uns beigebracht, das man std_logic immer meiden soll 
wenn man es nicht unbedingt benötigt(bin aber auch nich so der vhdl 
crack um das beurteilen zu können)

Autor: Markus R. (marol)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Richard B. wrote:

>
>
> count_int <= count_int(6 downto 0) & B"0";
> 
> Das nur dann machen wenn das bit schon ganz links ist?
Nein, ständig wenn du willst, dass die 1 nach dem achten Takt nicht mehr 
vorhanden ist.

Autor: Richard B. (rbrose)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich verstehe mein Problem nicht. Wo ist der Fehler?
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity ledShifter is
    Port ( CLOCK : in  STD_LOGIC;
           DIR : in  STD_LOGIC;
           LEDS : out  bit_vector (7 downto 0));
end ledShifter;

architecture Behavioral of ledShifter is

signal clk_div_counter : STD_LOGIC_VECTOR (24 downto 0);
signal ledTMP : bit_vector (7 downto 0) := "00000001";
signal clk_149hz: bit := '0';

begin
  clk_div : process(CLOCK)
  begin
    if CLOCK='1' and CLOCK'event then      
      clk_div_counter <= clk_div_counter + 1;
      if clk_div_counter = x"10" then
        clk_149hz <= '1';    
      elsif clk_div_counter /= x"10" then
        clk_149hz <= '0';
      end if;
    end if;
  end process clk_div;
  
  led_shift : process(clk_149hz)
  begin
    if clk_149hz='1' then
      ledTMP <= ledTMP rol 1;
    end if;    
  end process led_shift;
LEDS <= ledTMP;
end Behavioral;

Irgendwie leuchten alle LEDs nach einer kleinen Zeit.

Autor: Richard B. (rbrose)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Achja und was ist der unterschied zwischen bit_vector und 
STD_LOGIC_VECTOR?
Mit dem bit_vector kann ich nicht bit_vector <= bit_vector + 1 rechnen 
und mit dem STD_LOGIC_VECTOR kann ich nicht STD_LOGIC_VECTOR <= 
STD_LOGIC_VECTOR rol 1 machen. Wieso?

Welches soll man wann nehmen?

Autor: Axel Preuss (funkydunky)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hi,

also mit standard_logic kann man tristate verhalten erlangen. du kannst 
den ausgang damit auf 1, 0 oder hochohmig setzen. bit_vector ist nur 0 
oder 1

zum programmieren von solchen countern braucht vhdl aus irgendeinem 
grund auch std_logic. wieso das so ist, das kann ich dir jedoch nicht 
erklären.

hier mal dein program ein wenig verändert...
du musst den counter z.b. auch wieder auf null setzen.
wenn du einen vergleich auf die x"10" machst, dann muss die vektorlänge 
auch übereinstimmen...du hattest da ja vorher eine länge von 24 oder 
sowas
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity ledShifter is
    Port ( RESET:in bit;
           CLOCK : in  bit;
           DIR : in  bit;
           LEDS : out  bit_vector (7 downto 0));
end ledShifter;

architecture Behavioral of ledShifter is

signal clk_div_counter : STD_LOGIC_VECTOR (4 downto 0);
signal ledTMP : bit_vector (7 downto 0) := "00000001";
signal clk_149hz: bit := '0';

begin
  clk_div : process(RESET,CLOCK)
  begin
    if RESET = '1' then
       clk_div_counter <= (others => '0'); 
       clk_149hz <= '0';
    elsif CLOCK='1' and CLOCK'event then      
      if clk_div_counter = x"10" then
        clk_149hz <= '1'; 
        clk_div_counter <= (others => '0');   
      else 
         clk_div_counter <= clk_div_counter + 1;
         clk_149hz <= '0';
      end if;
    end if;
  end process clk_div;
  
  led_shift : process(clk_149hz)
  begin
    if clk_149hz='1' and clk_149hz'event then 
      ledTMP <= ledTMP rol 1;
    end if;    
  end process led_shift;

LEDS <= ledTMP;
end Behavioral;

hattest du das ganze mal simuliert? ich kann dir da nur modelsim 
empfehlen(kenne nur das)
dann sieht man schon eher wo es hakt.

Autor: Axel Preuss (funkydunky)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
achso:

Clock z.b. muss eigentlich nie std_logic sein, sondern immer bit!


Desweiteren ist es wichtig ein ResetBit zu haben. Zu Anfang gibt es ja 
keinen definierten Zustand, sondern alles hängt irgendwie in der Luft 
rum

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Axel Preuss: Also auf der Uni haben wir nur std_logic Typen verwendet 
und in der Arbeit habe ich in inzwischen einigen 10k Zeilen VHDL Source 
Code von unseren Leuten, Zulieferern oder auch einfach wenn man so im 
Netz schmökert nie bit oder bit_vector gesehen. Diesen Datentyp sehe ich 
eigentlich immer nur in Büchern.

Was ist die Begründung dafür, dass man bit und bit_vector verwenden 
soll?

Autor: Axel Preuss (funkydunky)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
moin,

wenn ich std_logic benutze ohne das es einen Grund dafür gibt, dann 
kriege ich das von meinem Prof. um die Ohren geknallt. :)

Wie ich schon sagte, ich bin nicht so der VHDL Crack um das beurteilen 
zu können, aber evtl. ist bit_vector ne Ecke resourcenschonender??

Auf nem Mikrocontroler verwende ich ja auch nur Variablen mit dem 
kleinst möglichen Wertebereich und benutze nicht für alles long oder 
float, obwohl das natürlich genauso gehen würde.

Aber vielleicht sagt da auch jemand was zu der mehr Ahnung von VHDL hat, 
was da sinnvoll ist.

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Eigentlich verwendet niemand im FPGA-Design bit oder bit_vector, nicht 
zuletzt weil die U und X-Zustände in der Simulation sehr nützlich sind.

Direkt mit std_logic_vector zu rechnen (mit Hilfe von 
std_logic_(un)signed) ist kein guter Stil, dafür gibt es die Typen 
signed und unsigned (siehe Rechnen in VHDL).

Autor: Matthias F. (flint)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Auf die Ressourcen kann es nicht ankommen, am Schluss landet ein 
Clock-Signal typischerweise eh im Clock-Netzwerk.

Ich schaue mir grad den Draft für die Konventionen für synthetisierbares 
VHDL durch, da steht:

"The allowed types for clock signals shall be: BIT, STD_ULOGIC and their 
subtypes (e.g. STD_LOGIC) with a
minimum subset of '0' and '1'. Only the values ‘0’ and ‘1’ from these 
types shall be used in expressions representing
clock levels and clock edges (See 6.1.2)."


Insofern kann man argumentieren, dass man es bei std_logic leichter 
falsch machen kann, als bei zb bit, weil man da auch ein 'H' in der 
Clock haben könnte.

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.