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


von Clemens Koller (Gast)


Angehängte Dateien:

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:
1
---------------------------------------------------------------------------
2
-- monoflop.vhd
3
-- monoflop with adjustable time to stretch a pulse
4
---------------------------------------------------------------------------
5
-- simcheck 20070426
6
7
library ieee;
8
use ieee.std_logic_1164.all;
9
10
entity monoflop is
11
  generic(time : integer := 10);        -- stretch a pulse to time clk's
12
  port(
13
    clk     : in  std_logic;
14
    reset   : in  std_logic;
15
    trigger : in  std_logic;
16
    q       : out std_logic);
17
end monoflop;
18
19
architecture arch of monoflop is
20
begin
21
  process (clk, reset)
22
    variable count : natural range 0 to time;
23
  begin
24
    if reset = '1' then
25
      count := time;                    -- count = time = stop
26
      q     <= '0';
27
    elsif rising_edge(clk) then
28
      if trigger = '1' then
29
        q     <= '1';
30
        count := 1;                     -- start at 1 for exact timing!
31
      elsif count < time then
32
        q     <= '1';
33
        count := count +1;
34
      else                              -- count = time = stop
35
        q <= '0';
36
      end if;
37
    end if;
38
  end process;
39
end arch;

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


Lesenswert?

Wie sieht die Testbench aus?
Treibt die auch auf q?

von Clemens Koller (Gast)


Lesenswert?

Anbei die Testbench:
1
---------------------------------------------------------------------------
2
-- monoflop_t.vhd
3
-- monoflop testbench
4
---------------------------------------------------------------------------
5
-- simcheck 20070426
6
7
library IEEE;
8
use IEEE.std_logic_1164.all;
9
10
entity monoflop_t is
11
end monoflop_t;
12
13
architecture arch of monoflop_t is
14
15
  component monoflop
16
    generic (time : positive := 100);
17
    port(
18
      clk     : in  std_logic;
19
      reset   : in  std_logic;
20
      trigger : in  std_logic;
21
      q       : out std_logic);
22
  end component;
23
24
  signal clk     : std_logic := '1';  -- have rising clk on even time boundaries
25
  signal reset   : std_logic;
26
  signal trigger : std_logic := '0';
27
  signal q       : std_logic;
28
  
29
begin
30
  
31
  dut : monoflop port map(clk, reset, trigger, q);
32
33
  clock : process
34
  begin
35
    wait for 5 ns; clk <= not clk;      -- 100MHz clock
36
  end process clock;
37
38
  init : process
39
  begin
40
    reset <= '0';
41
    wait for 25 ns;
42
    reset <= '1';
43
    wait for 72 ns;
44
    reset <= '0';
45
    wait;
46
  end process init;
47
48
  trig : process
49
  begin
50
    wait for (1 ms - 1 ns);
51
    --wait for 2 ns;
52
    trigger <= '1';
53
    wait for 2 ns;
54
    trigger <= '0';
55
    wait for (100 us - 3 ns);
56
    trigger <= '1';
57
    wait for 50 us + 5 ns;
58
    trigger <= '0';
59
  end process trig;
60
61
end arch;

von Klaus F. (kfalser)


Lesenswert?

Das ist nicht die Testbench zum Bild!

von berndl (Gast)


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?

von Clemens Koller (Gast)


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:
1
---------------------------------------------------------------------------
2
-- monoflop.vhd
3
-- retriggerable monoflop, adjustable pulse length
4
---------------------------------------------------------------------------
5
-- simcheck 20070426, 20101222
6
7
library ieee;
8
use ieee.std_logic_1164.all;
9
10
entity monoflop is
11
  generic(len : natural := 10);        -- stretch a pulse to len
12
  port(
13
    clk     : in  std_logic;
14
    reset   : in  std_logic;
15
    trigger : in  std_logic;
16
    q       : out std_logic);
17
end monoflop;
18
19
architecture arch of monoflop is
20
begin
21
  process (clk, reset)
22
    variable count : natural range 0 to len;
23
  begin
24
    if reset = '1' then
25
      count := len;                    -- stop
26
      q     <= '0';
27
    elsif rising_edge(clk) then
28
      if trigger = '1' then
29
        q     <= '1';
30
        count := 1;                     -- start at 1 for exact timing!
31
      elsif count < len then
32
        q     <= '1';
33
        count := count + 1;
34
      else
35
        q <= '0';
36
      end if;
37
    end if;
38
  end process;
39
end arch;

... und die Testbench:
1
---------------------------------------------------------------------------
2
-- monoflop_t.vhd
3
-- monoflop testbench
4
---------------------------------------------------------------------------
5
-- simcheck 20070426, 20101222
6
7
library IEEE;
8
use IEEE.std_logic_1164.all;
9
10
entity monoflop_t is
11
end monoflop_t;
12
13
architecture arch of monoflop_t is
14
15
  component monoflop
16
    generic (len : natural := 16);      -- stretch pulse to len
17
    port(
18
      clk     : in  std_logic;
19
      reset   : in  std_logic;
20
      trigger : in  std_logic;
21
      q       : out std_logic);
22
  end component;
23
24
  signal clk     : std_logic := '1';  -- have rising clk on even time boundaries
25
  signal reset   : std_logic;
26
  signal trigger : std_logic := '0';
27
  signal q       : std_logic;
28
  
29
begin
30
  
31
  dut : monoflop port map(clk, reset, trigger, q);
32
33
  clock : process
34
  begin
35
    wait for 5 ns; clk <= not clk;      -- 100MHz clock
36
  end process clock;
37
38
  init : process
39
  begin
40
    reset <= '0';
41
    wait for 25 ns;
42
    reset <= '1';
43
    wait for 72 ns;
44
    reset <= '0';
45
    wait;
46
  end process init;
47
48
  trig : process
49
  begin
50
    wait for (1 us - 1 ns);
51
    trigger <= '1';
52
    wait for 20 ns;
53
    trigger <= '0';
54
    wait for (1 us - 3 ns);
55
    trigger <= '1';
56
    wait for 2 us + 5 ns;
57
    trigger <= '0';
58
  end process trig;
59
60
end arch;

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.