1
|
library IEEE;
|
2
|
|
3
|
use IEEE.std_logic_1164.ALL;
|
4
|
|
5
|
entity failed_registers is
|
6
|
port
|
7
|
(
|
8
|
i_clock: in std_logic;
|
9
|
i_reset: in std_logic;
|
10
|
i_a: in std_logic;
|
11
|
i_b: in std_logic;
|
12
|
i_c: in std_logic;
|
13
|
o_a: out std_logic;
|
14
|
o_b: out std_logic;
|
15
|
o_c: out std_logic
|
16
|
);
|
17
|
end entity failed_registers;
|
18
|
|
19
|
architecture Behavioral of failed_registers is
|
20
|
signal flipflop_0: std_logic;
|
21
|
signal latch_0: std_logic;
|
22
|
signal latch_1: std_logic;
|
23
|
begin
|
24
|
|
25
|
-- (not (is_simple_register_of flipflop_0 i_a i_clock))
|
26
|
-- (not (is_async_register_of flipflop_0 i_a i_clock))
|
27
|
-- (not (is_sync_register_of flipflop_0 i_a i_clock))
|
28
|
-- This is still a flipflop, but not one that simply stores 'i_a', instead
|
29
|
-- it seems to have an "enable" signal (i_c = '1').
|
30
|
process (i_clock)
|
31
|
begin
|
32
|
o_a <= i_a;
|
33
|
if (i_b = '1')
|
34
|
begin
|
35
|
o_b <= (not i_a);
|
36
|
if (rising_edge(i_clock))
|
37
|
begin
|
38
|
o_c <= flipflop_0;
|
39
|
if (i_c = '1')
|
40
|
then
|
41
|
flipflop_0 <= i_a;
|
42
|
end if;
|
43
|
end if;
|
44
|
else
|
45
|
if (rising_edge(i_clock))
|
46
|
begin
|
47
|
o_c <= (not flipflop_0);
|
48
|
flipflop_0 <= i_a;
|
49
|
end if;
|
50
|
end if;
|
51
|
end process;
|
52
|
|
53
|
-- (not (is_simple_register_of latch_0 i_a i_clock))
|
54
|
-- (not (is_async_register_of latch_0 i_a i_clock))
|
55
|
-- (not (is_sync_register_of latch_0 i_a i_clock))
|
56
|
-- This is not a flipflop: the last instruction actually overrides all
|
57
|
-- previous "assignements" to 'latch_0', meaning that 'latch_0' is
|
58
|
-- reassigned at every change in 'i_clock'.
|
59
|
process (i_clock)
|
60
|
begin
|
61
|
o_a <= i_a;
|
62
|
if (i_b = '1')
|
63
|
begin
|
64
|
o_b <= (not i_a);
|
65
|
if (rising_edge(i_clock))
|
66
|
begin
|
67
|
o_c <= latch_0;
|
68
|
if (i_c = '1')
|
69
|
then
|
70
|
latch_0 <= i_a;
|
71
|
else
|
72
|
latch_0 <= i_a;
|
73
|
end if;
|
74
|
end if;
|
75
|
else
|
76
|
if (rising_edge(i_clock))
|
77
|
begin
|
78
|
o_c <= (not latch_0);
|
79
|
latch_0 <= i_a;
|
80
|
end if;
|
81
|
end if;
|
82
|
latch_0 <= i_a;
|
83
|
end process;
|
84
|
|
85
|
-- (not (is_simple_register_of latch_1 i_a i_clock))
|
86
|
-- (not (is_async_register_of latch_1 i_a i_clock))
|
87
|
-- (not (is_sync_register_of latch_1 i_a i_clock))
|
88
|
-- This is not a flipflop: rising_edge in one branch, falling_edge in the
|
89
|
-- other.
|
90
|
process (i_clock)
|
91
|
begin
|
92
|
o_a <= i_a;
|
93
|
if (i_b = '1')
|
94
|
begin
|
95
|
o_b <= (not i_a);
|
96
|
if (rising_edge(i_clock))
|
97
|
begin
|
98
|
o_c <= latch_1;
|
99
|
if (i_c = '1')
|
100
|
then
|
101
|
latch_1 <= i_a;
|
102
|
else
|
103
|
latch_1 <= i_a;
|
104
|
end if;
|
105
|
end if;
|
106
|
else
|
107
|
if (falling_edge(i_clock))
|
108
|
begin
|
109
|
o_c <= (not flip_flop_6);
|
110
|
latch_1 <= i_a;
|
111
|
end if;
|
112
|
end if;
|
113
|
end process;
|
114
|
end architecture;
|