architecture behavioral of mcc is
- constant MCC_W : integer := 5;
- constant MUX_W : integer := 2;
+ constant MCC_W : integer := 6;
+ constant MUX_W : integer := 3;
+ constant P_BASE : integer := 16;
+ constant P_SIZE : integer := 4;
+
signal MCC_ACK : std_logic_vector (MCC_W-1 downto 0);
signal MCC_STB : std_logic_vector (MCC_W-1 downto 0);
signal VECTOR_IRF_STB_O : std_logic;
signal VECTOR_IRF_WE_O : std_logic;
+ signal PWM_IRF_ADR_O : std_logic_vector (IRF_ADR_W-1 downto 0);
+ signal PWM_IRF_DAT_O : std_logic_vector (15 downto 0);
+ signal PWM_IRF_STB_O : std_logic;
+ --signal PWM_DAT_O : std_logic_vector (LUT_DAT_W-1 downto 0);
+ signal PWM_STB_O : std_logic;
+ signal PWM_SL_ACK_O : std_logic;
+ signal PWM_SL_IRF_ADR_O : std_logic_vector (IRF_ADR_W-1 downto 0);
+ signal PWM_SL_STB_I : std_logic;
+ signal PWM_SL_MUX_CODE : std_logic_vector (1 downto 0);
+
+
type state_t is (ready, read_mask, do_mcc, done);
begin
IRF_ADR_O <= MASTER_IRF_ADR_O when MCC_MUX_EN = '0' else
- VECTOR_IRF_ADR_O when MCC_MUX_CODE = 1 else
+ VECTOR_IRF_ADR_O when MCC_MUX_CODE = 2 else
+ PWM_IRF_ADR_O when MCC_MUX_CODE = 5 else
(others => '-');
IRF_DAT_O <= MASTER_IRF_DAT_O when MCC_MUX_EN = '0' else
- VECTOR_IRF_DAT_O when MCC_MUX_CODE = 1 else
+ VECTOR_IRF_DAT_O when MCC_MUX_CODE = 2 else
+ PWM_IRF_DAT_O when MCC_MUX_CODE = 5 else
(others => '-');
IRF_STB_O <= MASTER_IRF_STB_O when MCC_MUX_EN = '0' else
- VECTOR_IRF_STB_O when MCC_MUX_CODE = 1 else
+ VECTOR_IRF_STB_O when MCC_MUX_CODE = 2 else
+ PWM_IRF_STB_O when MCC_MUX_CODE = 5 else
'0';
IRF_WE_O <= MASTER_IRF_WE_O when MCC_MUX_EN = '0' else
- VECTOR_IRF_WE_O when MCC_MUX_CODE = 1 else
+ VECTOR_IRF_WE_O when MCC_MUX_CODE = 2 else
'0';
+
+ PWM1_STB_O <= PWM_STB_O when PWM_SL_MUX_CODE = 0 else '0';
+ PWM2_STB_O <= PWM_STB_O when PWM_SL_MUX_CODE = 1 else '0';
+ PWM3_STB_O <= PWM_STB_O when PWM_SL_MUX_CODE = 2 else '0';
+
mcc_master_1 : entity work.mcc_master
generic map (
vector_gen_1 : entity work.vector_gen
generic map (
- A_BASE => 1,
- P_BASE => 2)
+ A_BASE => 16#04#,
+ P_BASE => 16#10#,
+ P1_OFF => 16#01#,
+ P2_OFF => 16#05#,
+ P3_OFF => 16#09#)
port map (
- ACK_O => MCC_ACK (1),
+ ACK_O => MCC_ACK (2),
CLK_I => CLK_I,
RST_I => RST_I,
- STB_I => MCC_STB (1),
+ STB_I => MCC_STB (2),
IRF_ACK_I => IRF_ACK_I,
IRF_ADR_O => VECTOR_IRF_ADR_O,
IRF_CYC_O => open,
LUT_DAT_I => LUT_DAT_I,
LUT_STB_O => LUT_STB_O);
+ pwm_dump_sequencer : entity work.sequencer
+ generic map (
+ IRF_ADR_W => IRF_ADR_W,
+ P_BASE => P_BASE,
+ P_SIZE => P_SIZE)
+ port map (
+ ACK_O => MCC_ACK (5),
+ CLK_I => CLK_I,
+ RST_I => RST_I,
+ STB_I => MCC_STB (5),
+ IRF_ADR_O => PWM_IRF_ADR_O,
+ SL_ACK_I => PWM_SL_ACK_O,
+ SL_IRF_ADR_I => PWM_SL_IRF_ADR_O,
+ SL_STB_O => PWM_SL_STB_I,
+ SL_MUX_CODE => PWM_SL_MUX_CODE);
+
+ pwm_dump_1 : entity work.pwm_dump
+ generic map (
+ IRF_ADR_W => IRF_ADR_W,
+ P_BASE => P_BASE,
+ PWM_OFF => 1,
+ PWM_W => LUT_DAT_W)
+ port map (
+ ACK_O => PWM_SL_ACK_O,
+ CLK_I => CLK_I,
+ RST_I => RST_I,
+ STB_I => PWM_SL_STB_I,
+ PWM_DAT_O => PWM_DAT_O,
+ PWM_STB_O => PWM_STB_O,
+ IRF_ACK_I => IRF_ACK_I,
+ IRF_ADR_O => PWM_SL_IRF_ADR_O,
+ IRF_DAT_I => IRF_DAT_I,
+ IRF_STB_O => PWM_IRF_STB_O);
+
end architecture behavioral;
architecture testbench of tb_mcc is
- constant period : time := 1 us;
+ constant period : time := 500 ns;
constant offset : time := 0 us;
constant LUT_DAT_W : integer := 10;
subtype word_t is std_logic_vector (15 downto 0);
- signal dbg_mem0 : word_t := "0000000000000010"; -- read only by mcc_master
- signal dbg_mem1 : word_t := (others => '0'); -- read only by vector_gen
- signal dbg_mem2 : word_t := (others => '0');
- signal dbg_mem3 : word_t := (others => '0');
- signal dbg_mem4 : word_t := (others => '0');
- signal dbg_ack : std_logic := '0';
+ signal dbg_mem00 : word_t := "0000000000100100"; -- MCC enable flags (RO)
+ signal dbg_mem04 : word_t := (others => '0'); -- Angle (RO)
+ signal dbg_mem11 : word_t := (others => '0'); -- Phase 1
+ signal dbg_mem15 : word_t := (others => '0'); -- Phase 2
+ signal dbg_mem19 : word_t := (others => '0'); -- Phase 3
+ signal dbg_ack : std_logic := '0';
--------------------------------------------------------------------------------
if rising_edge(CLK_I) and IRF_STB_O = '1' then
if IRF_WE_O = '0' then
case conv_integer(IRF_ADR_O) is
- when 0 => IRF_DAT_I <= dbg_mem0;
- when 1 => IRF_DAT_I <= dbg_mem1;
- when 2 => IRF_DAT_I <= dbg_mem2;
- when 3 => IRF_DAT_I <= dbg_mem3;
- when 4 => IRF_DAT_I <= dbg_mem4;
+ when 16#00# => IRF_DAT_I <= dbg_mem00;
+ when 16#04# => IRF_DAT_I <= dbg_mem04;
+ when 16#11# => IRF_DAT_I <= dbg_mem11;
+ when 16#15# => IRF_DAT_I <= dbg_mem15;
+ when 16#19# => IRF_DAT_I <= dbg_mem19;
when others => IRF_DAT_I <= (others => '0');
end case;
else
case conv_integer(IRF_ADR_O) is
- when 2 => dbg_mem2 <= IRF_DAT_O;
- when 3 => dbg_mem3 <= IRF_DAT_O;
- when 4 => dbg_mem4 <= IRF_DAT_O;
+ when 16#11# => dbg_mem11 <= IRF_DAT_O;
+ when 16#15# => dbg_mem15 <= IRF_DAT_O;
+ when 16#19# => dbg_mem19 <= IRF_DAT_O;
when others => null;
end case;
end if;
wait for 4*period;
for i in 0 to 1 loop
- dbg_mem1 <= conv_std_logic_vector(i, 16);
+ dbg_mem04 <= conv_std_logic_vector(i, 16);
STB_I <= '1';
wait until rising_edge(CLK_I) and ACK_O = '1';