Monoflop liefert neuerdings 'X'

Gast #1986457
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;
Angehängte Dateien:
Gast #1986471
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;
Gast #1986510
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?
Gast #1986641
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;

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