www.mikrocontroller.net

Forum: FPGA, VHDL & Co. Monoflop liefert neuerdings 'X'


Autor: Clemens Koller (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo, Leute!

Ich bin etwas am verzweifeln...
Ich habe hier ein eigentlich einfaches Monoflop, welches vor laengerem
(2007) in einem aelteren ModelSim prima funktioniert haben
sollte (so jedenfalls notiert).

Jetzt liefert es mir aber nur ein rotes 'X' zurueck und einen kleinen 
Glitch (siehe .png).
Meine Umgebung jetzt: ModelSim Actel 6.5d

Habe ich etwas uebersehen?

Danke,

Clemens

hier der Code:
---------------------------------------------------------------------------
-- monoflop.vhd
-- monoflop with adjustable time to stretch a pulse
---------------------------------------------------------------------------
-- simcheck 20070426

library ieee;
use ieee.std_logic_1164.all;

entity monoflop is
  generic(time : integer := 10);        -- stretch a pulse to time clk's
  port(
    clk     : in  std_logic;
    reset   : in  std_logic;
    trigger : in  std_logic;
    q       : out std_logic);
end monoflop;

architecture arch of monoflop is
begin
  process (clk, reset)
    variable count : natural range 0 to time;
  begin
    if reset = '1' then
      count := time;                    -- count = time = stop
      q     <= '0';
    elsif rising_edge(clk) then
      if trigger = '1' then
        q     <= '1';
        count := 1;                     -- start at 1 for exact timing!
      elsif count < time then
        q     <= '1';
        count := count +1;
      else                              -- count = time = stop
        q <= '0';
      end if;
    end if;
  end process;
end arch;

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

Bewertung
0 lesenswert
nicht lesenswert
Wie sieht die Testbench aus?
Treibt die auch auf q?

Autor: Clemens Koller (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Anbei die Testbench:
---------------------------------------------------------------------------
-- monoflop_t.vhd
-- monoflop testbench
---------------------------------------------------------------------------
-- simcheck 20070426

library IEEE;
use IEEE.std_logic_1164.all;

entity monoflop_t is
end monoflop_t;

architecture arch of monoflop_t is

  component monoflop
    generic (time : positive := 100);
    port(
      clk     : in  std_logic;
      reset   : in  std_logic;
      trigger : in  std_logic;
      q       : out std_logic);
  end component;

  signal clk     : std_logic := '1';  -- have rising clk on even time boundaries
  signal reset   : std_logic;
  signal trigger : std_logic := '0';
  signal q       : std_logic;
  
begin
  
  dut : monoflop port map(clk, reset, trigger, q);

  clock : process
  begin
    wait for 5 ns; clk <= not clk;      -- 100MHz clock
  end process clock;

  init : process
  begin
    reset <= '0';
    wait for 25 ns;
    reset <= '1';
    wait for 72 ns;
    reset <= '0';
    wait;
  end process init;

  trig : process
  begin
    wait for (1 ms - 1 ns);
    --wait for 2 ns;
    trigger <= '1';
    wait for 2 ns;
    trigger <= '0';
    wait for (100 us - 3 ns);
    trigger <= '1';
    wait for 50 us + 5 ns;
    trigger <= '0';
  end process trig;

end arch;

Autor: Klaus Falser (kfalser)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das ist nicht die Testbench zum Bild!

Autor: berndl (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
was mir auffaellt: Du verwendest fuer deinen Counterendwert einmal 
'positive', dann 'integer' und dann fuer den Counter noch 'natural'. Das 
wuerde ich mal begradigen...

Ausserdem ist ein Signal-/Generic-Name 'time' auch ziemlich 
ungewoehnlich, sicher dass da nicht ein Tool verrueckt spielt?

Autor: Clemens Koller (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke, Leute!

Ich hab den Fehler gefunden! :-)

Danke Lothar fuer den Tip... ich hab den trigger eine Instanz
hoeher ueberschrieben, sodass der Ausgang q undefiniert ist,
wenn das Monoflop noch zaehlt.
Ja, aufraeumen ist da auch noetig.

Kaum macht man drei Jahre lang nichts mehr mit dem Zeugs...

Einen schoenen Gruss,

Clemens

Anbei der ueberarbeitete und funktionierende Code:
---------------------------------------------------------------------------
-- monoflop.vhd
-- retriggerable monoflop, adjustable pulse length
---------------------------------------------------------------------------
-- simcheck 20070426, 20101222

library ieee;
use ieee.std_logic_1164.all;

entity monoflop is
  generic(len : natural := 10);        -- stretch a pulse to len
  port(
    clk     : in  std_logic;
    reset   : in  std_logic;
    trigger : in  std_logic;
    q       : out std_logic);
end monoflop;

architecture arch of monoflop is
begin
  process (clk, reset)
    variable count : natural range 0 to len;
  begin
    if reset = '1' then
      count := len;                    -- stop
      q     <= '0';
    elsif rising_edge(clk) then
      if trigger = '1' then
        q     <= '1';
        count := 1;                     -- start at 1 for exact timing!
      elsif count < len then
        q     <= '1';
        count := count + 1;
      else
        q <= '0';
      end if;
    end if;
  end process;
end arch;

... und die Testbench:
---------------------------------------------------------------------------
-- monoflop_t.vhd
-- monoflop testbench
---------------------------------------------------------------------------
-- simcheck 20070426, 20101222

library IEEE;
use IEEE.std_logic_1164.all;

entity monoflop_t is
end monoflop_t;

architecture arch of monoflop_t is

  component monoflop
    generic (len : natural := 16);      -- stretch pulse to len
    port(
      clk     : in  std_logic;
      reset   : in  std_logic;
      trigger : in  std_logic;
      q       : out std_logic);
  end component;

  signal clk     : std_logic := '1';  -- have rising clk on even time boundaries
  signal reset   : std_logic;
  signal trigger : std_logic := '0';
  signal q       : std_logic;
  
begin
  
  dut : monoflop port map(clk, reset, trigger, q);

  clock : process
  begin
    wait for 5 ns; clk <= not clk;      -- 100MHz clock
  end process clock;

  init : process
  begin
    reset <= '0';
    wait for 25 ns;
    reset <= '1';
    wait for 72 ns;
    reset <= '0';
    wait;
  end process init;

  trig : process
  begin
    wait for (1 us - 1 ns);
    trigger <= '1';
    wait for 20 ns;
    trigger <= '0';
    wait for (1 us - 3 ns);
    trigger <= '1';
    wait for 2 us + 5 ns;
    trigger <= '0';
  end process trig;

end arch;

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.