]> rtime.felk.cvut.cz Git - fpga/lx-cpu1/lx-rocon.git/blobdiff - hw/bus_irc.vhd
RoCoN: new mode for testlxpwrrx to capture position, PWM and current for controller...
[fpga/lx-cpu1/lx-rocon.git] / hw / bus_irc.vhd
index 8221655ffdf36e04e58f485de85fa641aaac5bb7..828d7dba27b587c0d24ab658617777e739103ccd 100644 (file)
@@ -2,7 +2,6 @@ library ieee;
 use ieee.std_logic_1164.all;
 use ieee.std_logic_unsigned.all;
 use ieee.numeric_std.all;
-use work.mbl_pkg.all;
 use work.lx_rocon_pkg.all;
 
 -- IRC bus interconnect
@@ -13,7 +12,7 @@ entity bus_irc is
                reset_i      : in std_logic;
                -- Data bus
                address_i    : in std_logic_vector(4 downto 0);
-               next_ce_i    : in std_logic;
+               ce_i         : in std_logic;
                data_i       : in std_logic_vector(31 downto 0);
                data_o       : out std_logic_vector(31 downto 0);
                --
@@ -25,10 +24,14 @@ end bus_irc;
 
 architecture Behavioral of bus_irc is
 
-       signal irc_o_s              : IRC_OUTPUT_Array_Type(7 downto 0);
-       signal reset_index_event_s  : std_logic_vector(7 downto 0);
-       signal reset_index_event2_s : std_logic_vector(7 downto 0);
-       signal reset_ab_error_s     : std_logic_vector(7 downto 0);
+       constant num_irc_c          : positive := 8;
+
+       signal irc_o_s              : IRC_OUTPUT_Array_Type(num_irc_c-1 downto 0);
+       signal irc_count_s          : IRC_COUNT_OUTPUT_Array_Type((num_irc_c-1) downto 0);
+
+       signal reset_index_event_s  : std_logic_vector(num_irc_c-1 downto 0);
+       signal reset_index_event2_s : std_logic_vector(num_irc_c-1 downto 0);
+       signal reset_ab_error_s     : std_logic_vector(num_irc_c-1 downto 0);
        signal state_o_s            : std_logic_vector(3 downto 0);
        signal state_o_r            : std_logic_vector(3 downto 0);
        --
@@ -44,124 +47,37 @@ architecture Behavioral of bus_irc is
        signal reset_reg_wr_s       : std_logic;
        --
        signal reset_s              : std_logic;
-       signal ce_s                 : std_logic;
+       signal ce_r                 : std_logic;
 
 begin
 
