www.mikrocontroller.net

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


Autor: Der Deimos (deimos)
Datum:

Bewertung
0 lesenswert
nicht 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.
library ieee;
use ieee.std_logic_1164.all;

entity SREG3 is
  port   (C, RESET, SE: in std_logic;
      Q: buffer std_logic_vector(2 downto 0));
end SREG3;

architecture VERHALTEN of SREG3 is
  signal QPLUS: std_logic_vector (2 downto 0);
begin
  ZUSTAND: process (C, RESET)
  begin
    if RESET = '0' then
      Q <= "000";
    elsif falling_edge(C) then
      Q <= QPLUS;
    end if;
  end process;
  NETZE: process (Q, SE)
  begin
    QPLUS(2) <= Q(1);
    QPLUS(1) <= Q(0);
    QPLUS(0) <= SE;
  end process;
end VERHALTEN;
Vielen Dank und Gruß

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Der Deimos (deimos)
Datum:

Bewertung
0 lesenswert
nicht 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ß

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Stingray (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
USE ieee.std_logic_unsigned.all;
USE ieee.numeric_std.ALL;

ENTITY SREG3_TB_vhd IS
END SREG3_TB_vhd;

ARCHITECTURE VERHALTEN_TEST OF SREG3_TB_vhd IS 

  -- Component Declaration for the Unit Under Test (UUT)
  COMPONENT SREG3
  PORT(
    C : IN std_logic;
    RESET : IN std_logic;
    SE : IN std_logic;          
    Q : OUT std_logic
    );
  END COMPONENT;

  --Inputs
  SIGNAL s_C :  std_logic := '0';
  SIGNAL s_RESET :  std_logic := '0';
  SIGNAL s_SE :  std_logic := '0';

  --Outputs
  SIGNAL s_Q :  std_logic;

BEGIN

  -- Instantiate the Unit Under Test (UUT)
  uut: SREG3 PORT MAP(
    C => s_C,
    RESET => s_RESET,
    SE => s_SE,
    Q => s_Q
  );
  
  s_C <= NOT s_C AFTER 5 ns;

  tb : PROCESS
  BEGIN
    s_RESET <= '1';
    -- Wait 20 ns for global reset to finish
    wait for 20 ns;
    s_RESET <= '0' AFTER 10 ns;
    wait; -- will wait forever
  END PROCESS TB;
  
  SE_TG : PROCESS
  BEGIN
    s_SE <= '1'; WAIT FOR 20 ns;
    s_SE <= '0'; WAIT FOR 20 ns;
   END PROCESS SE_TG;  

END;

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jan M. (mueschel)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Falk: Doch, eine Clock ist da.

@Stingray: Dein Reset hat die falsche Polaritaet

Autor: Stingray (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!
  process (C, RESET)
  begin
    if RESET = '1' then
      shift <= "000";
...

Autor: Jan M. (mueschel)
Datum:

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

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.