1 | library ieee;
|
2 |
|
3 | use ieee.std_logic_1164.all;
|
4 | use ieee.std_logic_unsigned.all;
|
5 | use ieee.std_logic_arith.all;
|
6 |
|
7 | use work.zlm2k4_pkg.all;
|
8 |
|
9 | entity xj2bin32 is
|
10 | generic(
|
11 | delay: time:= 1.0 ns); -- Generic delay
|
12 | port (
|
13 | HCLK : in std_logic; -- High Clock, 240 MHz
|
14 | RESET : in std_logic; -- System Reset, high active, asynchron
|
15 | --
|
16 | Z : in slv32; -- Measurement interface
|
17 | -- MASK : in slv6; -- Mask
|
18 | --
|
19 | X : out slv32);
|
20 | end xj2bin32;
|
21 |
|
22 |
|
23 | architecture rtl of xj2bin32 is
|
24 | --
|
25 | -- component declaration
|
26 | --
|
27 | component udc26
|
28 | port (
|
29 | Q: OUT std_logic_VECTOR(25 downto 0);
|
30 | CLK: IN std_logic;
|
31 | UP: IN std_logic;
|
32 | CE: IN std_logic;
|
33 | ACLR: IN std_logic);
|
34 | end component;
|
35 |
|
36 | --
|
37 | -- Signal declaration
|
38 | --
|
39 | signal Z_Q : std_logic_vector(Z'range);
|
40 | signal Z_QQ : std_logic_vector(Z'range);
|
41 | signal Z_QQQ : std_logic_vector(Z'range);
|
42 | signal Q : slv26; -- Output 26-bit-up/down counter
|
43 | signal O : slv32; -- Counter + decoder
|
44 | signal XLOW : slv6; -- Decoder output
|
45 | signal XZOUT: slv32;
|
46 |
|
47 | signal CE : std_logic; -- Count Enable
|
48 | signal UP : std_logic; -- 1:UP, 0:DOWN
|
49 |
|
50 | signal C1 : slv3;
|
51 | signal C2 : slv3;
|
52 |
|
53 | begin
|
54 |
|
55 |
|
56 | PSYNCZ:process(RESET,HCLK)
|
57 | begin
|
58 | if RESET = '1' then
|
59 | Z_Q <= (Z'range => '0') after delay;
|
60 | Z_QQ <= (Z'range => '0') after delay;
|
61 | Z_QQQ <= (Z'range => '0') after delay;
|
62 | elsif rising_edge(HCLK) then
|
63 | Z_Q <= Z after delay;
|
64 | Z_QQ <= Z_Q after delay;
|
65 | Z_QQQ <= Z_QQ after delay;
|
66 | end if;
|
67 | end process PSYNCZ;
|
68 |
|
69 |
|
70 | C1 <= Z_Q(0) & Z_QQ(0) & Z_Q(16) after delay;
|
71 | C2 <= Z_Q(16) & Z_QQ(16) & Z_Q(0) after delay;
|
72 |
|
73 | P100:process(RESET,HCLK)
|
74 | begin
|
75 | if RESET = '1' then
|
76 | CE <= '0' after delay;
|
77 | UP <= '0' after delay;
|
78 | elsif rising_edge(HCLK) then
|
79 | if C1 = "100" then
|
80 | UP <= '1' after delay;
|
81 | CE <= '1' after delay;
|
82 | elsif C2 = "101" then
|
83 | UP <= '1' after delay;
|
84 | CE <= '0' after delay;
|
85 | elsif C1 = "011" then
|
86 | UP <= '1' after delay;
|
87 | CE <= '0' after delay;
|
88 | elsif C2 = "010" then
|
89 | UP <= '1' after delay;
|
90 | CE <= '0' after delay;
|
91 | elsif C1 = "010" then
|
92 | UP <= '0' after delay;
|
93 | CE <= '1' after delay;
|
94 | elsif C2 = "100" then
|
95 | UP <= '0' after delay;
|
96 | CE <= '0' after delay;
|
97 | elsif C1 = "101" then
|
98 | UP <= '0' after delay;
|
99 | CE <= '0' after delay;
|
100 | elsif C2 = "011" then
|
101 | UP <= '0' after delay;
|
102 | CE <= '0' after delay;
|
103 | else
|
104 | CE <= '0' after delay;
|
105 | end if;
|
106 | end if;
|
107 | end process P100;
|
108 |
|
109 | --
|
110 | -- 26 up/down counter
|
111 | --
|
112 | U1: udc26
|
113 | port map (
|
114 | Q => Q,
|
115 | CLK => HCLK,
|
116 | UP => UP,
|
117 | CE => CE,
|
118 | ACLR => RESET);
|
119 |
|
120 | XLOW <= convert4(Z_QQQ);
|
121 | -- XZOUT(0) <= Z_QQQ(0);
|
122 | -- XZOUT(1) <= Z_QQQ(1);
|
123 | -- XZOUT(2) <= Z_QQQ(2);
|
124 | -- XZOUT(3) <= Z_QQQ(3);
|
125 | -- XZOUT(4) <= Z_QQQ(4);
|
126 | -- XZOUT(5) <= Z_QQQ(5);
|
127 | -- XZOUT(6) <= Z_QQQ(6);
|
128 | -- XZOUT(7) <= Z_QQQ(7);
|
129 | -- XZOUT(8) <= Z_QQQ(8);
|
130 | -- XZOUT(9) <= Z_QQQ(9);
|
131 | -- XZOUT(10) <= Z_QQQ(10);
|
132 | -- XZOUT(11) <= Z_QQQ(11);
|
133 | -- XZOUT(12) <= Z_QQQ(12);
|
134 | -- XZOUT(13) <= Z_QQQ(13);
|
135 | -- XZOUT(14) <= Z_QQQ(14);
|
136 | -- XZOUT(15) <= Z_QQQ(15);
|
137 | -- XZOUT(16) <= Z_QQQ(16);
|
138 | -- XZOUT(17) <= Z_QQQ(17);
|
139 | -- XZOUT(18) <= Z_QQQ(18);
|
140 | -- XZOUT(19) <= Z_QQQ(19);
|
141 | -- XZOUT(20) <= Z_QQQ(20);
|
142 | -- XZOUT(21) <= Z_QQQ(21);
|
143 | -- XZOUT(22) <= Z_QQQ(22);
|
144 | -- XZOUT(23) <= Z_QQQ(23);
|
145 | -- XZOUT(24) <= Z_QQQ(24);
|
146 | -- XZOUT(25) <= Z_QQQ(25);
|
147 | -- XZOUT(26) <= Z_QQQ(26);
|
148 | -- XZOUT(27) <= Z_QQQ(27);
|
149 | -- XZOUT(28) <= Z_QQQ(28);
|
150 | -- XZOUT(29) <= Z_QQQ(29);
|
151 | -- XZOUT(30) <= Z_QQQ(30);
|
152 | -- XZOUT(31) <= Z_QQQ(31);
|
153 |
|
154 | -- XZOUT <= bitclear(Z_QQQ);
|
155 | -- XLOW(0) := '0';
|
156 | -- XLOW(1) := '0';
|
157 | -- XLOW(2) := '0';
|
158 | -- XLOW(3) := '0';
|
159 | -- XLOW(4) := '0';
|
160 | -- XLOW(5) := '0';
|
161 |
|
162 |
|
163 |
|
164 | POUT:process(RESET,HCLK)
|
165 | variable O : slv32; -- Counter + decoder
|
166 | variable T : slv6;
|
167 | begin
|
168 | if RESET = '1' then
|
169 | X <= (X'range => '0') after delay;
|
170 | elsif rising_edge(HCLK) then
|
171 | -- O := Q & XLOW;
|
172 | -- T := MASK and O(5 downto 0);
|
173 | -- X <= O(31 downto 6) & T after delay;
|
174 | -- X <= Q & XLOW after delay;
|
175 | -- X <= XZOUT after delay;
|
176 |
|
177 | X <= Q & XLOW after delay;
|
178 |
|
179 |
|
180 |
|
181 | end if;
|
182 | end process POUT;
|
183 |
|
184 |
|
185 | end rtl;
|