-irc0 : irc_reader
-       port map
-       (
-               clk_i                => clk_i,
-               reset_i              => reset_s,
-               irc_i                => irc_i(0),
-               reset_index_event_i  => reset_index_event_s(0),
-               reset_index_event2_i => reset_index_event2_s(0),
-               reset_ab_error_i     => reset_ab_error_s(0),
-               irc_o                => irc_o_s(0)
-       );
-
-irc1 : irc_reader
-       port map
-       (
-               clk_i                => clk_i,
-               reset_i              => reset_s,
-               irc_i                => irc_i(1),
-               reset_index_event_i  => reset_index_event_s(1),
-               reset_index_event2_i => reset_index_event2_s(1),
-               reset_ab_error_i     => reset_ab_error_s(1),
-               irc_o                => irc_o_s(1)
-       );
-
-irc2 : irc_reader
-       port map
-       (
-               clk_i                => clk_i,
-               reset_i              => reset_s,
-               irc_i                => irc_i(2),
-               reset_index_event_i  => reset_index_event_s(2),
-               reset_index_event2_i => reset_index_event2_s(2),
-               reset_ab_error_i     => reset_ab_error_s(2),
-               irc_o                => irc_o_s(2)
-       );
-
-irc3 : irc_reader
-       port map
-       (
-               clk_i                => clk_i,
-               reset_i              => reset_s,
-               irc_i                => irc_i(3),
-               reset_index_event_i  => reset_index_event_s(3),
-               reset_index_event2_i => reset_index_event2_s(3),
-               reset_ab_error_i     => reset_ab_error_s(3),
-               irc_o                => irc_o_s(3)
-       );
-
-irc4 : irc_reader
-       port map
-       (
-               clk_i                => clk_i,
-               reset_i              => reset_s,
-               irc_i                => irc_i(4),
-               reset_index_event_i  => reset_index_event_s(4),
-               reset_index_event2_i => reset_index_event2_s(4),
-               reset_ab_error_i     => reset_ab_error_s(4),
-               irc_o                => irc_o_s(4)
-       );
-
-irc5 : irc_reader
-       port map
-       (
-               clk_i                => clk_i,
-               reset_i              => reset_s,
-               irc_i                => irc_i(5),
-               reset_index_event_i  => reset_index_event_s(5),
-               reset_index_event2_i => reset_index_event2_s(5),
-               reset_ab_error_i     => reset_ab_error_s(5),
-               irc_o                => irc_o_s(5)
-       );
-
-irc6 : irc_reader
-       port map
-       (
-               clk_i                => clk_i,
-               reset_i              => reset_s,
-               irc_i                => irc_i(6),
-               reset_index_event_i  => reset_index_event_s(6),
-               reset_index_event2_i => reset_index_event2_s(6),
-               reset_ab_error_i     => reset_ab_error_s(6),
-               irc_o                => irc_o_s(6)
-       );
-
-irc7 : irc_reader
-       port map
-       (
-               clk_i                => clk_i,
-               reset_i              => reset_s,
-               irc_i                => irc_i(7),
-               reset_index_event_i  => reset_index_event_s(7),
-               reset_index_event2_i => reset_index_event2_s(7),
-               reset_ab_error_i     => reset_ab_error_s(7),
-               irc_o                => irc_o_s(7)
-       );
+irc_generate: for i in 0 to num_irc_c-1 generate
+       irc : irc_reader
+               port map
+               (
+                       clk_i                => clk_i,
+                       reset_i              => reset_s,
+                       irc_i                => irc_i(i),
+                       reset_index_event_i  => reset_index_event_s(i),
+                       reset_index_event2_i => reset_index_event2_s(i),
+                       reset_ab_error_i     => reset_ab_error_s(i),
+                       irc_o                => irc_o_s(i)
+               );
+
+               irc_count_s(i) <= irc_o_s(i).count;
+       end generate;
 
 irc_proc : irc_proc_main
        generic map
        (
-               num_irc_g            => 8
+               num_irc_g            => num_irc_c
        )
        port map
        (
                clk_i                => clk_i,
                reset_i              => reset_s,
                -- IRC
-               irc_i(0)             => irc_o_s(0).count,
-               irc_i(1)             => irc_o_s(1).count,
-               irc_i(2)             => irc_o_s(2).count,
-               irc_i(3)             => irc_o_s(3).count,
-               irc_i(4)             => irc_o_s(4).count,
-               irc_i(5)             => irc_o_s(5).count,
-               irc_i(6)             => irc_o_s(6).count,
-               irc_i(7)             => irc_o_s(7).count,
+               irc_i                => irc_count_s,
                irc_index_reset_o    => reset_index_event_s,
                -- BRAM
                mem_clk_i            => clk_i,
@@ -175,7 +91,7 @@ irc_proc : irc_proc_main
        reset_s <= reset_reg_r or reset_i;
 
 wire_in:
-       process(next_ce_i, ce_s, reset_reg_r, bls_i, address_i, irc_data_s, data_i, irc_o_s)
+       process(ce_i, ce_r, reset_reg_r, bls_i, address_i, irc_data_s, data_i, irc_o_s)
        begin
 
                -- init values
@@ -190,7 +106,7 @@ wire_in:
                reset_reg_wr_s       <= '0';
 
                -- Incoming bus request
-               if next_ce_i = '1' then
+               if ce_i = '1' then
                        -- Mapping:
                        -- 0 & axis & irc / index - (all read from bram) (R/W)
                        -- 1 & axis & 0           - status register (R/W)
@@ -202,7 +118,7 @@ wire_in:
                                irc_bls_s     <= bls_i;
                                irc_out_s     <= '1';
 
-                       -- Maybe these would be better to latch in next_ce_i cycle,
+                       -- Maybe these would be better to latch in ce_i cycle,
                        -- and then just pass them
                        elsif address_i(0) = '0' then
 
@@ -236,12 +152,12 @@ wire_in:
        end process;
 
 wire_out:
-       process(ce_s, irc_data_s, irc_out_r, state_o_r)
+       process(ce_r, irc_data_s, irc_out_r, state_o_r)
        begin
 
                data_o <= (others => '0');
 
-               if ce_s = '1' then
+               if ce_r = '1' then
 
                        if irc_out_r = '1' then
                                data_o <= irc_data_s;
@@ -256,7 +172,7 @@ update:
        process
        begin
                wait until clk_i'event and clk_i= '1';
-               ce_s      <= next_ce_i;
+               ce_r      <= ce_i;
                irc_out_r <= irc_out_s;
                state_o_r <= state_o_s;