]> rtime.felk.cvut.cz Git - fpga/pwm.git/blob - mcc.vhd
Unused signal removed and minor change.
[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 (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);
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_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);
86
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;
91
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;
96   
97
98   type state_t is (ready, read_mask, do_mcc, done);
99
100   signal state : state_t;
101
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;
107   
108 --------------------------------------------------------------------------------
109
110 begin
111
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
118                (others => 'X');
119
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
125                (others => 'X');
126
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
133                '0';
134
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
140               '0';
141
142
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';
146
147   MCC_ACK (4) <= '1';
148
149   
150   mcc_master_1 : entity work.mcc_master
151     generic map (
152       MCC_W     => MCC_W,
153       MUX_W     => MUX_W,
154       IRF_ADR_W => IRF_ADR_W)
155     port map (
156       ACK_O        => ACK_O,
157       CLK_I        => CLK_I,
158       RST_I        => RST_I,
159       STB_I        => STB_I,
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);
170
171   multiplier_1 : entity work.multiplier
172     port map (
173       A    => MUL_A,
174       B    => MUL_B,
175       prod => MUL_PROD);
176
177   irc_dump_1 : entity work.irc_dump
178     generic map (
179       IRF_ADR_W => IRF_ADR_W,
180       IRC_BASE  => 16#01#)
181     port map (
182       ACK_O     => MCC_ACK (0),
183       CLK_I     => CLK_I,
184       RST_I     => RST_I,
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);
192
193   irc_base_1 : entity work.irc_base
194     generic map (
195       IRF_ADR_W => IRF_ADR_W,
196       BASE      => 16#00#,
197       IRC_OFF   => 16#01#,
198       ABASE_OFF => 16#02#,
199       APER_OFF  => 16#03#,
200       A_OFF     => 16#04#)
201     port map (
202       ACK_O     => MCC_ACK (1),
203       CLK_I     => CLK_I,
204       RST_I     => RST_I,
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,
212       BAD_BASE  => open);
213   
214   vector_gen_1 : entity work.vector_gen
215     generic map (
216       LUT_DAT_W => 10,
217       LUT_ADR_W => 11,
218       LUT_P1_OFF => 0,
219       LUT_P2_OFF => 333,
220       LUT_P3_OFF => 667,
221       IRF_ADR_W => 5,
222       A_BASE => 16#04#,
223       P_BASE => 16#10#,
224       P1_OFF => 16#00#,
225       P2_OFF => 16#04#,
226       P3_OFF => 16#08#)
227     port map (
228       ACK_O     => MCC_ACK (2),
229       CLK_I     => CLK_I,
230       RST_I     => RST_I,
231       STB_I     => MCC_STB (2),
232       IRF_ACK_I => IRF_ACK_I,
233       IRF_ADR_O => VECTOR_IRF_ADR_O,
234       IRF_CYC_O => open,
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);
242
243   vector_scale_sequencer : entity work.sequencer
244     generic map (
245       IRF_ADR_W => IRF_ADR_W,
246       P_BASE    => P_BASE,
247       P_SIZE    => P_SIZE)
248     port map (
249       ACK_O        => MCC_ACK (3),
250       CLK_I        => CLK_I,
251       RST_I        => RST_I,
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);
258   
259   vector_scale_1 : entity work.vector_scale
260     generic map (
261       IRF_ADR_W  => IRF_ADR_W,
262       BASE       => 0,
263       SCALE_OFF  => 5,
264       PHASE_BASE => P_BASE,
265       VECTOR_OFF => 0,
266       SCALED_OFF => 1,
267       VECTOR_W   => LUT_DAT_W)
268     port map (
269       ACK_O     => SCALE_SL_ACK_O,
270       CLK_I     => CLK_I,
271       RST_I     => RST_I,
272       STB_I     => SCALE_SL_STB_I,
273       MUL_A     => MUL_A,
274       MUL_B     => MUL_B,
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);
282
283   
284   pwm_dump_sequencer : entity work.sequencer
285     generic map (
286       IRF_ADR_W => IRF_ADR_W,
287       P_BASE    => P_BASE,
288       P_SIZE    => P_SIZE)
289     port map (
290       ACK_O        => MCC_ACK (5),
291       CLK_I        => CLK_I,
292       RST_I        => RST_I,
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);
299
300   pwm_dump_1 : entity work.pwm_dump
301     generic map (
302       IRF_ADR_W => IRF_ADR_W,
303       P_BASE    => P_BASE,
304       PWM_OFF   => 1,
305       PWM_W     => LUT_DAT_W)
306     port map (
307       ACK_O     => PWM_SL_ACK_O,
308       CLK_I     => CLK_I,
309       RST_I     => RST_I,
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);
317   
318 end architecture behavioral;
319