-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathbridge_fake_rob.vhdl
116 lines (104 loc) · 3.56 KB
/
bridge_fake_rob.vhdl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY bridge_fake_rob IS
GENERIC (
num_clk : NATURAL := 17
);
PORT (
clk : IN STD_LOGIC; -- fpga clock
rst : IN STD_LOGIC; -- fpga reset
clk_in : IN STD_LOGIC; -- protocal clock
clk_out : OUT STD_LOGIC; -- new clock
data_out : OUT STD_LOGIC; -- data to buffer
data_in : IN STD_LOGIC -- data from encoder
);
END bridge_fake_rob;
ARCHITECTURE rtl OF bridge_fake_rob IS
TYPE edge_type IS ARRAY (0 TO 1) OF STD_LOGIC;
SIGNAL edge : edge_type; -- edge detector for protocal clock
SIGNAL edge_gen : edge_type;
SIGNAL h_period : INTEGER;
SIGNAL tmp_h_period : INTEGER;
SIGNAL count : INTEGER RANGE 0 TO INTEGER'HIGH;
SIGNAL ticks : INTEGER RANGE 0 TO 17;
SIGNAL clk_s : STD_LOGIC;
SIGNAL rst_data : STD_LOGIC;
BEGIN
clk_out <= clk_s;
PROC_EDGE :
PROCESS(clk) BEGIN
IF RISING_EDGE(clk) THEN
IF rst = '1' THEN
edge(1) <= '1';
edge(0) <= '1';
edge_gen(1) <= '1';
edge_gen(0) <= '1';
ELSE
edge(1) <= edge(0);
edge(0) <= clk_in;
edge_gen(1) <= edge_gen(0);
edge_gen(0) <= clk_s;
END IF;
END IF;
END PROCESS;
PROC_H_PERIOD :
PROCESS(clk) BEGIN
IF RISING_EDGE(clk) THEN
IF rst = '1' THEN
h_period <= 0;
tmp_h_period <= 0;
ELSE
IF (edge(0) = '0' AND edge(1) = '1') OR (edge(0) = '1' AND edge(1) = '0') THEN
h_period <= tmp_h_period;
tmp_h_period <= 0;
ELSE
tmp_h_period <= tmp_h_period + 1;
END IF;
END IF;
END IF;
END PROCESS;
PROC_CLK_GEN :
PROCESS(clk) BEGIN
IF RISING_EDGE(clk) THEN
IF rst = '1' THEN
clk_s <= '1';
count <= 0;
ticks <= 0;
rst_data <= '0';
ELSE
IF ticks < num_clk - 1 THEN
IF (edge(0) = '1' AND edge(1) = '0') OR (edge(1) = '1' AND edge(0) = '0') THEN
clk_s <= clk_in;
IF edge(0) = '1' AND edge(1) = '0' THEN
ticks <= ticks + 1;
ELSE
ticks <= ticks;
END IF;
END IF;
ELSE
IF count < h_period THEN
clk_s <= '1';
count <= count + 1;
ELSIF count <= h_period * 2 THEN
clk_s <= '0';
count <= count + 1;
ELSE
clk_s <= '1';
count <= 0;
ticks <= 0;
END IF;
END IF;
END IF;
END IF;
END PROCESS;
PROC_DATA :
PROCESS(clk) BEGIN
IF RISING_EDGE(clk) THEN
IF rst = '1' OR rst_data = '1' THEN
data_out <= '1';
ELSIF edge(0) = '0' AND edge(1) = '1' THEN
data_out <= data_in;
END IF;
END IF;
END PROCESS;
END rtl;