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 (IRF_ADR_W-1 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_DAT_O : std_logic_vector (15 downto 0);
80 signal PWM_IRF_STB_O : std_logic;
81 --signal PWM_DAT_O : std_logic_vector (LUT_DAT_W-1 downto 0);
82 signal PWM_STB_O : std_logic;
83 signal PWM_SL_ACK_O : std_logic;
84 signal PWM_SL_IRF_ADR_O : std_logic_vector (IRF_ADR_W-1 downto 0);
85 signal PWM_SL_STB_I : std_logic;
86 signal PWM_SL_MUX_CODE : std_logic_vector (1 downto 0);
88 signal IRC_IRF_ADR_O : std_logic_vector (IRF_ADR_W-1 downto 0);
89 signal IRC_IRF_DAT_O : std_logic_vector (15 downto 0);
90 signal IRC_IRF_STB_O : std_logic;
91 signal IRC_IRF_WE_O : std_logic;
93 signal BASE_IRF_ADR_O : std_logic_vector (IRF_ADR_W-1 downto 0);
94 signal BASE_IRF_DAT_O : std_logic_vector (15 downto 0);
95 signal BASE_IRF_STB_O : std_logic;
96 signal BASE_IRF_WE_O : std_logic;
99 type state_t is (ready, read_mask, do_mcc, done);
101 signal state : state_t;
103 signal mcc_mask : std_logic_vector (MCC_W-1 downto 0);
104 signal mcc_ack_inner : std_logic_vector (MCC_W downto 0);
105 signal mcc_stb_inner : std_logic_vector (MCC_W-1 downto 0);
106 signal mux_code_inner : std_logic_vector (MUX_W-1 downto 0);
107 signal mcc_exec : std_logic;
109 --------------------------------------------------------------------------------
113 IRF_ADR_O <= MASTER_IRF_ADR_O when MCC_MUX_EN = '0' else
114 IRC_IRF_ADR_O when MCC_MUX_CODE = 0 else
115 BASE_IRF_ADR_O when MCC_MUX_CODE = 1 else
116 VECTOR_IRF_ADR_O when MCC_MUX_CODE = 2 else
117 SCALE_IRF_ADR_O when MCC_MUX_CODE = 3 else
118 PWM_IRF_ADR_O when MCC_MUX_CODE = 5 else
121 IRF_DAT_O <= MASTER_IRF_DAT_O when MCC_MUX_EN = '0' else
122 IRC_IRF_DAT_O when MCC_MUX_CODE = 0 else
123 BASE_IRF_DAT_O when MCC_MUX_CODE = 1 else
124 VECTOR_IRF_DAT_O when MCC_MUX_CODE = 2 else
125 SCALE_IRF_DAT_O when MCC_MUX_CODE = 3 else
126 PWM_IRF_DAT_O when MCC_MUX_CODE = 5 else
129 IRF_STB_O <= MASTER_IRF_STB_O when MCC_MUX_EN = '0' else
130 IRC_IRF_STB_O when MCC_MUX_CODE = 0 else
131 BASE_IRF_STB_O when MCC_MUX_CODE = 1 else
132 VECTOR_IRF_STB_O when MCC_MUX_CODE = 2 else
133 SCALE_IRF_STB_O when MCC_MUX_CODE = 3 else
134 PWM_IRF_STB_O when MCC_MUX_CODE = 5 else
137 IRF_WE_O <= MASTER_IRF_WE_O when MCC_MUX_EN = '0' else
138 IRC_IRF_WE_O when MCC_MUX_CODE = 0 else
139 BASE_IRF_WE_O when MCC_MUX_CODE = 1 else
140 VECTOR_IRF_WE_O when MCC_MUX_CODE = 2 else
141 SCALE_IRF_WE_O when MCC_MUX_CODE = 3 else
145 PWM1_STB_O <= PWM_STB_O when PWM_SL_MUX_CODE = 0 else '0';
146 PWM2_STB_O <= PWM_STB_O when PWM_SL_MUX_CODE = 1 else '0';
147 PWM3_STB_O <= PWM_STB_O when PWM_SL_MUX_CODE = 2 else '0';
152 mcc_master_1 : entity work.mcc_master
156 IRF_ADR_W => IRF_ADR_W)
162 MCC_STB_O => MCC_STB,
163 MCC_ACK_I => MCC_ACK,
164 MCC_MUX_CODE => MCC_MUX_CODE,
165 MCC_MUX_EN => MCC_MUX_EN,
166 IRF_ACK_I => IRF_ACK_I,
167 IRF_ADR_O => MASTER_IRF_ADR_O,
168 IRF_DAT_I => IRF_DAT_I,
169 IRF_DAT_O => MASTER_IRF_DAT_O,
170 IRF_STB_O => MASTER_IRF_STB_O,
171 IRF_WE_O => MASTER_IRF_WE_O);
173 multiplier_1 : entity work.multiplier
179 irc_dump_1 : entity work.irc_dump
181 IRF_ADR_W => IRF_ADR_W,
184 ACK_O => MCC_ACK (0),
187 STB_I => MCC_STB (0),
188 IRC_DAT_I => IRC_DAT_I,
189 IRF_ACK_I => IRF_ACK_I,
190 IRF_ADR_O => IRC_IRF_ADR_O,
191 IRF_DAT_O => IRC_IRF_DAT_O,
192 IRF_STB_O => IRC_IRF_STB_O,
193 IRF_WE_O => IRC_IRF_WE_O);
195 irc_base_1 : entity work.irc_base
197 IRF_ADR_W => IRF_ADR_W,
204 ACK_O => MCC_ACK (1),
207 STB_I => MCC_STB (1),
208 IRF_ACK_I => IRF_ACK_I,
209 IRF_ADR_O => BASE_IRF_ADR_O,
210 IRF_DAT_I => IRF_DAT_I,
211 IRF_DAT_O => BASE_IRF_DAT_O,
212 IRF_STB_O => BASE_IRF_STB_O,
213 IRF_WE_O => BASE_IRF_WE_O,
216 vector_gen_1 : entity work.vector_gen
230 ACK_O => MCC_ACK (2),
233 STB_I => MCC_STB (2),
234 IRF_ACK_I => IRF_ACK_I,
235 IRF_ADR_O => VECTOR_IRF_ADR_O,
237 IRF_DAT_I => IRF_DAT_I,
238 IRF_DAT_O => VECTOR_IRF_DAT_O,
239 IRF_STB_O => VECTOR_IRF_STB_O,
240 IRF_WE_O => VECTOR_IRF_WE_O,
241 LUT_ADR_O => LUT_ADR_O,
242 LUT_DAT_I => LUT_DAT_I,
243 LUT_STB_O => LUT_STB_O);
245 vector_scale_sequencer : entity work.sequencer
247 IRF_ADR_W => IRF_ADR_W,
251 ACK_O => MCC_ACK (3),
254 STB_I => MCC_STB (3),
255 IRF_ADR_O => SCALE_IRF_ADR_O,
256 SL_ACK_I => SCALE_SL_ACK_O,
257 SL_IRF_ADR_I => SCALE_SL_IRF_ADR_O,
258 SL_STB_O => SCALE_SL_STB_I,
259 SL_MUX_CODE => open);
261 vector_scale_1 : entity work.vector_scale
263 IRF_ADR_W => IRF_ADR_W,
266 PHASE_BASE => P_BASE,
269 VECTOR_W => LUT_DAT_W)
271 ACK_O => SCALE_SL_ACK_O,
274 STB_I => SCALE_SL_STB_I,
277 MUL_PROD => MUL_PROD,
278 IRF_ACK_I => IRF_ACK_I,
279 IRF_ADR_O => SCALE_SL_IRF_ADR_O,
280 IRF_DAT_I => IRF_DAT_I,
281 IRF_DAT_O => SCALE_IRF_DAT_O,
282 IRF_STB_O => SCALE_IRF_STB_O,
283 IRF_WE_O => SCALE_IRF_WE_O);
286 pwm_dump_sequencer : entity work.sequencer
288 IRF_ADR_W => IRF_ADR_W,
292 ACK_O => MCC_ACK (5),
295 STB_I => MCC_STB (5),
296 IRF_ADR_O => PWM_IRF_ADR_O,
297 SL_ACK_I => PWM_SL_ACK_O,
298 SL_IRF_ADR_I => PWM_SL_IRF_ADR_O,
299 SL_STB_O => PWM_SL_STB_I,
300 SL_MUX_CODE => PWM_SL_MUX_CODE);
302 pwm_dump_1 : entity work.pwm_dump
304 IRF_ADR_W => IRF_ADR_W,
309 ACK_O => PWM_SL_ACK_O,
312 STB_I => PWM_SL_STB_I,
313 PWM_DAT_O => PWM_DAT_O,
314 PWM_STB_O => PWM_STB_O,
315 IRF_ACK_I => IRF_ACK_I,
316 IRF_ADR_O => PWM_SL_IRF_ADR_O,
317 IRF_DAT_I => IRF_DAT_I,
318 IRF_STB_O => PWM_IRF_STB_O);
320 end architecture behavioral;