Forum: FPGA, VHDL & Co. Anfängerfrage zu Register in VHDL


von Der D. (deimos)


Lesenswert?

Hallo,

ich arbeite mich gerade in VHDL ein und versuche als Anfang ein 
Schieberegister mit seriellem Eingang und seriellem Ausgang zu 
schreiben.
Soweit so gut, Compilieren lässt sich der Code, und auch simulieren, 
allerdings erhalte ich nie eine Ausgabe, es bleibt immer XXXXX.
ich arbeite mit der Quartus II Web Edition.

Kann jemand sagen, ob es ein Fehler im Code ist, oder bediene ich den 
Simulator falsch? Habe sowohl Timing als auch Functional simuliert.
1
library ieee;
2
use ieee.std_logic_1164.all;
3
4
entity SREG3 is
5
  port   (C, RESET, SE: in std_logic;
6
      Q: buffer std_logic_vector(2 downto 0));
7
end SREG3;
8
9
architecture VERHALTEN of SREG3 is
10
  signal QPLUS: std_logic_vector (2 downto 0);
11
begin
12
  ZUSTAND: process (C, RESET)
13
  begin
14
    if RESET = '0' then
15
      Q <= "000";
16
    elsif falling_edge(C) then
17
      Q <= QPLUS;
18
    end if;
19
  end process;
20
  NETZE: process (Q, SE)
21
  begin
22
    QPLUS(2) <= Q(1);
23
    QPLUS(1) <= Q(0);
24
    QPLUS(0) <= SE;
25
  end process;
26
end VERHALTEN;
Vielen Dank und Gruß

von Falk B. (falk)


Lesenswert?

@ Der Deimos (deimos)

So macht man das nicht. Ist zwar syntaktisch möglich, ist aber 
unüberischtlich und fehlerträchtig. Und dern Typ buffer sollte man auch 
meiden.

library ieee;
use ieee.std_logic_1164.all;

entity SREG3 is
  port   (C     : in std_logic;
          RESET : in std_logic;
          SE    : in std_logic;
          Q     : out std_logic);
end SREG3;

architecture VERHALTEN of SREG3 is

  signal shift: std_logic_vector (2 downto 0);

begin

 Q <= shift(2);

  process (C, RESET)
  begin
    if RESET = '0' then
      shift <= "000";
    elsif falling_edge(C) then
      shift <= shift(1 downto 0) & SE;
    end if;
  end process;

end VERHALTEN;

MfG
Falk

von Der D. (deimos)


Lesenswert?

Hallo Falk,

danke für die schnelle Antwort. Hab es umgeschreiben, aber leider bleibt 
bei der Simulation der Wert von Q XXXXXX.
Muss ich Q auf irgendeine Größe voreinstellen?
Reset hab ich auf Forcing 0 gestellt,
Clock steht auf Random every half grid
SE steht auf Random every grid value.

Vielan Dank und Gruß

von Falk B. (falk)


Lesenswert?

@ Der Deimos (deimos)

>danke für die schnelle Antwort. Hab es umgeschreiben, aber leider bleibt
>bei der Simulation der Wert von Q XXXXXX.
>Muss ich Q auf irgendeine Größe voreinstellen?

nein, du hast ja ein Reset

>Reset hab ich auf Forcing 0 gestellt,

Das klingt nciht gut. Eher deposit.

>Clock steht auf Random every half grid
>SE steht auf Random every grid value.

???
Du musst schon ein paar sinnvolle Werte an C und SE zuweisen! Sprich, 
eine Testbench erstellen.

MfG
Falk

von Stingray (Gast)


Lesenswert?

Eigentlich wollte ich ja ne Testbench zu dem ganzen Schreiben, aber 
irgendwas geht nicht.
Es gibt keine Fehlermeldung, ich kriege aber leider keinen Output.
1
LIBRARY ieee;
2
USE ieee.std_logic_1164.ALL;
3
USE ieee.std_logic_unsigned.all;
4
USE ieee.numeric_std.ALL;
5
6
ENTITY SREG3_TB_vhd IS
7
END SREG3_TB_vhd;
8
9
ARCHITECTURE VERHALTEN_TEST OF SREG3_TB_vhd IS 
10
11
  -- Component Declaration for the Unit Under Test (UUT)
12
  COMPONENT SREG3
13
  PORT(
14
    C : IN std_logic;
15
    RESET : IN std_logic;
16
    SE : IN std_logic;          
17
    Q : OUT std_logic
18
    );
19
  END COMPONENT;
20
21
  --Inputs
22
  SIGNAL s_C :  std_logic := '0';
23
  SIGNAL s_RESET :  std_logic := '0';
24
  SIGNAL s_SE :  std_logic := '0';
25
26
  --Outputs
27
  SIGNAL s_Q :  std_logic;
28
29
BEGIN
30
31
  -- Instantiate the Unit Under Test (UUT)
32
  uut: SREG3 PORT MAP(
33
    C => s_C,
34
    RESET => s_RESET,
35
    SE => s_SE,
36
    Q => s_Q
37
  );
38
  
39
  s_C <= NOT s_C AFTER 5 ns;
40
41
  tb : PROCESS
42
  BEGIN
43
    s_RESET <= '1';
44
    -- Wait 20 ns for global reset to finish
45
    wait for 20 ns;
46
    s_RESET <= '0' AFTER 10 ns;
47
    wait; -- will wait forever
48
  END PROCESS TB;
49
  
50
  SE_TG : PROCESS
51
  BEGIN
52
    s_SE <= '1'; WAIT FOR 20 ns;
53
    s_SE <= '0'; WAIT FOR 20 ns;
54
   END PROCESS SE_TG;  
55
56
END;

von Falk B. (falk)


Lesenswert?

@ Stingray (Gast)

>Eigentlich wollte ich ja ne Testbench zu dem ganzen Schreiben, aber
>irgendwas geht nicht.
>Es gibt keine Fehlermeldung, ich kriege aber leider keinen Output.

Tja, was soll den rauskommen? Du gnerierst keinen Takt, und dein Zeiten 
sind auch etwas kurz.
Das geht besser.

MFG
Falk

von Jan M. (mueschel)


Lesenswert?

@Falk: Doch, eine Clock ist da.

@Stingray: Dein Reset hat die falsche Polaritaet

von Stingray (Gast)


Lesenswert?

Stimmt, mein Reset war falsch herum. Einen aehnlichen Fehler gibts auch 
im Code von Deimos, hab' ich gesehen.
Einfach mal abaendern.

OK, aber outputs gibts trotzdem noch nicht. Grrrrr, aergerlich!
1
  process (C, RESET)
2
  begin
3
    if RESET = '1' then
4
      shift <= "000";
5
...

von Jan M. (mueschel)


Lesenswert?

Also Stingrays testbench zusammen mit falks Schieberegister simuliert 
sich bei mir (mit dem passenden reset) einwandfrei...

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.