]> rtime.felk.cvut.cz Git - fpga/pwm.git/blobdiff - mcc.vhd
Wave_table initialization data format modified.
[fpga/pwm.git] / mcc.vhd
diff --git a/mcc.vhd b/mcc.vhd
index 2e0ab555f2335ab83210143e9ed78d96c747365a..01ef9c4459616194a0c1f98d3a17101aaf76943f 100644 (file)
--- a/mcc.vhd
+++ b/mcc.vhd
@@ -8,8 +8,7 @@ use ieee.std_logic_unsigned.all;
 entity mcc is
   generic (
     LUT_ADR_W : integer := 10;
-    LUT_DAT_W : integer := 9;
-    IRF_ADR_W : integer := 5);
+    LUT_DAT_W : integer := 9);
   port (
     -- Primary slave intefrace
     ACK_O      : out std_logic;
@@ -29,7 +28,7 @@ entity mcc is
     PWM3_STB_O : out std_logic;
     -- Shared memory interface
     IRF_ACK_I  : in  std_logic;
-    IRF_ADR_O  : out std_logic_vector (IRF_ADR_W-1 downto 0);
+    IRF_ADR_O  : out std_logic_vector (4 downto 0);
     IRF_DAT_I  : in  std_logic_vector (15 downto 0);
     IRF_DAT_O  : out std_logic_vector (15 downto 0);
     IRF_STB_O  : out std_logic;
@@ -40,15 +39,24 @@ end entity mcc;
 
 architecture behavioral of mcc is
 
-  constant MCC_W : integer := 5;
-  constant MUX_W : integer := 2;
+  constant IRF_ADR_W : integer := 5;
 
+  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 MCC_MUX_CODE : std_logic_vector (MUX_W-1 downto 0);
   signal MCC_MUX_EN   : std_logic;
 
+  signal MUL_A    : std_logic_vector (15 downto 0);
+  signal MUL_B    : std_logic_vector (15 downto 0);
+  signal MUL_PROD : std_logic_vector (31 downto 0);
+  
   signal MASTER_IRF_ADR_O : std_logic_vector (IRF_ADR_W-1 downto 0);
   signal MASTER_IRF_DAT_O : std_logic_vector (15 downto 0);
   signal MASTER_IRF_STB_O : std_logic;
@@ -59,6 +67,38 @@ architecture behavioral of mcc is
   signal VECTOR_IRF_STB_O : std_logic;
   signal VECTOR_IRF_WE_O  : std_logic;
 
+  signal SCALE_IRF_ADR_O    : std_logic_vector (IRF_ADR_W-1 downto 0);
+  signal SCALE_IRF_DAT_O    : std_logic_vector (15 downto 0);
+  signal SCALE_IRF_STB_O    : std_logic;
+  signal SCALE_IRF_WE_O     : std_logic;
+  signal SCALE_SL_ACK_O     : std_logic;
+  signal SCALE_SL_IRF_ADR_O : std_logic_vector (IRF_ADR_W-1 downto 0);
+  signal SCALE_SL_STB_I     : std_logic;
+
+  signal PMIN_IRF_ADR_O : std_logic_vector (IRF_ADR_W-1 downto 0);
+  signal PMIN_IRF_DAT_O : std_logic_vector (15 downto 0);
+  signal PMIN_IRF_STB_O : std_logic;
+  signal PMIN_IRF_WE_O  : std_logic;
+  
+  signal PWM_IRF_ADR_O    : std_logic_vector (IRF_ADR_W-1 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);
+
+  signal IRC_IRF_ADR_O : std_logic_vector (IRF_ADR_W-1 downto 0);
+  signal IRC_IRF_DAT_O : std_logic_vector (15 downto 0);
+  signal IRC_IRF_STB_O : std_logic;
+  signal IRC_IRF_WE_O  : std_logic;
+
+  signal BASE_IRF_ADR_O : std_logic_vector (IRF_ADR_W-1 downto 0);
+  signal BASE_IRF_DAT_O : std_logic_vector (15 downto 0);
+  signal BASE_IRF_STB_O : std_logic;
+  signal BASE_IRF_WE_O  : std_logic;
+  
 
   type state_t is (ready, read_mask, do_mcc, done);
 
@@ -75,21 +115,45 @@ architecture behavioral of mcc is
 begin
 
   IRF_ADR_O <= MASTER_IRF_ADR_O when MCC_MUX_EN = '0' else
-               VECTOR_IRF_ADR_O when MCC_MUX_CODE = 1 else
-               (others => '-');
+               IRC_IRF_ADR_O    when MCC_MUX_CODE = 0 else
+               BASE_IRF_ADR_O   when MCC_MUX_CODE = 1 else
+               VECTOR_IRF_ADR_O when MCC_MUX_CODE = 2 else
+               SCALE_IRF_ADR_O  when MCC_MUX_CODE = 3 else
+               PMIN_IRF_ADR_O   when MCC_MUX_CODE = 4 else
+               PWM_IRF_ADR_O    when MCC_MUX_CODE = 5 else
+               (others => 'X');
 
   IRF_DAT_O <= MASTER_IRF_DAT_O when MCC_MUX_EN = '0' else
-               VECTOR_IRF_DAT_O when MCC_MUX_CODE = 1 else
-               (others => '-');
+               IRC_IRF_DAT_O    when MCC_MUX_CODE = 0 else
+               BASE_IRF_DAT_O   when MCC_MUX_CODE = 1 else
+               VECTOR_IRF_DAT_O when MCC_MUX_CODE = 2 else
+               SCALE_IRF_DAT_O  when MCC_MUX_CODE = 3 else
+               PMIN_IRF_DAT_O   when MCC_MUX_CODE = 4 else
+               (others => 'X');
 
   IRF_STB_O <= MASTER_IRF_STB_O when MCC_MUX_EN = '0' else
-               VECTOR_IRF_STB_O when MCC_MUX_CODE = 1 else
+               IRC_IRF_STB_O    when MCC_MUX_CODE = 0 else
+               BASE_IRF_STB_O   when MCC_MUX_CODE = 1 else
+               VECTOR_IRF_STB_O when MCC_MUX_CODE = 2 else
+               SCALE_IRF_STB_O  when MCC_MUX_CODE = 3 else
+               PMIN_IRF_STB_O   when MCC_MUX_CODE = 4 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
+              IRC_IRF_WE_O    when MCC_MUX_CODE = 0 else
+              BASE_IRF_WE_O   when MCC_MUX_CODE = 1 else
+              VECTOR_IRF_WE_O when MCC_MUX_CODE = 2 else
+              SCALE_IRF_WE_O  when MCC_MUX_CODE = 3 else
+              PMIN_IRF_WE_O   when MCC_MUX_CODE = 4 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 (
@@ -112,16 +176,68 @@ begin
       IRF_STB_O    => MASTER_IRF_STB_O,
       IRF_WE_O     => MASTER_IRF_WE_O);
 
-  vector_gen_1 : entity work.vector_gen
+  multiplier_1 : entity work.multiplier
+    port map (
+      A    => MUL_A,
+      B    => MUL_B,
+      prod => MUL_PROD);
+
+  irc_dump_1 : entity work.irc_dump
+    generic map (
+      IRF_ADR_W => IRF_ADR_W,
+      IRC_BASE  => 16#01#)
+    port map (
+      ACK_O     => MCC_ACK (0),
+      CLK_I     => CLK_I,
+      RST_I     => RST_I,
+      STB_I     => MCC_STB (0),
+      IRC_DAT_I => IRC_DAT_I,
+      IRF_ACK_I => IRF_ACK_I,
+      IRF_ADR_O => IRC_IRF_ADR_O,
+      IRF_DAT_O => IRC_IRF_DAT_O,
+      IRF_STB_O => IRC_IRF_STB_O,
+      IRF_WE_O  => IRC_IRF_WE_O);
+
+  irc_base_1 : entity work.irc_base
     generic map (
-      A_BASE => 1,
-      P_BASE => 2)
+      IRF_ADR_W => IRF_ADR_W,
+      BASE      => 16#00#,
+      IRC_OFF   => 16#01#,
+      ABASE_OFF => 16#02#,
+      APER_OFF  => 16#03#,
+      A_OFF     => 16#04#)
     port map (
       ACK_O     => MCC_ACK (1),
       CLK_I     => CLK_I,
       RST_I     => RST_I,
       STB_I     => MCC_STB (1),
       IRF_ACK_I => IRF_ACK_I,
+      IRF_ADR_O => BASE_IRF_ADR_O,
+      IRF_DAT_I => IRF_DAT_I,
+      IRF_DAT_O => BASE_IRF_DAT_O,
+      IRF_STB_O => BASE_IRF_STB_O,
+      IRF_WE_O  => BASE_IRF_WE_O,
+      BAD_BASE  => open);
+  
+  vector_gen_1 : entity work.vector_gen
+    generic map (
+      LUT_DAT_W => LUT_DAT_W,
+      LUT_ADR_W => LUT_ADR_W,
+      LUT_P1_OFF => 0,
+      LUT_P2_OFF => 333,
+      LUT_P3_OFF => 667,
+      IRF_ADR_W => 5,
+      A_BASE => 16#04#,
+      P_BASE => 16#10#,
+      P1_OFF => 16#00#,
+      P2_OFF => 16#04#,
+      P3_OFF => 16#08#)
+    port map (
+      ACK_O     => MCC_ACK (2),
+      CLK_I     => CLK_I,
+      RST_I     => RST_I,
+      STB_I     => MCC_STB (2),
+      IRF_ACK_I => IRF_ACK_I,
       IRF_ADR_O => VECTOR_IRF_ADR_O,
       IRF_CYC_O => open,
       IRF_DAT_I => IRF_DAT_I,
@@ -132,5 +248,102 @@ begin
       LUT_DAT_I => LUT_DAT_I,
       LUT_STB_O => LUT_STB_O);
 
+  vector_scale_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 (3),
+      CLK_I        => CLK_I,
+      RST_I        => RST_I,
+      STB_I        => MCC_STB (3),
+      IRF_ADR_O    => SCALE_IRF_ADR_O,
+      SL_ACK_I     => SCALE_SL_ACK_O,
+      SL_IRF_ADR_I => SCALE_SL_IRF_ADR_O,
+      SL_STB_O     => SCALE_SL_STB_I,
+      SL_MUX_CODE  => open);
+  
+  vector_scale_1 : entity work.vector_scale
+    generic map (
+      IRF_ADR_W  => IRF_ADR_W,
+      BASE       => 0,
+      SCALE_OFF  => 5,
+      PHASE_BASE => P_BASE,
+      VECTOR_OFF => 0,
+      SCALED_OFF => 1,
+      VECTOR_W   => LUT_DAT_W)
+    port map (
+      ACK_O     => SCALE_SL_ACK_O,
+      CLK_I     => CLK_I,
+      RST_I     => RST_I,
+      STB_I     => SCALE_SL_STB_I,
+      MUL_A     => MUL_A,
+      MUL_B     => MUL_B,
+      MUL_PROD  => MUL_PROD,
+      IRF_ACK_I => IRF_ACK_I,
+      IRF_ADR_O => SCALE_SL_IRF_ADR_O,
+      IRF_DAT_I => IRF_DAT_I,
+      IRF_DAT_O => SCALE_IRF_DAT_O,
+      IRF_STB_O => SCALE_IRF_STB_O,
+      IRF_WE_O  => SCALE_IRF_WE_O);
+
+  pwm_min_1 : entity work.pwm_min
+    generic map (
+      IRF_ADR_W  => IRF_ADR_W,
+      PWM_W      => LUT_DAT_W,
+      BASE       => 0,
+      PWMMIN_OFF => 6,
+      P_BASE     => P_BASE,
+      P_SIZE     => P_SIZE,
+      PWM_OFF    => 1)
+    port map (
+      ACK_O     => MCC_ACK (4),
+      CLK_I     => CLK_I,
+      RST_I     => RST_I,
+      STB_I     => MCC_STB (4),
+      IRF_ACK_I => IRF_ACK_I,
+      IRF_ADR_O => PMIN_IRF_ADR_O,
+      IRF_DAT_I => IRF_DAT_I,
+      IRF_DAT_O => PMIN_IRF_DAT_O,
+      IRF_STB_O => PMIN_IRF_STB_O,
+      IRF_WE_O  => PMIN_IRF_WE_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_min_dump_1 : entity work.pwm_min_dump
+    generic map (
+      IRF_ADR_W  => IRF_ADR_W,
+      BASE       => 0,
+      PWMMIN_OFF => 6,
+      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;