]> rtime.felk.cvut.cz Git - fpga/pwm.git/blob - mcc.vhd
In MCC unit MCC_ACK(4) forced to '1'
[fpga/pwm.git] / mcc.vhd
1 library ieee;
2 use ieee.std_logic_1164.all;
3 use ieee.std_logic_arith.all;
4 use ieee.std_logic_unsigned.all;
5
6 --------------------------------------------------------------------------------
7
8 entity mcc is
9   generic (
10     LUT_ADR_W : integer := 10;
11     LUT_DAT_W : integer := 9);
12   port (
13     -- Primary slave intefrace
14     ACK_O      : out std_logic;
15     CLK_I      : in  std_logic;
16     RST_I      : in  std_logic;
17     STB_I      : in  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);
22     -- IRC input
23     IRC_DAT_I  : in  std_logic_vector (15 downto 0);
24     -- PWM output
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);
36 end entity mcc;
37
38 --------------------------------------------------------------------------------
39
40 architecture behavioral of mcc is
41
42   constant IRF_ADR_W : integer := 5;
43
44   constant MCC_W : integer := 6;
45   constant MUX_W : integer := 3;
46
47   constant P_BASE : integer := 16;
48   constant P_SIZE : integer := 4;
49   
50
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;
55
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);
59   
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;
64
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;
69
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;
77   
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);
87
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;
92
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;
97   
98
99   type state_t is (ready, read_mask, do_mcc, done);
100
101   signal state : state_t;
102
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;
108   
109 --------------------------------------------------------------------------------
110
111 begin
112
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
119                (others => '-');
120
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
127                (others => '-');
128
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
135                '0';
136
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
142               '0';
143
144
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';
148
149   MCC_ACK (4) <= '1';
150
151   
152   mcc_master_1 : entity work.mcc_master
153     generic map (
154       MCC_W     => MCC_W,
155       MUX_W     => MUX_W,
156       IRF_ADR_W => IRF_ADR_W)
157     port map (
158       ACK_O        => ACK_O,
159       CLK_I        => CLK_I,
160       RST_I        => RST_I,
161       STB_I        => STB_I,
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);
172
173   multiplier_1 : entity work.multiplier
174     port map (
175       A    => MUL_A,
176       B    => MUL_B,
177       prod => MUL_PROD);
178
179   irc_dump_1 : entity work.irc_dump
180     generic map (
181       IRF_ADR_W => IRF_ADR_W,
182       IRC_BASE  => 16#01#)
183     port map (
184       ACK_O     => MCC_ACK (0),
185       CLK_I     => CLK_I,
186       RST_I     => RST_I,
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);
194
195   irc_base_1 : entity work.irc_base
196     generic map (
197       IRF_ADR_W => IRF_ADR_W,
198       BASE      => 16#00#,
199       IRC_OFF   => 16#01#,
200       ABASE_OFF => 16#02#,
201       APER_OFF  => 16#03#,
202       A_OFF     => 16#04#)
203     port map (
204       ACK_O     => MCC_ACK (1),
205       CLK_I     => CLK_I,
206       RST_I     => RST_I,
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,
214       BAD_BASE  => open);
215   
216   vector_gen_1 : entity work.vector_gen
217     generic map (
218       LUT_DAT_W => 10,
219       LUT_ADR_W => 11,
220       LUT_P1_OFF => 0,
221       LUT_P2_OFF => 333,
222       LUT_P3_OFF => 667,
223       IRF_ADR_W => 5,
224       A_BASE => 16#04#,
225       P_BASE => 16#10#,
226       P1_OFF => 16#00#,
227       P2_OFF => 16#04#,
228       P3_OFF => 16#08#)
229     port map (
230       ACK_O     => MCC_ACK (2),
231       CLK_I     => CLK_I,
232       RST_I     => RST_I,
233       STB_I     => MCC_STB (2),
234       IRF_ACK_I => IRF_ACK_I,
235       IRF_ADR_O => VECTOR_IRF_ADR_O,
236       IRF_CYC_O => open,
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);
244
245   vector_scale_sequencer : entity work.sequencer
246     generic map (
247       IRF_ADR_W => IRF_ADR_W,
248       P_BASE    => P_BASE,
249       P_SIZE    => P_SIZE)
250     port map (
251       ACK_O        => MCC_ACK (3),
252       CLK_I        => CLK_I,
253       RST_I        => RST_I,
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);
260   
261   vector_scale_1 : entity work.vector_scale
262     generic map (
263       IRF_ADR_W  => IRF_ADR_W,
264       BASE       => 0,
265       SCALE_OFF  => 5,
266       PHASE_BASE => P_BASE,
267       VECTOR_OFF => 0,
268       SCALED_OFF => 1,
269       VECTOR_W   => LUT_DAT_W)
270     port map (
271       ACK_O     => SCALE_SL_ACK_O,
272       CLK_I     => CLK_I,
273       RST_I     => RST_I,
274       STB_I     => SCALE_SL_STB_I,
275       MUL_A     => MUL_A,
276       MUL_B     => MUL_B,
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);
284
285   
286   pwm_dump_sequencer : entity work.sequencer
287     generic map (
288       IRF_ADR_W => IRF_ADR_W,
289       P_BASE    => P_BASE,
290       P_SIZE    => P_SIZE)
291     port map (
292       ACK_O        => MCC_ACK (5),
293       CLK_I        => CLK_I,
294       RST_I        => RST_I,
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);
301
302   pwm_dump_1 : entity work.pwm_dump
303     generic map (
304       IRF_ADR_W => IRF_ADR_W,
305       P_BASE    => P_BASE,
306       PWM_OFF   => 1,
307       PWM_W     => LUT_DAT_W)
308     port map (
309       ACK_O     => PWM_SL_ACK_O,
310       CLK_I     => CLK_I,
311       RST_I     => RST_I,
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);
319   
320 end architecture behavioral;
321