signal per_wen16 : std_logic;
signal per_en : std_logic;
signal per_addr : std_logic_vector (7 downto 0);
+ -- Interrupt
+ signal irq : std_logic_vector (13 downto 0);
+ signal irq_acc : std_logic_vector (13 downto 0);
------------------------------------------------------------------------------
-- MCU peripherals
-- Qcounter MCU interface
signal QCNT_DAT_O : std_logic_vector (15 downto 0);
signal QCNT_SEL : std_logic;
+ -- Motor feedback IRQ generator
+ signal MOTOR_IRQ : std_logic;
------------------------------------------------------------------------------
-- Dual-port shared memory
per_wen => per_wen,
per_en => per_en,
nmi => '0',
- irq => (others => '0'),
- irq_acc => open,
+ irq => irq,
+ irq_acc => irq_acc,
aclk_en => open,
smclk_en => open,
mclk => mclk,
GPIO_SEL <= '1' when per_addr(7 downto 2) = 16#0140#/2/4 else '0';
QCNT_SEL <= '1' when per_addr(7 downto 1) = 16#0148#/2/2 else '0';
+ -- Interrupt signals
+ ------------------------------------------------------------------------------
+ irq (13 downto 1) <= (others => '0');
+
+ motor_irq_ff : process (mclk, puc) is
+ begin
+ if rising_edge (mclk) then
+ if puc = '1' or irq_acc (0) = '1' then
+ irq (0) <= '0';
+ elsif MOTOR_IRQ = '1' then
+ irq (0) <= '1';
+ end if;
+ end if;
+ end process;
+
------------------------------------------------------------------------------
-- MCU peripherals
------------------------------------------------------------------------------
STB_I => per_en,
QCOUNT => QCNT);
+ -- Motor feedback IRQ generator
+ -- f_motor_irq approx. 1 kHz
+ mcc_irq_counter_1 : entity work.counter
+ generic map (
+ WIDTH => 5,
+ MAX => 22)
+ port map (
+ clk => mclk,
+ clk_en => PWM_OW,
+ reset => puc,
+ count => open,
+ event_ow => MOTOR_IRQ);
+
------------------------------------------------------------------------------
-- Dual-port shared memory