Changeset 10009 for firmware/FTU/rs485


Ignore:
Timestamp:
10/18/10 12:37:44 (14 years ago)
Author:
weitzel
Message:
DNA identifier added and RS485 debugged
Location:
firmware/FTU/rs485
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • firmware/FTU/rs485/FTU_rs485_control.vhd

    r9939 r10009  
    4242    enables_ready           : IN  std_logic;  -- enable_array_rs485_in is ok for sending
    4343    prescaling_ready        : IN  std_logic;  -- prescaling byte is ok for sending
     44    ping_pong_ready         : IN  std_logic;  -- ping pong successful
    4445    rate_array_rs485        : IN  rate_array_type;
    4546    overflow_array_rs485_in : IN  STD_LOGIC_VECTOR(7 downto 0);
     
    4748    enable_array_rs485_in   : IN  enable_array_type;
    4849    prescaling_rs485_in     : IN  STD_LOGIC_VECTOR(7 downto 0);
     50    dna                     : IN  STD_LOGIC_VECTOR(63 downto 0);
    4951    rx_en                   : OUT std_logic;
    5052    tx_d                    : OUT std_logic;
     
    5759    read_enables            : OUT std_logic := '0';  -- FTM wants to read enable pattern
    5860    read_prescaling         : OUT std_logic := '0';  -- FTM wants to read prescaling value
     61    ping_pong               : OUT std_logic := '0';  -- ping pong command from FTM
    5962    dac_array_rs485_out     : OUT dac_array_type;
    6063    enable_array_rs485_out  : OUT enable_array_type;
     
    8386  signal int_read_enables_sig    : std_logic;  -- initialized in FTU_rs485_interpreter
    8487  signal int_read_prescaling_sig : std_logic;  -- initialized in FTU_rs485_interpreter
     88  signal int_ping_pong_sig       : std_logic;  -- initialized in FTU_rs485_interpreter
    8589
    8690  signal txcnt : integer range 0 to (RS485_BLOCK_WIDTH / 8) := 0;  -- count 16 1-byte frames
     
    110114      int_read_enables       : OUT std_logic;
    111115      int_read_prescaling    : OUT std_logic;
     116      int_ping_pong          : OUT std_logic;
    112117      dac_array_rs485_out    : OUT dac_array_type;
    113118      enable_array_rs485_out : OUT enable_array_type;
     
    136141  type FTU_rs485_control_StateType is (RECEIVE,
    137142                                       READ_RATES_WAIT, READ_DAC_WAIT, READ_ENABLE_WAIT, READ_PRESCALING_WAIT,
    138                                        SET_DAC_WAIT, SET_ENABLE_WAIT, SET_PRESCALING_WAIT,
     143                                       SET_DAC_WAIT, SET_ENABLE_WAIT, SET_PRESCALING_WAIT, PING_PONG_WAIT,
    139144                                       READ_RATES_TRANSMIT, READ_DAC_TRANSMIT, READ_ENABLE_TRANSMIT, READ_PRESCALING_TRANSMIT,
    140                                        SET_DAC_TRANSMIT, SET_ENABLE_TRANSMIT, SET_PRESCALING_TRANSMIT);
     145                                       SET_DAC_TRANSMIT, SET_ENABLE_TRANSMIT, SET_PRESCALING_TRANSMIT, PING_PONG_TRANSMIT);
    141146  signal FTU_rs485_control_State : FTU_rs485_control_StateType;
    142147 
     
    166171      int_read_enables       => int_read_enables_sig,
    167172      int_read_prescaling    => int_read_prescaling_sig,
     173      int_ping_pong          => int_ping_pong_sig,
    168174      dac_array_rs485_out    => dac_array_rs485_out,
    169175      enable_array_rs485_out => enable_array_rs485_out,
     
    205211            read_enables    <= '0';
    206212            read_prescaling <= '0';
     213            ping_pong       <= '0';
    207214            FTU_rs485_control_State <= SET_DAC_WAIT;
    208215          elsif (int_new_DACs_sig = '0' and int_new_enables_sig = '1') then
     
    214221            read_enables    <= '0';
    215222            read_prescaling <= '0';
     223            ping_pong       <= '0';
    216224            FTU_rs485_control_State <= SET_ENABLE_WAIT;
    217225          elsif (int_new_DACs_sig = '0' and int_new_enables_sig = '0' and int_new_prescaling_sig = '1') then
     
    223231            read_enables    <= '0';
    224232            read_prescaling <= '0';
     233            ping_pong       <= '0';
    225234            FTU_rs485_control_State <= SET_PRESCALING_WAIT;
    226235          elsif (int_new_DACs_sig = '0' and int_new_enables_sig = '0' and int_new_prescaling_sig = '0' and
     
    233242            read_enables    <= '0';
    234243            read_prescaling <= '0';
     244            ping_pong       <= '0';
    235245            FTU_rs485_control_State <= READ_RATES_WAIT;
    236246          elsif (int_new_DACs_sig = '0' and int_new_enables_sig = '0' and int_new_prescaling_sig = '0' and
     
    243253            read_enables    <= '0';
    244254            read_prescaling <= '0';
     255            ping_pong       <= '0';
    245256            FTU_rs485_control_State <= READ_DAC_WAIT;
    246257          elsif (int_new_DACs_sig = '0' and int_new_enables_sig = '0' and int_new_prescaling_sig = '0' and
     
    253264            read_enables    <= '1';
    254265            read_prescaling <= '0';
     266            ping_pong       <= '0';
    255267            FTU_rs485_control_State <= READ_ENABLE_WAIT;
    256268          elsif (int_new_DACs_sig = '0' and int_new_enables_sig = '0' and int_new_prescaling_sig = '0' and
     
    263275            read_enables    <= '0';
    264276            read_prescaling <= '1';
     277            ping_pong       <= '0';
    265278            FTU_rs485_control_State <= READ_PRESCALING_WAIT;
    266           else
     279          elsif (int_new_DACs_sig = '0' and int_new_enables_sig = '0' and int_new_prescaling_sig = '0' and
     280                 int_read_rates_sig = '0' and int_read_DACs_sig = '0' and int_read_enables_sig = '0' and int_read_prescaling_sig = '0' and
     281                 int_ping_pong_sig = '1') then
    267282            new_DACs        <= '0';
    268283            new_enables     <= '0';
     
    272287            read_enables    <= '0';
    273288            read_prescaling <= '0';
     289            ping_pong       <= '1';
     290            FTU_rs485_control_State <= PING_PONG_WAIT;
     291          else
     292            new_DACs        <= '0';
     293            new_enables     <= '0';
     294            new_prescaling  <= '0';
     295            read_rates      <= '0';
     296            read_DACs       <= '0';
     297            read_enables    <= '0';
     298            read_prescaling <= '0';
     299            ping_pong       <= '0';
    274300            FTU_rs485_control_State <= RECEIVE;
    275301          end if;
     
    338364          end if;
    339365
     366        when PING_PONG_WAIT =>  -- wait until FTU control says "done" and then answer to FTM
     367          if (ping_pong_ready = '1') then
     368            ping_pong <= '0';
     369            FTU_rs485_control_State <= PING_PONG_TRANSMIT;
     370          else
     371            ping_pong <= '1';
     372            FTU_rs485_control_State <= PING_PONG_WAIT;
     373          end if;
     374         
    340375        when SET_DAC_TRANSMIT =>
    341376          if tx_busy_sig = '0' then
     
    869904            FTU_rs485_control_State <= READ_PRESCALING_TRANSMIT;
    870905          end if;
     906
     907        when PING_PONG_TRANSMIT =>
     908          if tx_busy_sig = '0' then
     909            if txcnt = 0 then           -- start delimiter
     910              txcnt <= txcnt + 1;
     911              tx_data_sig <= RS485_START_DELIM;
     912              tx_start_sig <= '1';
     913              FTU_rs485_control_State <= PING_PONG_TRANSMIT;
     914            elsif txcnt = 1 then        -- FTM address
     915              txcnt <= txcnt + 1;
     916              tx_data_sig <= FTM_ADDRESS;
     917              tx_start_sig <= '1';
     918              FTU_rs485_control_State <= PING_PONG_TRANSMIT;
     919            elsif txcnt = 2 then        -- board address
     920              txcnt <= txcnt + 1;
     921              tx_data_sig <= "00" & brd_add;
     922              tx_start_sig <= '1';
     923              FTU_rs485_control_State <= PING_PONG_TRANSMIT;
     924            elsif txcnt = 3 then        -- mirrored command
     925              txcnt <= txcnt + 1;
     926              tx_data_sig <= "00000101";
     927              tx_start_sig <= '1';
     928              FTU_rs485_control_State <= PING_PONG_TRANSMIT;
     929            elsif txcnt = 4 then        -- data: device DNA
     930              txcnt <= txcnt + 1;
     931              tx_data_sig <= dna(7 downto 0);
     932              tx_start_sig <= '1';
     933              FTU_rs485_control_State <= PING_PONG_TRANSMIT;
     934            elsif txcnt = 5 then        -- data: device DNA
     935              txcnt <= txcnt + 1;
     936              tx_data_sig <= dna(15 downto 8);
     937              tx_start_sig <= '1';
     938              FTU_rs485_control_State <= PING_PONG_TRANSMIT;
     939            elsif txcnt = 6 then        -- data: device DNA
     940              txcnt <= txcnt + 1;
     941              tx_data_sig <= dna(23 downto 16);
     942              tx_start_sig <= '1';
     943              FTU_rs485_control_State <= PING_PONG_TRANSMIT;
     944            elsif txcnt = 7 then        -- data: device DNA
     945              txcnt <= txcnt + 1;
     946              tx_data_sig <= dna(31 downto 24);
     947              tx_start_sig <= '1';
     948              FTU_rs485_control_State <= PING_PONG_TRANSMIT;
     949            elsif txcnt = 8 then        -- data: device DNA
     950              txcnt <= txcnt + 1;
     951              tx_data_sig <= dna(39 downto 32);
     952              tx_start_sig <= '1';
     953              FTU_rs485_control_State <= PING_PONG_TRANSMIT;
     954            elsif txcnt = 9 then        -- data: device DNA
     955              txcnt <= txcnt + 1;
     956              tx_data_sig <= dna(47 downto 40);
     957              tx_start_sig <= '1';
     958              FTU_rs485_control_State <= PING_PONG_TRANSMIT;
     959            elsif txcnt = 10 then       -- data: device DNA
     960              txcnt <= txcnt + 1;
     961              tx_data_sig <= dna(55 downto 48);
     962              tx_start_sig <= '1';
     963              FTU_rs485_control_State <= PING_PONG_TRANSMIT;
     964            elsif txcnt = 11 then       -- data: device DNA
     965              txcnt <= txcnt + 1;
     966              tx_data_sig <= dna(63 downto 56);
     967              tx_start_sig <= '1';
     968              FTU_rs485_control_State <= PING_PONG_TRANSMIT;
     969            elsif txcnt < 15 then        -- data: not used
     970              txcnt <= txcnt + 1;
     971              tx_data_sig <= "00000000";
     972              tx_start_sig <= '1';
     973              FTU_rs485_control_State <= PING_PONG_TRANSMIT;
     974            elsif txcnt = 15 then        -- check sum
     975              txcnt <= txcnt + 1;
     976              tx_data_sig <= "00000000";  -- NOT YET IMPLEMENTED!!!
     977              tx_start_sig <= '1';
     978              FTU_rs485_control_State <= PING_PONG_TRANSMIT;
     979            else                        -- transmission finished
     980              txcnt <= 0;
     981              FTU_rs485_control_State <= RECEIVE;
     982            end if; 
     983          else
     984            tx_start_sig <= '0';
     985            FTU_rs485_control_State <= PING_PONG_TRANSMIT;
     986          end if;
    871987         
    872988      end case;
  • firmware/FTU/rs485/FTU_rs485_interpreter.vhd

    r9939 r10009  
    4646    int_read_enables       : OUT std_logic := '0';
    4747    int_read_prescaling    : OUT std_logic := '0';
     48    int_ping_pong          : OUT std_logic := '0';
    4849    dac_array_rs485_out    : OUT dac_array_type;
    4950    enable_array_rs485_out : OUT enable_array_type;
     
    7980          int_read_enables    <= '0'; 
    8081          int_read_prescaling <= '0';
     82          int_ping_pong       <= '0';
    8183          if (block_valid_sr(3 downto 2) = "01") then  -- rising edge of valid signal
    8284            FTU_rs485_interpreter_State <= CHECK_HEADER;
     
    9395          int_read_enables    <= '0'; 
    9496          int_read_prescaling <= '0';
     97          int_ping_pong       <= '0';
    9598          if (data_block(7 downto 0) = RS485_START_DELIM) and
    9699             (data_block(15 downto 8) = ("00" & brd_add)) and 
     
    102105
    103106        when DECODE => -- decode instruction
    104           if(data_block(31 downto 24) = "00000000") then
     107          if(data_block(31 downto 24) = "00000000") then -- set DACs
    105108            int_new_DACs        <= '1';
    106109            int_new_enables     <= '0';
     
    110113            int_read_enables    <= '0'; 
    111114            int_read_prescaling <= '0';
     115            int_ping_pong       <= '0';
    112116            dac_array_rs485_out_sig <= (conv_integer(unsigned(data_block(43 downto 32))),
    113117                                        conv_integer(unsigned(data_block(59 downto 48))),
     
    120124                                        );
    121125            FTU_rs485_interpreter_State <= WAIT_FOR_DATA;
    122           elsif (data_block(31 downto 24) = "00000001") then
     126          elsif (data_block(31 downto 24) = "00000001") then -- read DACs
    123127            int_new_DACs        <= '0';
    124128            int_new_enables     <= '0';
     
    128132            int_read_enables    <= '0'; 
    129133            int_read_prescaling <= '0';
    130             FTU_rs485_interpreter_State <= WAIT_FOR_DATA;
    131           elsif (data_block(31 downto 24) = "00000010") then
     134            int_ping_pong       <= '0';
     135            FTU_rs485_interpreter_State <= WAIT_FOR_DATA;
     136          elsif (data_block(31 downto 24) = "00000010") then -- read rates
    132137            int_new_DACs        <= '0';
    133138            int_new_enables     <= '0';
     
    137142            int_read_enables    <= '0'; 
    138143            int_read_prescaling <= '0';
    139             FTU_rs485_interpreter_State <= WAIT_FOR_DATA;
    140           elsif (data_block(31 downto 24) = "00000011") then
     144            int_ping_pong       <= '0';
     145            FTU_rs485_interpreter_State <= WAIT_FOR_DATA;
     146          elsif (data_block(31 downto 24) = "00000011") then -- set enables
    141147            int_new_DACs        <= '0';
    142148            int_new_enables     <= '1';
     
    146152            int_read_enables    <= '0'; 
    147153            int_read_prescaling <= '0';
     154            int_ping_pong       <= '0';
    148155            enable_array_rs485_out_sig <= (data_block(47 downto 32),
    149156                                           data_block(63 downto 48),
     
    152159                                           );
    153160            FTU_rs485_interpreter_State <= WAIT_FOR_DATA;
    154           elsif (data_block(31 downto 24) = "00000100") then
     161          elsif (data_block(31 downto 24) = "00000100") then -- read enables
    155162            int_new_DACs        <= '0';
    156163            int_new_enables     <= '0';
     
    160167            int_read_enables    <= '1'; 
    161168            int_read_prescaling <= '0';
    162             FTU_rs485_interpreter_State <= WAIT_FOR_DATA;
    163           elsif (data_block(31 downto 24) = "00000110") then
     169            int_ping_pong       <= '0';
     170            FTU_rs485_interpreter_State <= WAIT_FOR_DATA;
     171          elsif (data_block(31 downto 24) = "00000110") then -- set counter mode
    164172            int_new_DACs        <= '0';
    165173            int_new_enables     <= '0';
     
    169177            int_read_enables    <= '0'; 
    170178            int_read_prescaling <= '0';
     179            int_ping_pong       <= '0';
    171180            prescaling_rs485_out_sig <= data_block(39 downto 32);
    172181            FTU_rs485_interpreter_State <= WAIT_FOR_DATA;
    173           elsif (data_block(31 downto 24) = "00000111") then
     182          elsif (data_block(31 downto 24) = "00000111") then -- read counter mode
    174183            int_new_DACs        <= '0';
    175184            int_new_enables     <= '0';
     
    179188            int_read_enables    <= '0'; 
    180189            int_read_prescaling <= '1';
     190            int_ping_pong       <= '0';
     191            FTU_rs485_interpreter_State <= WAIT_FOR_DATA;
     192          elsif (data_block(31 downto 24) = "00000101") then -- ping pong
     193            int_new_DACs        <= '0';
     194            int_new_enables     <= '0';
     195            int_new_prescaling  <= '0';
     196            int_read_rates      <= '0';
     197            int_read_DACs       <= '0';
     198            int_read_enables    <= '0'; 
     199            int_read_prescaling <= '0';
     200            int_ping_pong       <= '1';
    181201            FTU_rs485_interpreter_State <= WAIT_FOR_DATA;
    182202          else
     
    188208            int_read_enables    <= '0'; 
    189209            int_read_prescaling <= '0';
     210            int_ping_pong       <= '0';
    190211            FTU_rs485_interpreter_State <= WAIT_FOR_DATA;
    191212          end if;
Note: See TracChangeset for help on using the changeset viewer.