]> rtime.felk.cvut.cz Git - fpga/pwm.git/blob - mcc.vhd
Modified MCC to use wave table with length of 2048 points.
[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     IRF_ADR_W : integer := 5);
13   port (
14     -- Primary slave intefrace
15     ACK_O      : out std_logic;
16     CLK_I      : in  std_logic;
17     RST_I      : in  std_logic;
18     STB_I      : in  std_logic;
19     -- Wave table interface
20     LUT_STB_O  : out std_logic;
21     LUT_ADR_O  : out std_logic_vector (LUT_ADR_W-1 downto 0);
22     LUT_DAT_I  : in  std_logic_vector (LUT_DAT_W-1 downto 0);
23     -- IRC input
24     IRC_DAT_I  : in  std_logic_vector (15 downto 0);
25     -- PWM output
26     PWM_DAT_O  : out std_logic_vector (LUT_DAT_W-1 downto 0);
27     PWM1_STB_O : out std_logic;
28     PWM2_STB_O : out std_logic;
29     PWM3_STB_O : out std_logic;
30     -- Shared memory interface
31     IRF_ACK_I  : in  std_logic;
32     IRF_ADR_O  : out std_logic_vector (IRF_ADR_W-1 downto 0);
33     IRF_DAT_I  : in  std_logic_vector (15 downto 0);
34     IRF_DAT_O  : out std_logic_vector (15 downto 0);
35     IRF_STB_O  : out std_logic;
36     IRF_WE_O   : out std_logic);
37 end entity mcc;
38
39 --------------------------------------------------------------------------------
40
41 architecture behavioral of mcc is
42
43   constant MCC_W : integer := 6;
44   constant MUX_W : integer := 3;
45
46   constant P_BASE : integer := 16;
47   constant P_SIZE : integer := 4;
48   
49
50   signal MCC_ACK      : std_logic_vector (MCC_W-1 downto 0);
51   signal MCC_STB      : std_logic_vector (MCC_W-1 downto 0);
52   signal MCC_MUX_CODE : std_logic_vector (MUX_W-1 downto 0);
53   signal MCC_MUX_EN   : std_logic;
54
55   signal MASTER_IRF_ADR_O : std_logic_vector (IRF_ADR_W-1 downto 0);
56   signal MASTER_IRF_DAT_O : std_logic_vector (15 downto 0);
57   signal MASTER_IRF_STB_O : std_logic;
58   signal MASTER_IRF_WE_O  : std_logic;
59
60   signal VECTOR_IRF_ADR_O : std_logic_vector (IRF_ADR_W-1 downto 0);
61   signal VECTOR_IRF_DAT_O : std_logic_vector (15 downto 0);
62   signal VECTOR_IRF_STB_O : std_logic;
63   signal VECTOR_IRF_WE_O  : std_logic;
64
65   signal PWM_IRF_ADR_O    : std_logic_vector (IRF_ADR_W-1 downto 0);
66   signal PWM_IRF_DAT_O    : std_logic_vector (15 downto 0);
67   signal PWM_IRF_STB_O    : std_logic;
68   --signal PWM_DAT_O        : std_logic_vector (LUT_DAT_W-1 downto 0);
69   signal PWM_STB_O        : std_logic;
70   signal PWM_SL_ACK_O     : std_logic;
71   signal PWM_SL_IRF_ADR_O : std_logic_vector (IRF_ADR_W-1 downto 0);
72   signal PWM_SL_STB_I     : std_logic;
73   signal PWM_SL_MUX_CODE  : std_logic_vector (1 downto 0);
74
75   signal IRC_IRF_ADR_O : std_logic_vector (IRF_ADR_W-1 downto 0);
76   signal IRC_IRF_DAT_O : std_logic_vector (15 downto 0);
77   signal IRC_IRF_STB_O : std_logic;
78   signal IRC_IRF_WE_O  : std_logic;
79
80   signal BASE_IRF_ADR_O : std_logic_vector (IRF_ADR_W-1 downto 0);
81   signal BASE_IRF_DAT_O : std_logic_vector (15 downto 0);
82   signal BASE_IRF_STB_O : std_logic;
83   signal BASE_IRF_WE_O  : std_logic;
84   
85
86   type state_t is (ready, read_mask, do_mcc, done);
87
88   signal state : state_t;
89
90   signal mcc_mask       : std_logic_vector (MCC_W-1 downto 0);
91   signal mcc_ack_inner  : std_logic_vector (MCC_W   downto 0);
92   signal mcc_stb_inner  : std_logic_vector (MCC_W-1 downto 0);
93   signal mux_code_inner : std_logic_vector (MUX_W-1 downto 0);
94   signal mcc_exec       : std_logic;
95   
96 --------------------------------------------------------------------------------
97
98 begin
99
100   IRF_ADR_O <= MASTER_IRF_ADR_O when MCC_MUX_EN = '0' else
101                IRC_IRF_ADR_O    when MCC_MUX_CODE = 0 else
102                BASE_IRF_ADR_O   when MCC_MUX_CODE = 1 else
103                VECTOR_IRF_ADR_O when MCC_MUX_CODE = 2 else
104                PWM_IRF_ADR_O    when MCC_MUX_CODE = 5 else
105                (others => '-');
106
107   IRF_DAT_O <= MASTER_IRF_DAT_O when MCC_MUX_EN = '0' else
108                IRC_IRF_DAT_O    when MCC_MUX_CODE = 0 else
109                BASE_IRF_DAT_O   when MCC_MUX_CODE = 1 else
110                VECTOR_IRF_DAT_O when MCC_MUX_CODE = 2 else
111                PWM_IRF_DAT_O    when MCC_MUX_CODE = 5 else
112                (others => '-');
113
114   IRF_STB_O <= MASTER_IRF_STB_O when MCC_MUX_EN = '0' else
115                IRC_IRF_STB_O    when MCC_MUX_CODE = 0 else
116                BASE_IRF_STB_O   when MCC_MUX_CODE = 1 else
117                VECTOR_IRF_STB_O when MCC_MUX_CODE = 2 else
118                PWM_IRF_STB_O    when MCC_MUX_CODE = 5 else
119                '0';
120
121   IRF_WE_O <= MASTER_IRF_WE_O when MCC_MUX_EN = '0' else
122               IRC_IRF_WE_O    when MCC_MUX_CODE = 0 else
123               BASE_IRF_WE_O   when MCC_MUX_CODE = 1 else
124               VECTOR_IRF_WE_O when MCC_MUX_CODE = 2 else
125               '0';
126
127
128   PWM1_STB_O <= PWM_STB_O when PWM_SL_MUX_CODE = 0 else '0';
129   PWM2_STB_O <= PWM_STB_O when PWM_SL_MUX_CODE = 1 else '0';
130   PWM3_STB_O <= PWM_STB_O when PWM_SL_MUX_CODE = 2 else '0';
131
132   
133   mcc_master_1 : entity work.mcc_master
134     generic map (
135       MCC_W     => MCC_W,
136       MUX_W     => MUX_W,
137       IRF_ADR_W => IRF_ADR_W)
138     port map (
139       ACK_O        => ACK_O,
140       CLK_I        => CLK_I,
141       RST_I        => RST_I,
142       STB_I        => STB_I,
143       MCC_STB_O    => MCC_STB,
144       MCC_ACK_I    => MCC_ACK,
145       MCC_MUX_CODE => MCC_MUX_CODE,
146       MCC_MUX_EN   => MCC_MUX_EN,
147       IRF_ACK_I    => IRF_ACK_I,
148       IRF_ADR_O    => MASTER_IRF_ADR_O,
149       IRF_DAT_I    => IRF_DAT_I,
150       IRF_DAT_O    => MASTER_IRF_DAT_O,
151       IRF_STB_O    => MASTER_IRF_STB_O,
152       IRF_WE_O     => MASTER_IRF_WE_O);
153
154   irc_dump_1 : entity work.irc_dump
155     generic map (
156       IRF_ADR_W => IRF_ADR_W,
157       IRC_BASE  => 16#01#)
158     port map (
159       ACK_O     => MCC_ACK (0),
160       CLK_I     => CLK_I,
161       RST_I     => RST_I,
162       STB_I     => MCC_STB (0),
163       IRC_DAT_I => IRC_DAT_I,
164       IRF_ACK_I => IRF_ACK_I,
165       IRF_ADR_O => IRC_IRF_ADR_O,
166       IRF_DAT_O => IRC_IRF_DAT_O,
167       IRF_STB_O => IRC_IRF_STB_O,
168       IRF_WE_O  => IRC_IRF_WE_O);
169
170   irc_base_1 : entity work.irc_base
171     generic map (
172       IRF_ADR_W => IRF_ADR_W,
173       BASE      => 16#00#,
174       IRC_OFF   => 16#01#,
175       ABASE_OFF => 16#02#,
176       APER_OFF  => 16#03#,
177       A_OFF     => 16#04#)
178     port map (
179       ACK_O     => MCC_ACK (1),
180       CLK_I     => CLK_I,
181       RST_I     => RST_I,
182       STB_I     => MCC_STB (1),
183       IRF_ACK_I => IRF_ACK_I,
184       IRF_ADR_O => BASE_IRF_ADR_O,
185       IRF_DAT_I => IRF_DAT_I,
186       IRF_DAT_O => BASE_IRF_DAT_O,
187       IRF_STB_O => BASE_IRF_STB_O,
188       IRF_WE_O  => BASE_IRF_WE_O,
189       BAD_BASE  => open);
190   
191   vector_gen_1 : entity work.vector_gen
192     generic map (
193       LUT_DAT_W => 10,
194       LUT_ADR_W => 11,
195       LUT_P1_OFF => 0,
196       LUT_P2_OFF => 333,
197       LUT_P3_OFF => 667,
198       IRF_ADR_W => 5,
199       A_BASE => 16#04#,
200       P_BASE => 16#10#,
201       P1_OFF => 16#01#,
202       P2_OFF => 16#05#,
203       P3_OFF => 16#09#)
204     port map (
205       ACK_O     => MCC_ACK (2),
206       CLK_I     => CLK_I,
207       RST_I     => RST_I,
208       STB_I     => MCC_STB (2),
209       IRF_ACK_I => IRF_ACK_I,
210       IRF_ADR_O => VECTOR_IRF_ADR_O,
211       IRF_CYC_O => open,
212       IRF_DAT_I => IRF_DAT_I,
213       IRF_DAT_O => VECTOR_IRF_DAT_O,
214       IRF_STB_O => VECTOR_IRF_STB_O,
215       IRF_WE_O  => VECTOR_IRF_WE_O,
216       LUT_ADR_O => LUT_ADR_O,
217       LUT_DAT_I => LUT_DAT_I,
218       LUT_STB_O => LUT_STB_O);
219
220   pwm_dump_sequencer : entity work.sequencer
221     generic map (
222       IRF_ADR_W => IRF_ADR_W,
223       P_BASE    => P_BASE,
224       P_SIZE    => P_SIZE)
225     port map (
226       ACK_O        => MCC_ACK (5),
227       CLK_I        => CLK_I,
228       RST_I        => RST_I,
229       STB_I        => MCC_STB (5),
230       IRF_ADR_O    => PWM_IRF_ADR_O,
231       SL_ACK_I     => PWM_SL_ACK_O,
232       SL_IRF_ADR_I => PWM_SL_IRF_ADR_O,
233       SL_STB_O     => PWM_SL_STB_I,
234       SL_MUX_CODE  => PWM_SL_MUX_CODE);
235
236   pwm_dump_1 : entity work.pwm_dump
237     generic map (
238       IRF_ADR_W => IRF_ADR_W,
239       P_BASE    => P_BASE,
240       PWM_OFF   => 1,
241       PWM_W     => LUT_DAT_W)
242     port map (
243       ACK_O     => PWM_SL_ACK_O,
244       CLK_I     => CLK_I,
245       RST_I     => RST_I,
246       STB_I     => PWM_SL_STB_I,
247       PWM_DAT_O => PWM_DAT_O,
248       PWM_STB_O => PWM_STB_O,
249       IRF_ACK_I => IRF_ACK_I,
250       IRF_ADR_O => PWM_SL_IRF_ADR_O,
251       IRF_DAT_I => IRF_DAT_I,
252       IRF_STB_O => PWM_IRF_STB_O);
253   
254 end architecture behavioral;
255