Ignore:
Timestamp:
02/08/11 08:17:13 (14 years ago)
Author:
neise
Message:
 added some comments and did some formating
File:
1 edited

Legend:

Unmodified
Added
Removed
  • firmware/FAD/FACT_FAD_20MHz_VAR_PS/FACT_FAD_lib/hdl/w5300_modul.vhd

    r10129 r10137  
    1 ----------------------------------------------------------------------------------
    2 -- Company:
    3 -- Engineer:
    4 --
    5 -- Create Date:    11:48:48 11/10/2009
    6 -- Design Name:
    71-- Module Name:    w5300_modul - Behavioral
    8 -- Project Name:
    9 -- Target Devices:
    10 -- Tool versions:
    11 -- Description:
    12 --
    13 -- Dependencies:
    14 --
    15 -- Revision:
    16 -- Revision 0.01 - File Created
    17 -- Additional Comments:
    18 --
    19 ----------------------------------------------------------------------------------
    202library IEEE;
    213use IEEE.STD_LOGIC_1164.ALL;
     
    246library FACT_FAD_lib;
    257use FACT_FAD_lib.fad_definitions.ALL;
    26 
    27 ---- Uncomment the following library declaration if instantiating
    28 ---- any Xilinx primitives in this code.
    29 --library UNISIM;
    30 --use UNISIM.VComponents.all;
    318
    329ENTITY w5300_modul IS
     
    5734      c_trigger_enable: out std_logic := '0';
    5835      c_trigger_mult: out std_logic_vector (7 DOWNTO 0) := (OTHERS => '1'); --subject to changes
    59       --
     36
     37          -- FAD configuration signals:
     38          ------------------------------------------------------------------------------
     39                -- start entire configuration chain
    6040      new_config : OUT std_logic := '0';
    6141      config_started : in std_logic;
     42                -- read/write configRAM
    6243      config_addr : out std_logic_vector (7 downto 0);
    6344      config_data : inout std_logic_vector (15 downto 0) := (others => 'Z');
    6445      config_wr_en : out std_logic := '0';
    6546      config_rd_en : out std_logic := '0';
    66       -- --
    6747      config_rw_ack, config_rw_ready : in std_logic;
    68       -- --
    6948      config_busy : in std_logic;
     49          ------------------------------------------------------------------------------
    7050     
     51          -- MAC/IP calculation signals:
     52          ------------------------------------------------------------------------------
    7153      MAC_jumper : in std_logic_vector (1 downto 0);
    7254      BoardID : in std_logic_vector (3 downto 0);
    7355      CrateID : in std_logic_vector (1 downto 0);
     56          ------------------------------------------------------------------------------
    7457     
     58          -- user controllable enable signals
     59          ------------------------------------------------------------------------------
     60          trigger_enable : out std_logic := '0'; -- default triggers are NOT accepted
    7561      denable : out std_logic := '0'; -- default domino wave off
    7662      dwrite_enable : out std_logic := '0'; -- default DWRITE low.
    7763      sclk_enable : out std_logic := '1'; -- default DWRITE HIGH.
    78       ps_direction : out std_logic := '1'; -- default phase shift upwards
     64      srclk_enable : out std_logic := '1'; -- default SRCLK on.
     65          ------------------------------------------------------------------------------
     66         
     67          -- ADC CLK generator, is able to shift phase with respect to X_50M
     68          -- these signals control the behavior of the digital clock manager (DCM)
     69          ------------------------------------------------------------------------------
     70          ps_direction : out std_logic := '1'; -- default phase shift upwards
    7971      ps_do_phase_shift : out std_logic := '0'; --pulse this to phase shift once
    8072      ps_reset : out std_logic := '0'; -- pulse this to reset the variable phase shift
    81      
    82       srclk_enable : out std_logic := '1'; -- default SRCLK on.
    83      
    84       trigger_enable : out std_logic := '0'; -- default triggers are NOT accepted
    85      
     73      ------------------------------------------------------------------------------
     74         
     75          -- signals used to control FAD LED bahavior:
     76          -- one of the three LEDs is used for com-status info
     77          ------------------------------------------------------------------------------
    8678      socks_waiting : out std_logic;
    8779      socks_connected: out std_logic
     80          ------------------------------------------------------------------------------
     81         
     82         
    8883   );
    89 
    90 -- Declarations
    91 
    9284END w5300_modul ;
    9385
     
    154146signal data_valid_int : std_logic := '0';
    155147
     148
     149-- signals used for MAC/IP calculation:
     150-- these 2 synch in, the jumper state.
    156151signal FAD_in_cam : std_logic := '0';
    157152signal FAD_at_ETHZ : std_logic := '0';
     153-- these 2 synch in the FMP lines encoding the FAD position in the cam.
    158154signal bid : std_logic_vector (3 downto 0);
    159155signal cid : std_logic_vector (1 downto 0);
    160 
    161 
    162 -- only for debugging
    163 --signal error_cnt : std_logic_vector (7 downto 0) := (others => '0');
    164 --signal last_trigger_id : std_logic_vector (15 downto 0) := (others => '0');
    165 
    166 
    167 -- signals for different socket modes: DN 04.01.11
    168 signal socket_nr_counter : integer range 1 to 7 :=1; --used to determine which socket is used for data sending
    169 signal socket_send_mode : std_logic := '0'; -- if 0 data is send via socket 0; if 1 data is send via the other sockets.
    170 
     156-- these are just used as local variables, to make reading easier.
    171157signal mac_loc : mac_type;
    172158signal ip_loc : ip_type;
     
    174160signal netmask_loc : ip_type;
    175161
     162        -- signals for synching in asynchronous input signals
     163        ------------------------------------------------------------------------------
     164        signal w5300_interrupt_sr : std_logic_vector(1 downto 0);
     165        ------------------------------------------------------------------------------
     166
     167
     168-- only for debugging
     169--signal error_cnt : std_logic_vector (7 downto 0) := (others => '0');
     170--signal last_trigger_id : std_logic_vector (15 downto 0) := (others => '0');
     171
     172
     173-- signals for different socket modes: DN 04.01.11
     174signal socket_nr_counter : integer range 1 to 7 :=1; --used to determine which socket is used for data sending
     175signal socket_send_mode : std_logic := '0'; -- if 0 data is send via socket 0; if 1 data is send via the other sockets.
    176176
    177177begin
     
    182182
    183183
    184         w5300_init_proc : process (clk, int)
     184        w5300_proc : process (clk)
    185185        begin
     186                if rising_edge (clk) then
     187                -- synch asynchronous input in:
     188                w5300_interrupt_sr <= w5300_interrupt_sr(1) & int;
    186189               
    187                 if rising_edge (clk) then
    188 
    189                         -- Interrupt low
    190                         if (int = '0') and (interrupt_ignore = '0') then
     190                        -- interrupt is handled synchronously
     191                        -- W5300 pulls low its interrpt line in case of:
     192                        --      ??? I don't know ... connection loss ???
     193                       
     194                        if (w5300_interrupt_sr = "01") and (interrupt_ignore = '0') then
    191195                                case state_interrupt_1 is
    192196                                        when IR1_01 =>
    193197                                                int_flag <= '1';
    194198                                                busy <= '1';
    195                                                 state_interrupt_1 <= IR1_02;
     199                                                state_interrupt_1 <= IR1_02;  --wait one cycle
    196200                                        when IR1_02 =>
    197201                                                state_interrupt_1 <= IR1_03;
     
    200204                                                socket_cnt <= "000";
    201205                                                ram_access <= '0';
    202                                                 zaehler <= X"00000";
    203                                                 count <= "000";
     206                                                zaehler <= X"00000";    --what is this zaehler counting?
     207                                                count <= "000";                 --what is this count counting?
    204208                                                int_flag <= '0';
    205209                                                interrupt_ignore <= '1';
    206                                                 state_interrupt_1 <= IR1_04;
     210                                                state_interrupt_1 <= IR1_04;  --this state is not existing? bad coding habit???
    207211                                        when others =>
    208212                                                null;
     
    220224                                                                next_state <= INTERRUPT;
    221225                                                                state_interrupt_2 <= IR2_02;
    222                                                         when IR2_02 =>
     226                                                               
     227                                                        -- check if it was a Sx Interrupt of Socket n
     228                                                        -- therfor: loop over all channel.
     229                                                        -- if the loop ended but no Sx Interrupt was found --> IR2_06
     230                                                        -- if an Sx Interrupt was found go to --> IR2_03 and check what happened.
     231                                                        when IR2_02 =>
    223232                                                                if (data_read (conv_integer(socket_cnt)) = '1') then -- Sx Interrupt
    224233                                                                        state_interrupt_2 <= IR2_03;
    225234                                                                else
    226                   socket_cnt <= socket_cnt + 1;
    227                   if (socket_cnt = 7) then
    228                     state_interrupt_2 <= IR2_06;
    229                   else
    230                     state_interrupt_2 <= IR2_02;
    231                   end if;
     235                                                                        socket_cnt <= socket_cnt + 1;
     236                                                                        if (socket_cnt = 7) then
     237                                                                                state_interrupt_2 <= IR2_06;
     238                                                                        else
     239                                                                                state_interrupt_2 <= IR2_02;  -- go on with loop
     240                                                                        end if;
    232241                                                                end if;
     242                                                               
     243                                                        -- check the Interrupt register of the Socket, which caused the Interrupt.
    233244                                                        when IR2_03 =>
    234245                                                                par_addr <= W5300_S0_IR + socket_cnt * W5300_S_INC; -- Sx Interrupt Register
     
    236247                                                                next_state <= INTERRUPT;
    237248                                                                state_interrupt_2 <= IR2_04;
     249                                                        -- before checking what happened, clear the Interrupt register, so we can proceed.
    238250                                                        when IR2_04 =>
    239251                                                                par_addr <= W5300_S0_IR + socket_cnt * W5300_S_INC;
     
    242254                                                                next_state <= INTERRUPT;
    243255                                                                state_interrupt_2 <= IR2_05;
     256                                                        -- send the command to close this socket
     257                                                        -- then go back and read the main Interrupt register again,
     258                                                        -- if this was not Socket 7 ... if it was Socket 7, we're done anyway.
    244259                                                        when IR2_05 =>
    245260                                                                par_addr <= W5300_S0_CR + socket_cnt * W5300_S_INC;
     
    254269                                                                end if;
    255270
     271                                                        -- we go on and reset, the W5300 and this entire state machine.
    256272                                                        when IR2_06 =>
    257273                                                                state_interrupt_1 <= IR1_01;
     
    263279                                        -- reset W5300
    264280                                        when RESET =>
    265                                           socket_send_mode <= '0';
    266                                           busy <= '1';
     281                                                socket_send_mode <= '0';
     282                                                busy <= '1';
    267283                                                zaehler <= zaehler + 1;
    268284                                                socks_waiting <= '0';
    269             socks_connected <= '0';
    270             wiz_reset <= '0';
    271 --            led <= X"FF";
     285                                                socks_connected <= '0';
     286                                                wiz_reset <= '0';
     287                                                --led <= X"FF";
    272288                                                if (zaehler >= X"00064") then -- wait 2µs
    273289                                                        wiz_reset <= '1';
     
    288304                                        -- Init
    289305                                        when INIT =>
    290                                           -- status of MAC jumpers is synched in
    291                                           -- and Board- and CrateID are synched in
    292                                           FAD_in_cam <= MAC_jumper(1); -- see position of jumpers in FACT logbook
    293             FAD_at_ETHZ <= MAC_jumper(0); -- MAC_jumper(1) is where D_T(7) was; MAC_jumper(0) is where D_T(6) was;
    294             bid <= BoardID;
    295             cid <= CrateID;
    296             --
     306                                                -- status of MAC jumpers is synched in
     307                                                -- and Board- and CrateID are synched in
     308                                                FAD_in_cam <= MAC_jumper(1); -- see position of jumpers in FACT logbook
     309                                                FAD_at_ETHZ <= MAC_jumper(0); -- MAC_jumper(1) is where D_T(7) was; MAC_jumper(0) is where D_T(6) was;
     310                                                bid <= BoardID;
     311                                                cid <= CrateID;
    297312                                                par_addr <= W5300_MR;
    298313                                                par_data <= X"0000";
    299314                                                state_init <= WRITE_REG;
    300315                                                next_state <= LOCATE;
    301                                        
     316                               
    302317                                        when LOCATE =>                                   
    303                                           state_init <= IM;
    304                                          
    305                                           if (FAD_in_cam = '1') then
    306                                             -- if BID = "1111" and CID="11" then FAD is not really in cam
    307               -- back to INIT !! endless loop
    308               if (bid = "1111" and cid="11") then
    309                -- this should never happen!!!!!
    310                -- impossible to find this out, if in cam
    311                 state_init <= INIT;
    312               else -- everything is fine
    313                 -- IP & MAC are calculated from BID & CID
    314                 -- code here
    315                 gateway_loc <= CAM_GATEWAY;
    316                 netmask_loc <= CAM_NETMASK;                                             
    317                 mac_loc <= (CAM_MAC_prefix (0), CAM_MAC_prefix (1)  , conv_std_logic_vector ( conv_integer(cid)*10+conv_integer(bid)  , 16)   );
    318                 ip_loc <= ( CAM_IP_PREFIX(0) , CAM_IP_PREFIX(1) , IP_offset + conv_integer(cid) , IP_offset + conv_integer(bid) );
    319               end if;
    320                                           else -- FAD is tested, either at ETHZ or at TUDO AND either with FMP or without.
    321                                             if ( FAD_at_ETHZ = '0' ) then
    322                                              -- easy FAD is at TUDO -> only one choice.
    323                                              mac_loc <= MAC_FAD0;
    324                ip_loc <= IP_TUDO;
    325                gateway_loc <= TUDO_GATEWAY;
    326                netmask_loc <= TUDO_NETMASK;
    327                                             else -- FAD is at ETHZ but not in cam --> IP lookup table is needed.
    328                                               if (bid = "1111" and cid="11") then -- FAD is not in crate
    329                   mac_loc <= MAC_FAD0;
    330                   ip_loc <= IP_ETHZ_FAD0;
    331                   gateway_loc <= ETHZ_GATEWAY;
    332                   netmask_loc <= ETHZ_NETMASK;                                         
    333                                               else
    334                                                 -- FAD is at ETHZ and in crate:
    335                                                 -- crate ID is not of importance.
    336                                                 -- we only have 3 MACs and IPs so far, so only the first boardIDs are allowed.
    337                                                 if ( conv_integer(bid) < MAC_LIST'length) then
    338                     gateway_loc <= ETHZ_GATEWAY;
    339                     netmask_loc <= ETHZ_NETMASK;                                               
    340                     mac_loc <= MAC_LIST(conv_integer(bid));
    341                                                 ip_loc <= IP_LIST(conv_integer(bid));
    342                                                 end if; -- conv_integer
    343                                               end if; -- bid=1111 & cid=11
    344                                             end if; --FAD_at_ETHZ = 0
    345                                           end if; --FAD_in_cam = 1
     318                                                state_init <= IM;
     319
     320                                                if (FAD_in_cam = '1') then
     321                                                        if (bid = "1111" and cid="11") then
     322                                                                -- if BID = "1111" and CID="11" then FAD is not really in cam
     323                                                                -- I don't know what to do now.
     324                                                                -- I could wait a long time, and then just assume, I was not in cam.
     325                                                                -- this should never happen!!!!!
     326                                                                -- impossible to find this out, if in cam
     327                                                                state_init <= INIT;
     328                                                        else -- everything is fine
     329                                                                -- IP & MAC are calculated from BID & CID
     330                                                                -- code here
     331                                                                gateway_loc <= CAM_GATEWAY;
     332                                                                netmask_loc <= CAM_NETMASK;                                             
     333                                                                mac_loc <= (CAM_MAC_prefix (0), CAM_MAC_prefix (1)  , conv_std_logic_vector ( conv_integer(cid)*10+conv_integer(bid)  , 16)   );
     334                                                                ip_loc <= ( CAM_IP_PREFIX(0) , CAM_IP_PREFIX(1) , IP_offset + conv_integer(cid) , IP_offset + conv_integer(bid) );
     335                                                        end if;
     336                                                else -- FAD is tested, either at ETHZ or at TUDO AND either with FMP or without.
     337                                                        if ( FAD_at_ETHZ = '0' ) then
     338                                                                -- easy FAD is at TUDO -> only one choice.
     339                                                                mac_loc <= MAC_FAD0;
     340                                                                ip_loc <= IP_TUDO;
     341                                                                gateway_loc <= TUDO_GATEWAY;
     342                                                                netmask_loc <= TUDO_NETMASK;
     343                                                        else -- FAD is at ETHZ but not in cam --> IP lookup table is needed.
     344                                                                if (bid = "1111" and cid="11") then -- FAD is not in crate
     345                                                                        mac_loc <= MAC_FAD0;
     346                                                                        ip_loc <= IP_ETHZ_FAD0;
     347                                                                        gateway_loc <= ETHZ_GATEWAY;
     348                                                                        netmask_loc <= ETHZ_NETMASK;                                           
     349                                                                else
     350                                                                        -- FAD is at ETHZ and in crate:
     351                                                                        -- crate ID is not of importance.
     352                                                                        -- we only have 3 MACs and IPs so far, so only the first boardIDs are allowed.
     353                                                                        if ( conv_integer(bid) < MAC_LIST'length) then
     354                                                                                gateway_loc <= ETHZ_GATEWAY;
     355                                                                                netmask_loc <= ETHZ_NETMASK;                                           
     356                                                                                mac_loc <= MAC_LIST(conv_integer(bid));
     357                                                                                ip_loc <= IP_LIST(conv_integer(bid));
     358                                                                        end if; -- conv_integer
     359                                                                end if; -- bid=1111 & cid=11
     360                                                        end if; --FAD_at_ETHZ = 0
     361                                                end if; --FAD_in_cam = 1
    346362                                               
    347363                                        -- Interrupt Mask
     
    10031019                end if; -- rising_edge (clk)
    10041020
    1005         end process w5300_init_proc;
     1021        end process w5300_proc;
    10061022
    10071023end Behavioral;
Note: See TracChangeset for help on using the changeset viewer.