Anfängerfrage zu Register in VHDL

OP #622619
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ß
#622664
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
OP #622700
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ß
#622757
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
Gast #622962
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;
#622980
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
Gast #623019
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
...

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren