www.mikrocontroller.net

Forum: FPGA, VHDL & Co. Warum schiebt mein Register nicht?


Autor: VHDL Anfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hier mein Code:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity Noise2 is
Port (
  D    :  out  std_logic_vector (7 downto 0);
  Speaker  :  out  std_logic;
  Taste1  :  in  bit;
  Taste2  :  in  bit;
  LED_rot  :  out  std_logic
  );
end Noise2;

architecture Behavioral of Noise2 is
signal Schieberegister  : std_logic_vector(31 downto 0);
begin
  Noisegenerator: process (Taste2)
  begin
    if (Taste2 = '1' and Taste2'event)
    then
      if Schieberegister(31) = '1' then
        Schieberegister <= Schieberegister(30 downto 0) & '0';  
      elsif Taste1 = '1' then
        Schieberegister <= x"00000001";
      else
        Schieberegister <= (Schieberegister(30 downto 0) & '0');  
        Schieberegister <= Schieberegister xor x"04C11DB7";  
      end if;
    end if;
  end process Noisegenerator;

  D <= Schieberegister(7 downto 0);
  Speaker <= Schieberegister(0);
  LED_rot <= '1';

end Behavioral;
Ich habe das so in C programmiert:
//***************************************************************************
//* Meine 32-Bit Zufallszahlenroutine in C
//* wenn Übergabewert ungleich 0 dann wird mit Übergabewert initialisiert!
//***************************************************************************
int my_rand(int init_rand)
{
        static unsigned int Z;
        if (init_rand) Z = init_rand;

        if (Z & 0x80000000)
        {
                Z<<=1;
                Z^=0x04C11DB7;
        }
        else
        {
                Z<<=1;
        }
        return Z;
}
//***************************************************************************
Habe auch schon:
Schieberegister <= Schieberegister sll 1;
probiert, da gab's dann Fehlermeldung.

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

Bewertung
0 lesenswert
nicht lesenswert
Du machst eine Zuweisung an ein Signal:
      else
        Schieberegister <= (Schieberegister(30 downto 0) & '0');  
        Schieberegister <= Schieberegister xor x"04C11DB7";  
      end if;
In einem Prozess wird nur die letzte Zuweisung an ein Signal 
ausgewertet. davor wird zu Berechnungen das unveränderte Signal 
hergenommen.

Dort steht also eigentlich nur
      else
        Schieberegister <= Schieberegister xor x"04C11DB7";  
      end if;

Probier das:
      else
        Schieberegister <= Schieberegister(30 downto 0)&'0' xor x"04C11DB7";  
      end if;

BTW:
Eine Taste als Takt zu nehmen, ist ... naja zumindest spannend :-o

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

Bewertung
0 lesenswert
nicht lesenswert
    if (Taste2 = '1' and Taste2'event) then
      if Schieberegister(31) = '1' then
      ...
      elsif Taste1 = '1' then ...
Die Taste 1 wird nur ausgewertet, wenn die Taste 2 gedrückt wird :-o


So sieht es aufgeräumter aus:
architecture Behavioral of Noise2 is
signal Schieberegister  : std_logic_vector(31 downto 0);
begin
  Noisegenerator: process (Taste1, Taste2)
  begin
    if Taste1 = '1' then  -- Laden
        Schieberegister <= x"00000001";
    elsif (Taste2 = '1' and Taste2'event) -- Zufallszahlen machen
    then
      if Schieberegister(31) = '1' then
        Schieberegister <= Schieberegister(30 downto 0)&'0';  
      else
        Schieberegister <= Schieberegister(30 downto 0)&'0' xor x"04C11DB7";  
      end if;
    end if;
  end process Noisegenerator;

Autor: VHDL Anfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Erstmal Danke.

Wie schreibe ich das mit sll?
Schieberegister <= Schieberegister sll 1;
Oder besser so?
Schieberegister <= Schieberegister(30 downto 0)&'0'; 

Autor: VHDL Anfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>BTW:
>Eine Taste als Takt zu nehmen, ist ... naja zumindest spannend :-o

Naja, zum bitweisen debuggen in der Hardware...

Autor: VHDL Anfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Habe noch einen Fehler gefunden, den ich bei der Umsetzung von C nach 
VHDL gemacht habe:
     if Schieberegister(31) = '1' then
is falsch, besser:
     if Schieberegister(31) = '0' then
:-)

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

Bewertung
0 lesenswert
nicht lesenswert
> Wie schreibe ich das mit sll?
SLL geht nur mit bit und boolean.

> Wie schreibe ich das mit sll?
Am besten gar nicht   ;-)

Autor: VHDL Anfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
sorry, mir ist immer noch nicht klar, wann nehme ich std_logic_vector 
und wann was anderes. Was gibt es da überhaupt?

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

Bewertung
0 lesenswert
nicht lesenswert
Siehe http://www.nt-nv.fh-koeln.de/Labor/VhdlEasy/Kap3/k34.html

Wenn du Hardware bauen willst, kommst du mit std_logic, std_logic_vector 
(Package std_logic_1164), signed, unsigned (Package numeric_std) und 
integer am reibungslosesten durch.

Für die Simulation kannst du natürlich alles nehmen, nur artet das dann 
oft in eine Cast- und Konvertierungs-Orgie aus.

Autor: nixda (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hi,

std_*logic(_vector), unsigned, signed, integer und entsprechende enums 
sind die mittel der wahl in vhdl.

signed und unsigned sind definiert als vectoren auf std_logic (resolved) 
dh. du musst eine laenge angeben und bei doppelten treibern gewinnt der 
staerkere. integer sind als "set" definiert dh. du gibts den 
zahlenbereich vor. arithmetik sollte auf signed/unsigned/integer 
aehnlich funktionieren (aber obacht bei operationen wie 
bereichsueberlauf etc.)

std_logic vs std_ulogic ...

scheint ein fast endloses thema zu sein. so wie lothar std_logic 
(=resolved type) predigt denke ich gibt es gute gruende std_"u"logic 
(unresolved types) zu verwenden. der unterschied hier ist der, ob der 
vhdl compiler doppelte treiber zu einem signal akzeptiert (resolved) 
oder nicht (not resolved).
aber dafuer gibt es andere threads :-)

/mfg

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.