]> rtime.felk.cvut.cz Git - fpga/pwm.git/blob - mcc.vhd
2e0ab555f2335ab83210143e9ed78d96c747365a
[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 := 5;
44   constant MUX_W : integer := 2;
45
46
47   signal MCC_ACK      : std_logic_vector (MCC_W-1 downto 0);
48   signal MCC_STB      : std_logic_vector (MCC_W-1 downto 0);
49   signal MCC_MUX_CODE : std_logic_vector (MUX_W-1 downto 0);
50   signal MCC_MUX_EN   : std_logic;
51
52   signal MASTER_IRF_ADR_O : std_logic_vector (IRF_ADR_W-1 downto 0);
53   signal MASTER_IRF_DAT_O : std_logic_vector (15 downto 0);
54   signal MASTER_IRF_STB_O : std_logic;
55   signal MASTER_IRF_WE_O  : std_logic;
56
57   signal VECTOR_IRF_ADR_O : std_logic_vector (IRF_ADR_W-1 downto 0);
58   signal VECTOR_IRF_DAT_O : std_logic_vector (15 downto 0);
59   signal VECTOR_IRF_STB_O : std_logic;
60   signal VECTOR_IRF_WE_O  : std_logic;
61
62
63   type state_t is (ready, read_mask, do_mcc, done);
64
65   signal state : state_t;
66
67   signal mcc_mask       : std_logic_vector (MCC_W-1 downto 0);
68   signal mcc_ack_inner  : std_logic_vector (MCC_W   downto 0);
69   signal mcc_stb_inner  : std_logic_vector (MCC_W-1 downto 0);
70   signal mux_code_inner : std_logic_vector (MUX_W-1 downto 0);
71   signal mcc_exec       : std_logic;
72   
73 --------------------------------------------------------------------------------
74
75 begin
76
77   IRF_ADR_O <= MASTER_IRF_ADR_O when MCC_MUX_EN = '0' else
78                VECTOR_IRF_ADR_O when MCC_MUX_CODE = 1 else
79                (others => '-');
80
81   IRF_DAT_O <= MASTER_IRF_DAT_O when MCC_MUX_EN = '0' else
82                VECTOR_IRF_DAT_O when MCC_MUX_CODE = 1 else
83                (others => '-');
84
85   IRF_STB_O <= MASTER_IRF_STB_O when MCC_MUX_EN = '0' else
86                VECTOR_IRF_STB_O when MCC_MUX_CODE = 1 else
87                '0';
88
89   IRF_WE_O <= MASTER_IRF_WE_O when MCC_MUX_EN = '0' else
90               VECTOR_IRF_WE_O when MCC_MUX_CODE = 1 else
91               '0';
92
93   
94   mcc_master_1 : entity work.mcc_master
95     generic map (
96       MCC_W     => MCC_W,
97       MUX_W     => MUX_W,
98       IRF_ADR_W => IRF_ADR_W)
99     port map (
100       ACK_O        => ACK_O,
101       CLK_I        => CLK_I,
102       RST_I        => RST_I,
103       STB_I        => STB_I,
104       MCC_STB_O    => MCC_STB,
105       MCC_ACK_I    => MCC_ACK,
106       MCC_MUX_CODE => MCC_MUX_CODE,
107       MCC_MUX_EN   => MCC_MUX_EN,
108       IRF_ACK_I    => IRF_ACK_I,
109       IRF_ADR_O    => MASTER_IRF_ADR_O,
110       IRF_DAT_I    => IRF_DAT_I,
111       IRF_DAT_O    => MASTER_IRF_DAT_O,
112       IRF_STB_O    => MASTER_IRF_STB_O,
113       IRF_WE_O     => MASTER_IRF_WE_O);
114
115   vector_gen_1 : entity work.vector_gen
116     generic map (
117       A_BASE => 1,
118       P_BASE => 2)
119     port map (
120       ACK_O     => MCC_ACK (1),
121       CLK_I     => CLK_I,
122       RST_I     => RST_I,
123       STB_I     => MCC_STB (1),
124       IRF_ACK_I => IRF_ACK_I,
125       IRF_ADR_O => VECTOR_IRF_ADR_O,
126       IRF_CYC_O => open,
127       IRF_DAT_I => IRF_DAT_I,
128       IRF_DAT_O => VECTOR_IRF_DAT_O,
129       IRF_STB_O => VECTOR_IRF_STB_O,
130       IRF_WE_O  => VECTOR_IRF_WE_O,
131       LUT_ADR_O => LUT_ADR_O,
132       LUT_DAT_I => LUT_DAT_I,
133       LUT_STB_O => LUT_STB_O);
134
135 end architecture behavioral;
136