]> rtime.felk.cvut.cz Git - fpga/virtex2/msp_motion.git/commitdiff
Motor feedback IRQ generator
authorVladimir Burian <buriavl2@fel.cvut.cz>
Sun, 17 Apr 2011 13:14:35 +0000 (15:14 +0200)
committerVladimir Burian <buriavl2@fel.cvut.cz>
Sun, 17 Apr 2011 13:14:35 +0000 (15:14 +0200)
msp_motion.vhd

index 4edb45743860a127dcb38be13813e95b2c567be4..1542c0dec0bd39e8baddb43775fe08dabddfa40c 100644 (file)
@@ -59,6 +59,9 @@ architecture rtl of msp_motion is
   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
@@ -71,6 +74,8 @@ architecture rtl of msp_motion is
   -- 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
@@ -146,8 +151,8 @@ begin
       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,
@@ -177,7 +182,22 @@ begin
   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
   ------------------------------------------------------------------------------
@@ -212,6 +232,19 @@ begin
       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