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


von VHDL Anfänger (Gast)


Lesenswert?

Hier mein Code:
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 Noise2 is
7
Port (
8
  D    :  out  std_logic_vector (7 downto 0);
9
  Speaker  :  out  std_logic;
10
  Taste1  :  in  bit;
11
  Taste2  :  in  bit;
12
  LED_rot  :  out  std_logic
13
  );
14
end Noise2;
15
16
architecture Behavioral of Noise2 is
17
signal Schieberegister  : std_logic_vector(31 downto 0);
18
begin
19
  Noisegenerator: process (Taste2)
20
  begin
21
    if (Taste2 = '1' and Taste2'event)
22
    then
23
      if Schieberegister(31) = '1' then
24
        Schieberegister <= Schieberegister(30 downto 0) & '0';  
25
      elsif Taste1 = '1' then
26
        Schieberegister <= x"00000001";
27
      else
28
        Schieberegister <= (Schieberegister(30 downto 0) & '0');  
29
        Schieberegister <= Schieberegister xor x"04C11DB7";  
30
      end if;
31
    end if;
32
  end process Noisegenerator;
33
34
  D <= Schieberegister(7 downto 0);
35
  Speaker <= Schieberegister(0);
36
  LED_rot <= '1';
37
38
end Behavioral;
Ich habe das so in C programmiert:
1
//***************************************************************************
2
//* Meine 32-Bit Zufallszahlenroutine in C
3
//* wenn Übergabewert ungleich 0 dann wird mit Übergabewert initialisiert!
4
//***************************************************************************
5
int my_rand(int init_rand)
6
{
7
        static unsigned int Z;
8
        if (init_rand) Z = init_rand;
9
10
        if (Z & 0x80000000)
11
        {
12
                Z<<=1;
13
                Z^=0x04C11DB7;
14
        }
15
        else
16
        {
17
                Z<<=1;
18
        }
19
        return Z;
20
}
21
//***************************************************************************
Habe auch schon:
1
Schieberegister <= Schieberegister sll 1;
probiert, da gab's dann Fehlermeldung.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Du machst eine Zuweisung an ein Signal:
1
      else
2
        Schieberegister <= (Schieberegister(30 downto 0) & '0');  
3
        Schieberegister <= Schieberegister xor x"04C11DB7";  
4
      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
1
      else
2
        Schieberegister <= Schieberegister xor x"04C11DB7";  
3
      end if;

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

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

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

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


So sieht es aufgeräumter aus:
1
architecture Behavioral of Noise2 is
2
signal Schieberegister  : std_logic_vector(31 downto 0);
3
begin
4
  Noisegenerator: process (Taste1, Taste2)
5
  begin
6
    if Taste1 = '1' then  -- Laden
7
        Schieberegister <= x"00000001";
8
    elsif (Taste2 = '1' and Taste2'event) -- Zufallszahlen machen
9
    then
10
      if Schieberegister(31) = '1' then
11
        Schieberegister <= Schieberegister(30 downto 0)&'0';  
12
      else
13
        Schieberegister <= Schieberegister(30 downto 0)&'0' xor x"04C11DB7";  
14
      end if;
15
    end if;
16
  end process Noisegenerator;

von VHDL Anfänger (Gast)


Lesenswert?

Erstmal Danke.

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

von VHDL Anfänger (Gast)


Lesenswert?

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

Naja, zum bitweisen debuggen in der Hardware...

von VHDL Anfänger (Gast)


Lesenswert?

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

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

> Wie schreibe ich das mit sll?
SLL geht nur mit bit und boolean.

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

von VHDL Anfänger (Gast)


Lesenswert?

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

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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.

von nixda (Gast)


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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.