2 use ieee.std_logic_1164.all;
3 use ieee.std_logic_arith.all;
4 use ieee.std_logic_unsigned.all;
6 --------------------------------------------------------------------------------
10 LUT_ADR_W : integer := 10;
11 LUT_DAT_W : integer := 9);
13 -- Primary slave intefrace
14 ACK_O : out std_logic;
18 -- Wave table interface
19 LUT_STB_O : out std_logic;
20 LUT_ADR_O : out std_logic_vector (LUT_ADR_W-1 downto 0);
21 LUT_DAT_I : in std_logic_vector (LUT_DAT_W-1 downto 0);
23 IRC_DAT_I : in std_logic_vector (15 downto 0);
25 PWM_DAT_O : out std_logic_vector (LUT_DAT_W-1 downto 0);
26 PWM1_STB_O : out std_logic;
27 PWM2_STB_O : out std_logic;
28 PWM3_STB_O : out std_logic;
29 -- Shared memory interface
30 IRF_ACK_I : in std_logic;
31 IRF_ADR_O : out std_logic_vector (4 downto 0);
32 IRF_DAT_I : in std_logic_vector (15 downto 0);
33 IRF_DAT_O : out std_logic_vector (15 downto 0);
34 IRF_STB_O : out std_logic;
35 IRF_WE_O : out std_logic);
38 --------------------------------------------------------------------------------
40 architecture behavioral of mcc is
42 constant IRF_ADR_W : integer := 5;
44 constant MCC_W : integer := 6;
45 constant MUX_W : integer := 3;
47 constant P_BASE : integer := 16;
48 constant P_SIZE : integer := 4;
51 signal MCC_ACK : std_logic_vector (MCC_W-1 downto 0);
52 signal MCC_STB : std_logic_vector (MCC_W-1 downto 0);
53 signal MCC_MUX_CODE : std_logic_vector (MUX_W-1 downto 0);
54 signal MCC_MUX_EN : std_logic;
56 signal MUL_A : std_logic_vector (15 downto 0);
57 signal MUL_B : std_logic_vector (15 downto 0);
58 signal MUL_PROD : std_logic_vector (31 downto 0);
60 signal MASTER_IRF_ADR_O : std_logic_vector (IRF_ADR_W-1 downto 0);
61 signal MASTER_IRF_DAT_O : std_logic_vector (15 downto 0);
62 signal MASTER_IRF_STB_O : std_logic;
63 signal MASTER_IRF_WE_O : std_logic;
65 signal VECTOR_IRF_ADR_O : std_logic_vector (IRF_ADR_W-1 downto 0);
66 signal VECTOR_IRF_DAT_O : std_logic_vector (15 downto 0);
67 signal VECTOR_IRF_STB_O : std_logic;
68 signal VECTOR_IRF_WE_O : std_logic;
70 signal SCALE_IRF_ADR_O : std_logic_vector (IRF_ADR_W-1 downto 0);
71 signal SCALE_IRF_DAT_O : std_logic_vector (15 downto 0);
72 signal SCALE_IRF_STB_O : std_logic;
73 signal SCALE_IRF_WE_O : std_logic;
74 signal SCALE_SL_ACK_O : std_logic;
75 signal SCALE_SL_IRF_ADR_O : std_logic_vector (IRF_ADR_W-1 downto 0);
76 signal SCALE_SL_STB_I : std_logic;
78 signal PWM_IRF_ADR_O : std_logic_vector (IRF_ADR_W-1 downto 0);
79 signal PWM_IRF_STB_O : std_logic;
80 --signal PWM_DAT_O : std_logic_vector (LUT_DAT_W-1 downto 0);
81 signal PWM_STB_O : std_logic;
82 signal PWM_SL_ACK_O : std_logic;
83 signal PWM_SL_IRF_ADR_O : std_logic_vector (IRF_ADR_W-1 downto 0);
84 signal PWM_SL_STB_I : std_logic;
85 signal PWM_SL_MUX_CODE : std_logic_vector (1 downto 0);
87 signal IRC_IRF_ADR_O : std_logic_vector (IRF_ADR_W-1 downto 0);
88 signal IRC_IRF_DAT_O : std_logic_vector (15 downto 0);
89 signal IRC_IRF_STB_O : std_logic;
90 signal IRC_IRF_WE_O : std_logic;
92 signal BASE_IRF_ADR_O : std_logic_vector (IRF_ADR_W-1 downto 0);
93 signal BASE_IRF_DAT_O : std_logic_vector (15 downto 0);
94 signal BASE_IRF_STB_O : std_logic;
95 signal BASE_IRF_WE_O : std_logic;
98 type state_t is (ready, read_mask, do_mcc, done);
100 signal state : state_t;
102 signal mcc_mask : std_logic_vector (MCC_W-1 downto 0);
103 signal mcc_ack_inner : std_logic_vector (MCC_W downto 0);
104 signal mcc_stb_inner : std_logic_vector (MCC_W-1 downto 0);
105 signal mux_code_inner : std_logic_vector (MUX_W-1 downto 0);
106 signal mcc_exec : std_logic;
108 --------------------------------------------------------------------------------
112 IRF_ADR_O <= MASTER_IRF_ADR_O when MCC_MUX_EN = '0' else
113 IRC_IRF_ADR_O when MCC_MUX_CODE = 0 else
114 BASE_IRF_ADR_O when MCC_MUX_CODE = 1 else
115 VECTOR_IRF_ADR_O when MCC_MUX_CODE = 2 else
116 SCALE_IRF_ADR_O when MCC_MUX_CODE = 3 else
117 PWM_IRF_ADR_O when MCC_MUX_CODE = 5 else
120 IRF_DAT_O <= MASTER_IRF_DAT_O when MCC_MUX_EN = '0' else
121 IRC_IRF_DAT_O when MCC_MUX_CODE = 0 else
122 BASE_IRF_DAT_O when MCC_MUX_CODE = 1 else
123 VECTOR_IRF_DAT_O when MCC_MUX_CODE = 2 else
124 SCALE_IRF_DAT_O when MCC_MUX_CODE = 3 else
127 IRF_STB_O <= MASTER_IRF_STB_O when MCC_MUX_EN = '0' else
128 IRC_IRF_STB_O when MCC_MUX_CODE = 0 else
129 BASE_IRF_STB_O when MCC_MUX_CODE = 1 else
130 VECTOR_IRF_STB_O when MCC_MUX_CODE = 2 else
131 SCALE_IRF_STB_O when MCC_MUX_CODE = 3 else
132 PWM_IRF_STB_O when MCC_MUX_CODE = 5 else
135 IRF_WE_O <= MASTER_IRF_WE_O when MCC_MUX_EN = '0' else
136 IRC_IRF_WE_O when MCC_MUX_CODE = 0 else
137 BASE_IRF_WE_O when MCC_MUX_CODE = 1 else
138 VECTOR_IRF_WE_O when MCC_MUX_CODE = 2 else
139 SCALE_IRF_WE_O when MCC_MUX_CODE = 3 else
143 PWM1_STB_O <= PWM_STB_O when PWM_SL_MUX_CODE = 0 else '0';
144 PWM2_STB_O <= PWM_STB_O when PWM_SL_MUX_CODE = 1 else '0';
145 PWM3_STB_O <= PWM_STB_O when PWM_SL_MUX_CODE = 2 else '0';
150 mcc_master_1 : entity work.mcc_master
154 IRF_ADR_W => IRF_ADR_W)
160 MCC_STB_O => MCC_STB,
161 MCC_ACK_I => MCC_ACK,
162 MCC_MUX_CODE => MCC_MUX_CODE,
163 MCC_MUX_EN => MCC_MUX_EN,
164 IRF_ACK_I => IRF_ACK_I,
165 IRF_ADR_O => MASTER_IRF_ADR_O,
166 IRF_DAT_I => IRF_DAT_I,
167 IRF_DAT_O => MASTER_IRF_DAT_O,
168 IRF_STB_O => MASTER_IRF_STB_O,
169 IRF_WE_O => MASTER_IRF_WE_O);
171 multiplier_1 : entity work.multiplier
177 irc_dump_1 : entity work.irc_dump
179 IRF_ADR_W => IRF_ADR_W,
182 ACK_O => MCC_ACK (0),
185 STB_I => MCC_STB (0),
186 IRC_DAT_I => IRC_DAT_I,
187 IRF_ACK_I => IRF_ACK_I,
188 IRF_ADR_O => IRC_IRF_ADR_O,
189 IRF_DAT_O => IRC_IRF_DAT_O,
190 IRF_STB_O => IRC_IRF_STB_O,
191 IRF_WE_O => IRC_IRF_WE_O);
193 irc_base_1 : entity work.irc_base
195 IRF_ADR_W => IRF_ADR_W,
202 ACK_O => MCC_ACK (1),
205 STB_I => MCC_STB (1),
206 IRF_ACK_I => IRF_ACK_I,
207 IRF_ADR_O => BASE_IRF_ADR_O,
208 IRF_DAT_I => IRF_DAT_I,
209 IRF_DAT_O => BASE_IRF_DAT_O,
210 IRF_STB_O => BASE_IRF_STB_O,
211 IRF_WE_O => BASE_IRF_WE_O,
214 vector_gen_1 : entity work.vector_gen
228 ACK_O => MCC_ACK (2),
231 STB_I => MCC_STB (2),
232 IRF_ACK_I => IRF_ACK_I,
233 IRF_ADR_O => VECTOR_IRF_ADR_O,
235 IRF_DAT_I => IRF_DAT_I,
236 IRF_DAT_O => VECTOR_IRF_DAT_O,
237 IRF_STB_O => VECTOR_IRF_STB_O,
238 IRF_WE_O => VECTOR_IRF_WE_O,
239 LUT_ADR_O => LUT_ADR_O,
240 LUT_DAT_I => LUT_DAT_I,
241 LUT_STB_O => LUT_STB_O);
243 vector_scale_sequencer : entity work.sequencer
245 IRF_ADR_W => IRF_ADR_W,
249 ACK_O => MCC_ACK (3),
252 STB_I => MCC_STB (3),
253 IRF_ADR_O => SCALE_IRF_ADR_O,
254 SL_ACK_I => SCALE_SL_ACK_O,
255 SL_IRF_ADR_I => SCALE_SL_IRF_ADR_O,
256 SL_STB_O => SCALE_SL_STB_I,
257 SL_MUX_CODE => open);
259 vector_scale_1 : entity work.vector_scale
261 IRF_ADR_W => IRF_ADR_W,
264 PHASE_BASE => P_BASE,
267 VECTOR_W => LUT_DAT_W)
269 ACK_O => SCALE_SL_ACK_O,
272 STB_I => SCALE_SL_STB_I,
275 MUL_PROD => MUL_PROD,
276 IRF_ACK_I => IRF_ACK_I,
277 IRF_ADR_O => SCALE_SL_IRF_ADR_O,
278 IRF_DAT_I => IRF_DAT_I,
279 IRF_DAT_O => SCALE_IRF_DAT_O,
280 IRF_STB_O => SCALE_IRF_STB_O,
281 IRF_WE_O => SCALE_IRF_WE_O);
284 pwm_dump_sequencer : entity work.sequencer
286 IRF_ADR_W => IRF_ADR_W,
290 ACK_O => MCC_ACK (5),
293 STB_I => MCC_STB (5),
294 IRF_ADR_O => PWM_IRF_ADR_O,
295 SL_ACK_I => PWM_SL_ACK_O,
296 SL_IRF_ADR_I => PWM_SL_IRF_ADR_O,
297 SL_STB_O => PWM_SL_STB_I,
298 SL_MUX_CODE => PWM_SL_MUX_CODE);
300 pwm_dump_1 : entity work.pwm_dump
302 IRF_ADR_W => IRF_ADR_W,
307 ACK_O => PWM_SL_ACK_O,
310 STB_I => PWM_SL_STB_I,
311 PWM_DAT_O => PWM_DAT_O,
312 PWM_STB_O => PWM_STB_O,
313 IRF_ACK_I => IRF_ACK_I,
314 IRF_ADR_O => PWM_SL_IRF_ADR_O,
315 IRF_DAT_I => IRF_DAT_I,
316 IRF_STB_O => PWM_IRF_STB_O);
318 end architecture behavioral;