Changeset 10050


Ignore:
Timestamp:
11/10/10 15:08:54 (14 years ago)
Author:
weitzel
Message:
CRC added for FTU RS485 communication
Location:
firmware/FTU
Files:
1 added
5 edited

Legend:

Unmodified
Added
Removed
  • firmware/FTU/FTU_control.vhd

    r10037 r10050  
    201201            ram_dia_sig <= (others => '0');
    202202            FTU_control_State <= INIT_RAM;
    203           elsif (ram_ada_cntr = (NO_OF_ENABLE*RAM_ADDR_RATIO + NO_OF_COUNTER*RAM_ADDR_RATIO*RAM_CEF + (NO_OF_DAC - NO_OF_DAC_NOT_USED)*RAM_ADDR_RATIO) + 2) then  -- default CRC errors
    204             ram_dia_sig <= (others => '0');
    205             FTU_control_State <= INIT_RAM;
     203          --elsif (ram_ada_cntr = (NO_OF_ENABLE*RAM_ADDR_RATIO + NO_OF_COUNTER*RAM_ADDR_RATIO*RAM_CEF + (NO_OF_DAC - NO_OF_DAC_NOT_USED)*RAM_ADDR_RATIO) + 2) then  -- default CRC errors
     204            --ram_dia_sig <= (others => '0');
     205            --FTU_control_State <= INIT_RAM;
    206206          elsif (ram_ada_cntr < 2**RAM_ADDR_WIDTH_A) then  -- empty RAM cells
    207207            ram_dia_sig <= (others => '0');
     
    302302            ram_adb_sig <= conv_std_logic_vector(ram_enable_cntr + 1, RAM_ADDR_WIDTH_B);
    303303            FTU_control_State <= CONFIG_ENABLE;
    304           elsif (ram_enable_cntr > 0 and ram_enable_cntr < NO_OF_ENABLE + 1) then
     304          --elsif (ram_enable_cntr > 0 and ram_enable_cntr < NO_OF_ENABLE + 1) then
     305            --ram_adb_sig <= conv_std_logic_vector(ram_enable_cntr + 1, RAM_ADDR_WIDTH_B);
     306            --enable_array_sig(ram_enable_cntr - 1) <= ram_dob;
     307            --enables_ready <= '1';
     308            --FTU_control_State <= CONFIG_ENABLE;
     309          elsif (ram_enable_cntr < NO_OF_ENABLE) then
     310            ram_adb_sig <= conv_std_logic_vector(ram_enable_cntr + 1, RAM_ADDR_WIDTH_B);
     311            enable_array_sig(ram_enable_cntr - 1) <= ram_dob;
     312            FTU_control_State <= CONFIG_ENABLE;
     313          elsif (ram_enable_cntr = NO_OF_ENABLE) then
    305314            ram_adb_sig <= conv_std_logic_vector(ram_enable_cntr + 1, RAM_ADDR_WIDTH_B);
    306315            enable_array_sig(ram_enable_cntr - 1) <= ram_dob;
  • firmware/FTU/FTU_top_tb.vhd

    r10037 r10050  
    244244    wait for 5ns;
    245245    trigger_sig <= '0';
    246     wait;   
     246    wait for 1800us;
     247    trigger_sig <= '1';
     248    wait for 5ns;
     249    trigger_sig <= '0';
     250    wait for 50us;
     251    trigger_sig <= '1';
     252    wait for 5ns;
     253    trigger_sig <= '0';
     254    wait;
    247255  end process trigger_proc;
    248256
     
    292300    assign_rs485("00000001"); --FTM firmware ID
    293301    wait for 0ns;
    294     assign_rs485("00000010"); --instruction
     302    assign_rs485("00000110"); --instruction
    295303    wait for 0us;
    296     assign_rs485("00000001"); --data byte 01
     304    assign_rs485("00010100"); --data byte 01
    297305    wait for 0ns;
    298306    assign_rs485("00000000"); --data byte 02
    299307    wait for 0ns;
    300     assign_rs485("00000010"); --data byte 03
     308    assign_rs485("00000000"); --data byte 03
    301309    wait for 0ns;
    302310    assign_rs485("00000000"); --data byte 04
    303311    wait for 0ns;
    304     assign_rs485("00000100"); --data byte 05
     312    assign_rs485("00000000"); --data byte 05
    305313    wait for 0ns;
    306314    assign_rs485("00000000"); --data byte 06
    307315    wait for 0ns;
    308     assign_rs485("00001000"); --data byte 07
     316    assign_rs485("00000000"); --data byte 07
    309317    wait for 0ns;
    310318    assign_rs485("00000000"); --data byte 08
    311319    wait for 0ns;
    312     assign_rs485("00010000"); --data byte 09
     320    assign_rs485("00000000"); --data byte 09
    313321    wait for 0ns;
    314322    assign_rs485("00000000"); --data byte 10
     
    318326    assign_rs485("00000000"); --data byte 12
    319327    wait for 0ns;
    320     assign_rs485("00000001"); --data byte 13
     328    assign_rs485("00000000"); --data byte 13
    321329    wait for 0ns;
    322330    assign_rs485("00000000"); --data byte 14
    323331    wait for 0ns;
    324     assign_rs485("00000010"); --data byte 15
     332    assign_rs485("00000000"); --data byte 15
    325333    wait for 0ns;
    326334    assign_rs485("00000000"); --data byte 16
    327335    wait for 0ns;
    328     assign_rs485("00000100"); --data byte 17
     336    assign_rs485("00000000"); --data byte 17
    329337    wait for 0ns;
    330338    assign_rs485("00000000"); --data byte 18
    331339    wait for 0ns;
    332     assign_rs485("00001000"); --data byte 19
     340    assign_rs485("00000000"); --data byte 19
    333341    wait for 0ns;
    334342    assign_rs485("00000000"); --data byte 20
    335343    wait for 0ns;
    336     assign_rs485("00010000"); --data byte 21
     344    assign_rs485("00000000"); --data byte 21
    337345    wait for 0ns;
    338346    assign_rs485("00000000"); --CRC error counter (not used)
    339347    wait for 0ns;
    340     assign_rs485("00000000"); --check sum
     348    assign_rs485("01001101"); --check sum
    341349    ---------------------------------------------------------------------------
    342350    -- wait enough time and send another command
     
    351359    assign_rs485("00000001"); --FTM firmware ID
    352360    wait for 0ns;
    353     assign_rs485("00000101"); --instruction
     361    assign_rs485("00000000"); --instruction
    354362    wait for 0us;
    355363    assign_rs485("00000001"); --data byte 01
     
    357365    assign_rs485("00000000"); --data byte 02
    358366    wait for 0ns;
    359     assign_rs485("00000010"); --data byte 03
     367    assign_rs485("00000000"); --data byte 03
    360368    wait for 0ns;
    361369    assign_rs485("00000000"); --data byte 04
    362370    wait for 0ns;
    363     assign_rs485("00000100"); --data byte 05
     371    assign_rs485("00000000"); --data byte 05
    364372    wait for 0ns;
    365373    assign_rs485("00000000"); --data byte 06
    366374    wait for 0ns;
    367     assign_rs485("00001000"); --data byte 07
     375    assign_rs485("00000000"); --data byte 07
    368376    wait for 0ns;
    369377    assign_rs485("00000000"); --data byte 08
    370378    wait for 0ns;
    371     assign_rs485("00010000"); --data byte 09
     379    assign_rs485("00000000"); --data byte 09
    372380    wait for 0ns;
    373381    assign_rs485("00000000"); --data byte 10
     
    377385    assign_rs485("00000000"); --data byte 12
    378386    wait for 0ns;
    379     assign_rs485("00000001"); --data byte 13
     387    assign_rs485("00000000"); --data byte 13
    380388    wait for 0ns;
    381389    assign_rs485("00000000"); --data byte 14
    382390    wait for 0ns;
    383     assign_rs485("00000010"); --data byte 15
     391    assign_rs485("00000000"); --data byte 15
    384392    wait for 0ns;
    385393    assign_rs485("00000000"); --data byte 16
    386394    wait for 0ns;
    387     assign_rs485("00000100"); --data byte 17
     395    assign_rs485("00000000"); --data byte 17
    388396    wait for 0ns;
    389397    assign_rs485("00000000"); --data byte 18
    390398    wait for 0ns;
    391     assign_rs485("00001000"); --data byte 19
     399    assign_rs485("00000000"); --data byte 19
    392400    wait for 0ns;
    393401    assign_rs485("00000000"); --data byte 20
    394402    wait for 0ns;
    395     assign_rs485("00010000"); --data byte 21
     403    assign_rs485("00000000"); --data byte 21
    396404    wait for 0ns;
    397405    assign_rs485("00000000"); --CRC error counter (not used)
    398406    wait for 0ns;
    399     assign_rs485("00000000"); --check sum
     407    assign_rs485("01010010"); --check sum
    400408    ---------------------------------------------------------------------------
    401409    -- don't forget final wait!
  • firmware/FTU/ftu_definitions.vhd

    r10047 r10050  
    8383  constant FTM_ADDRESS       : std_logic_vector(7 downto 0) := "11000000";  -- 192
    8484  constant FIRMWARE_ID       : std_logic_vector(7 downto 0) := "00000001";  -- firmware version
     85
     86  --CRC setup
     87  constant CRC_POLYNOMIAL : std_logic_vector(7 downto 0) := "00000111";  -- 8-CCITT
     88  constant CRC_INIT_VALUE : std_logic_vector(7 downto 0) := "11111111";
    8589 
    8690  --DNA identifier for simulation
  • firmware/FTU/rs485/FTU_rs485_control.vhd

    r10037 r10050  
    8989
    9090  signal txcnt : integer range 0 to (RS485_BLOCK_WIDTH / 8) := 0;  -- count 28 1-byte frames
     91
     92  signal reset_crc_sig     : std_logic := '0';
     93  signal crc_enable_sig    : std_logic := '0';
     94  signal crc_input_sig     : std_logic_vector(RS485_BLOCK_WIDTH - 9 downto 0) := (others => '0');
     95  signal crc_sig           : std_logic_vector(CRC_POLYNOMIAL'length - 1 downto 0) := (others => '0');
     96  signal crc_sig_inv       : std_logic_vector(CRC_POLYNOMIAL'length - 1 downto 0) := (others => '0');
     97  signal crc_error_cnt_sig : integer range 0 to 255 := 0;
     98
     99  component ucrc_par
     100    generic(
     101      POLYNOMIAL : std_logic_vector;
     102      INIT_VALUE : std_logic_vector;
     103      DATA_WIDTH : integer range 2 to 256;
     104      SYNC_RESET : integer range 0 to 1
     105    );
     106    port(
     107      clk_i   : in  std_logic;
     108      rst_i   : in  std_logic;
     109      clken_i : in  std_logic;
     110      data_i  : in  std_logic_vector(DATA_WIDTH - 1 downto 0);
     111      match_o : out std_logic;
     112      crc_o   : out std_logic_vector(POLYNOMIAL'length - 1 downto 0)
     113    );
     114  end component;
    91115 
    92116  component FTU_rs485_receiver
     
    107131      block_valid            : IN  std_logic;
    108132      brd_add                : IN  std_logic_vector(5 downto 0);
     133      crc_error_cnt          : OUT integer range 0 to 255;
    109134      int_new_DACs           : OUT std_logic;
    110135      int_new_enables        : OUT std_logic;
     
    139164  end component;
    140165
    141   type FTU_rs485_control_StateType is (RECEIVE,
     166  type FTU_rs485_control_StateType is (INIT, RECEIVE,
    142167                                       READ_RATES_WAIT, READ_DAC_WAIT, READ_ENABLE_WAIT, READ_PRESCALING_WAIT,
    143                                        SET_DAC_WAIT, SET_ENABLE_WAIT, SET_PRESCALING_WAIT, PING_PONG_WAIT,
     168                                       READ_RATES_WAIT_2, READ_DAC_WAIT_2, READ_ENABLE_WAIT_2, READ_PRESCALING_WAIT_2,
     169                                       SET_DAC_WAIT, SET_ENABLE_WAIT, SET_PRESCALING_WAIT, PING_PONG_WAIT,                                       
     170                                       SET_DAC_WAIT_2, SET_ENABLE_WAIT_2, SET_PRESCALING_WAIT_2, PING_PONG_WAIT_2,
    144171                                       READ_RATES_TRANSMIT, READ_DAC_TRANSMIT, READ_ENABLE_TRANSMIT, READ_PRESCALING_TRANSMIT,
    145172                                       SET_DAC_TRANSMIT, SET_ENABLE_TRANSMIT, SET_PRESCALING_TRANSMIT, PING_PONG_TRANSMIT);
     
    147174 
    148175begin
     176
     177  crc_sig <= crc_sig_inv(0) & crc_sig_inv(1) & crc_sig_inv(2) & crc_sig_inv(3) & crc_sig_inv(4) & crc_sig_inv(5) & crc_sig_inv(6) & crc_sig_inv(7);
     178 
     179  Inst_ucrc_par : ucrc_par
     180    generic map(
     181      POLYNOMIAL => CRC_POLYNOMIAL,
     182      INIT_VALUE => CRC_INIT_VALUE,
     183      DATA_WIDTH => 216,
     184      SYNC_RESET => 1
     185    )
     186    port map(
     187      clk_i   => main_clk,
     188      rst_i   => reset_crc_sig,
     189      clken_i => crc_enable_sig,
     190      data_i  => crc_input_sig,
     191      match_o => open,
     192      crc_o   => crc_sig_inv
     193    );
    149194 
    150195  Inst_FTU_rs485_receiver : FTU_rs485_receiver
     
    164209      block_valid            => block_valid_sig,
    165210      brd_add                => brd_add,
     211      crc_error_cnt          => crc_error_cnt_sig,
    166212      int_new_DACs           => int_new_DACs_sig,
    167213      int_new_enables        => int_new_enables_sig,
     
    200246    if Rising_edge(main_clk) then
    201247      case FTU_rs485_control_State is
     248
     249        when INIT =>
     250          reset_crc_sig <= '1';
     251          FTU_rs485_control_State <= RECEIVE;
    202252       
    203         when RECEIVE =>  -- default state, receiver on, no transmission         
     253        when RECEIVE =>  -- default state, receiver on, no transmission
     254          reset_crc_sig <= '0';
     255          crc_enable_sig <= '0';
    204256          tx_start_sig <= '0';
    205257          if (int_new_DACs_sig = '1') then
     
    304356          if (DACs_ready = '1') then
    305357            new_DACs <= '0';
    306             FTU_rs485_control_State <= SET_DAC_TRANSMIT;
     358            crc_enable_sig <= '1';
     359            crc_input_sig <= conv_std_logic_vector(crc_error_cnt_sig, 8)
     360                             & "00000000" & "00000000" & "00000000" & "00000000" & "00000000"
     361                             & "00000000" & "00000000" & "00000000" & "00000000" & "00000000"
     362                             & "00000000"
     363                             & conv_std_logic_vector(dac_array_rs485_in(7),16)(15 downto 8) & conv_std_logic_vector(dac_array_rs485_in(7),16)(7 downto 0)
     364                             & conv_std_logic_vector(dac_array_rs485_in(3),16)(15 downto 8) & conv_std_logic_vector(dac_array_rs485_in(3),16)(7 downto 0)
     365                             & conv_std_logic_vector(dac_array_rs485_in(2),16)(15 downto 8) & conv_std_logic_vector(dac_array_rs485_in(2),16)(7 downto 0)
     366                             & conv_std_logic_vector(dac_array_rs485_in(1),16)(15 downto 8) & conv_std_logic_vector(dac_array_rs485_in(1),16)(7 downto 0)
     367                             & conv_std_logic_vector(dac_array_rs485_in(0),16)(15 downto 8) & conv_std_logic_vector(dac_array_rs485_in(0),16)(7 downto 0) & "00000000"
     368                             & FIRMWARE_ID & "00" & brd_add & FTM_ADDRESS & RS485_START_DELIM;
     369            FTU_rs485_control_State <= SET_DAC_WAIT_2;
    307370          else
    308371            new_DACs <= '1';
     
    310373          end if;
    311374
     375        when SET_DAC_WAIT_2 =>
     376          crc_enable_sig <= '0';
     377          FTU_rs485_control_State <= SET_DAC_TRANSMIT;
     378         
    312379        when SET_ENABLE_WAIT =>  -- wait until FTU control says "done" and then answer to FTM
    313380          if (enables_ready = '1') then
    314381            new_enables <= '0';
    315             FTU_rs485_control_State <= SET_ENABLE_TRANSMIT;
     382            crc_enable_sig <= '1';
     383            crc_input_sig <= conv_std_logic_vector(crc_error_cnt_sig, 8)
     384                             & "00000000" & "00000000" & "00000000" & "00000000" & "00000000"
     385                             & "00000000" & "00000000" & "00000000" & "00000000" & "00000000"
     386                             & "00000000" & "00000000" & "00000000"
     387                             & enable_array_rs485_in(3)(15 downto 8) & enable_array_rs485_in(3)(7 downto 0)
     388                             & enable_array_rs485_in(2)(15 downto 8) & enable_array_rs485_in(2)(7 downto 0)
     389                             & enable_array_rs485_in(1)(15 downto 8) & enable_array_rs485_in(1)(7 downto 0)
     390                             & enable_array_rs485_in(0)(15 downto 8) & enable_array_rs485_in(0)(7 downto 0) & "00000011"
     391                             & FIRMWARE_ID & "00" & brd_add & FTM_ADDRESS & RS485_START_DELIM;
     392            FTU_rs485_control_State <= SET_ENABLE_WAIT_2;
    316393          else
    317394            new_enables <= '1';
     
    319396          end if;
    320397
     398        when SET_ENABLE_WAIT_2 =>
     399          crc_enable_sig <= '0';
     400          FTU_rs485_control_State <= SET_ENABLE_TRANSMIT;
     401         
    321402        when SET_PRESCALING_WAIT =>  -- wait until FTU control says "done" and then answer to FTM
    322403          if (prescaling_ready = '1') then
    323404            new_prescaling <= '0';
    324             FTU_rs485_control_State <= SET_PRESCALING_TRANSMIT;
     405            crc_enable_sig <= '1';
     406            crc_input_sig <= conv_std_logic_vector(crc_error_cnt_sig, 8)
     407                             & "00000000" & "00000000" & "00000000" & "00000000" & "00000000"
     408                             & "00000000" & "00000000" & "00000000" & "00000000" & "00000000"
     409                             & "00000000" & "00000000" & "00000000" & "00000000" & "00000000"
     410                             & "00000000" & "00000000" & "00000000" & "00000000"
     411                             & overflow_array_rs485_in & prescaling_rs485_in & "00000110"
     412                             & FIRMWARE_ID & "00" & brd_add & FTM_ADDRESS & RS485_START_DELIM;
     413            FTU_rs485_control_State <= SET_PRESCALING_WAIT_2;
    325414          else
    326415            new_prescaling <= '1';
     
    328417          end if;
    329418
     419        when SET_PRESCALING_WAIT_2 =>
     420          crc_enable_sig <= '0';
     421          FTU_rs485_control_State <= SET_PRESCALING_TRANSMIT;
     422         
    330423        when READ_RATES_WAIT =>  -- wait until FTU control says "done" and then answer to FTM
    331424          if (rates_ready = '1') then
    332425            read_rates <= '0';
    333             FTU_rs485_control_State <= READ_RATES_TRANSMIT;
     426            crc_enable_sig <= '1';
     427            crc_input_sig <= conv_std_logic_vector(crc_error_cnt_sig, 8)
     428                             & overflow_array_rs485_in
     429                             & conv_std_logic_vector(rate_array_rs485(4),32)(31 downto 24) & conv_std_logic_vector(rate_array_rs485(4),32)(23 downto 16)
     430                             & conv_std_logic_vector(rate_array_rs485(4),32)(15 downto 8) & conv_std_logic_vector(rate_array_rs485(4),32)(7 downto 0)
     431                             & conv_std_logic_vector(rate_array_rs485(3),32)(31 downto 24) & conv_std_logic_vector(rate_array_rs485(3),32)(23 downto 16)
     432                             & conv_std_logic_vector(rate_array_rs485(3),32)(15 downto 8) & conv_std_logic_vector(rate_array_rs485(3),32)(7 downto 0)
     433                             & conv_std_logic_vector(rate_array_rs485(2),32)(31 downto 24) & conv_std_logic_vector(rate_array_rs485(2),32)(23 downto 16)
     434                             & conv_std_logic_vector(rate_array_rs485(2),32)(15 downto 8) & conv_std_logic_vector(rate_array_rs485(2),32)(7 downto 0)
     435                             & conv_std_logic_vector(rate_array_rs485(1),32)(31 downto 24) & conv_std_logic_vector(rate_array_rs485(1),32)(23 downto 16)
     436                             & conv_std_logic_vector(rate_array_rs485(1),32)(15 downto 8) & conv_std_logic_vector(rate_array_rs485(1),32)(7 downto 0)
     437                             & conv_std_logic_vector(rate_array_rs485(0),32)(31 downto 24) & conv_std_logic_vector(rate_array_rs485(0),32)(23 downto 16)
     438                             & conv_std_logic_vector(rate_array_rs485(0),32)(15 downto 8) & conv_std_logic_vector(rate_array_rs485(0),32)(7 downto 0) & "00000010"
     439                             & FIRMWARE_ID & "00" & brd_add & FTM_ADDRESS & RS485_START_DELIM;
     440            FTU_rs485_control_State <= READ_RATES_WAIT_2;
    334441          else
    335442            read_rates <= '1';
     
    337444          end if;
    338445
     446        when READ_RATES_WAIT_2 =>
     447          crc_enable_sig <= '0';
     448          FTU_rs485_control_State <= READ_RATES_TRANSMIT;
     449         
    339450        when READ_DAC_WAIT =>  -- wait until FTU control says "done" and then answer to FTM
    340451          if (DACs_ready = '1') then
    341452            read_DACs <= '0';
    342             FTU_rs485_control_State <= READ_DAC_TRANSMIT;
     453            crc_enable_sig <= '1';
     454            crc_input_sig <= conv_std_logic_vector(crc_error_cnt_sig, 8)
     455                             & "00000000" & "00000000" & "00000000" & "00000000" & "00000000"
     456                             & "00000000" & "00000000" & "00000000" & "00000000" & "00000000"
     457                             & "00000000"
     458                             & conv_std_logic_vector(dac_array_rs485_in(7),16)(15 downto 8) & conv_std_logic_vector(dac_array_rs485_in(7),16)(7 downto 0)
     459                             & conv_std_logic_vector(dac_array_rs485_in(3),16)(15 downto 8) & conv_std_logic_vector(dac_array_rs485_in(3),16)(7 downto 0)
     460                             & conv_std_logic_vector(dac_array_rs485_in(2),16)(15 downto 8) & conv_std_logic_vector(dac_array_rs485_in(2),16)(7 downto 0)
     461                             & conv_std_logic_vector(dac_array_rs485_in(1),16)(15 downto 8) & conv_std_logic_vector(dac_array_rs485_in(1),16)(7 downto 0)
     462                             & conv_std_logic_vector(dac_array_rs485_in(0),16)(15 downto 8) & conv_std_logic_vector(dac_array_rs485_in(0),16)(7 downto 0) & "00000001"
     463                             & FIRMWARE_ID & "00" & brd_add & FTM_ADDRESS & RS485_START_DELIM;
     464            FTU_rs485_control_State <= READ_DAC_WAIT_2;
    343465          else
    344466            read_DACs <= '1';
     
    346468          end if;
    347469
     470        when READ_DAC_WAIT_2 =>
     471          crc_enable_sig <= '0';
     472          FTU_rs485_control_State <= READ_DAC_TRANSMIT;
     473         
    348474        when READ_ENABLE_WAIT =>  -- wait until FTU control says "done" and then answer to FTM
    349475          if (enables_ready = '1') then
    350476            read_enables <= '0';
    351             FTU_rs485_control_State <= READ_ENABLE_TRANSMIT;
     477            crc_enable_sig <= '1';
     478            crc_input_sig <= conv_std_logic_vector(crc_error_cnt_sig, 8)
     479                             & "00000000" & "00000000" & "00000000" & "00000000" & "00000000"
     480                             & "00000000" & "00000000" & "00000000" & "00000000" & "00000000"
     481                             & "00000000" & "00000000" & "00000000"
     482                             & enable_array_rs485_in(3)(15 downto 8) & enable_array_rs485_in(3)(7 downto 0)
     483                             & enable_array_rs485_in(2)(15 downto 8) & enable_array_rs485_in(2)(7 downto 0)
     484                             & enable_array_rs485_in(1)(15 downto 8) & enable_array_rs485_in(1)(7 downto 0)
     485                             & enable_array_rs485_in(0)(15 downto 8) & enable_array_rs485_in(0)(7 downto 0) & "00000100"
     486                             & FIRMWARE_ID & "00" & brd_add & FTM_ADDRESS & RS485_START_DELIM;
     487            FTU_rs485_control_State <= READ_ENABLE_WAIT_2;
    352488          else
    353489            read_enables <= '1';
     
    355491          end if;
    356492
     493        when READ_ENABLE_WAIT_2 =>
     494          crc_enable_sig <= '0';
     495          FTU_rs485_control_State <= READ_ENABLE_TRANSMIT;
     496         
    357497        when READ_PRESCALING_WAIT =>  -- wait until FTU control says "done" and then answer to FTM
    358498          if (prescaling_ready = '1') then
    359499            read_prescaling <= '0';
    360             FTU_rs485_control_State <= READ_PRESCALING_TRANSMIT;
     500            crc_enable_sig <= '1';
     501            crc_input_sig <= conv_std_logic_vector(crc_error_cnt_sig, 8)
     502                             & "00000000" & "00000000" & "00000000" & "00000000" & "00000000"
     503                             & "00000000" & "00000000" & "00000000" & "00000000" & "00000000"
     504                             & "00000000" & "00000000" & "00000000" & "00000000" & "00000000"
     505                             & "00000000" & "00000000" & "00000000" & "00000000"
     506                             & overflow_array_rs485_in & prescaling_rs485_in & "00000111"
     507                             & FIRMWARE_ID & "00" & brd_add & FTM_ADDRESS & RS485_START_DELIM;
     508            FTU_rs485_control_State <= READ_PRESCALING_WAIT_2;
    361509          else
    362510            read_prescaling <= '1';
     
    364512          end if;
    365513
     514        when READ_PRESCALING_WAIT_2 =>
     515          crc_enable_sig <= '0';
     516          FTU_rs485_control_State <= READ_PRESCALING_TRANSMIT;
     517         
    366518        when PING_PONG_WAIT =>  -- wait until FTU control says "done" and then answer to FTM
    367519          if (ping_pong_ready = '1') then
    368520            ping_pong <= '0';
    369             FTU_rs485_control_State <= PING_PONG_TRANSMIT;
     521            crc_enable_sig <= '1';
     522            crc_input_sig <= conv_std_logic_vector(crc_error_cnt_sig, 8)
     523                             & "00000000" & "00000000" & "00000000" & "00000000" & "00000000"
     524                             & "00000000" & "00000000" & "00000000" & "00000000" & "00000000"
     525                             & "00000000" & "00000000" & "00000000"
     526                             & dna(63 downto 0) & "00000101"
     527                             & FIRMWARE_ID & "00" & brd_add & FTM_ADDRESS & RS485_START_DELIM;
     528            FTU_rs485_control_State <= PING_PONG_WAIT_2;
    370529          else
    371530            ping_pong <= '1';
    372531            FTU_rs485_control_State <= PING_PONG_WAIT;
    373532          end if;
     533
     534        when PING_PONG_WAIT_2 =>
     535          crc_enable_sig <= '0';
     536          FTU_rs485_control_State <= PING_PONG_TRANSMIT;
    374537         
    375538        when SET_DAC_TRANSMIT =>
     
    457620            elsif txcnt = ((RS485_BLOCK_WIDTH / 8) - 2) then        -- CRC error counter
    458621              txcnt <= txcnt + 1;
    459               tx_data_sig <= "00000000";  -- NOT YET IMPLEMENTED!!!
    460               tx_start_sig <= '1';
    461               FTU_rs485_control_State <= READ_RATES_TRANSMIT;
     622              tx_data_sig <= conv_std_logic_vector(crc_error_cnt_sig, 8);
     623              tx_start_sig <= '1';
     624              FTU_rs485_control_State <= SET_DAC_TRANSMIT;
    462625            elsif txcnt = ((RS485_BLOCK_WIDTH / 8) - 1) then        -- check sum
    463626              txcnt <= txcnt + 1;
    464               tx_data_sig <= "00000000";  -- NOT YET IMPLEMENTED!!!
     627              tx_data_sig <= crc_sig;
    465628              tx_start_sig <= '1';
    466629              FTU_rs485_control_State <= SET_DAC_TRANSMIT;             
    467630            else                        -- transmission finished
    468631              txcnt <= 0;
     632              reset_crc_sig <= '1';
    469633              FTU_rs485_control_State <= RECEIVE;
    470634            end if;
     
    548712            elsif txcnt = ((RS485_BLOCK_WIDTH / 8) - 2) then        -- CRC error counter
    549713              txcnt <= txcnt + 1;
    550               tx_data_sig <= "00000000";  -- NOT YET IMPLEMENTED!!!
     714              tx_data_sig <= conv_std_logic_vector(crc_error_cnt_sig, 8);
    551715              tx_start_sig <= '1';
    552716              FTU_rs485_control_State <= SET_ENABLE_TRANSMIT;
    553717            elsif txcnt = ((RS485_BLOCK_WIDTH / 8) - 1) then        -- check sum
    554718              txcnt <= txcnt + 1;
    555               tx_data_sig <= "00000000";  -- NOT YET IMPLEMENTED!!!
     719              tx_data_sig <= crc_sig;
    556720              tx_start_sig <= '1';
    557721              FTU_rs485_control_State <= SET_ENABLE_TRANSMIT;       
    558722            else                        -- transmission finished
    559723              txcnt <= 0;
     724              reset_crc_sig <= '1';
    560725              FTU_rs485_control_State <= RECEIVE;
    561726            end if;
     
    604769            elsif txcnt = ((RS485_BLOCK_WIDTH / 8) - 2) then        -- CRC error counter
    605770              txcnt <= txcnt + 1;
    606               tx_data_sig <= "00000000";  -- NOT YET IMPLEMENTED!!!
     771              tx_data_sig <= conv_std_logic_vector(crc_error_cnt_sig, 8);
    607772              tx_start_sig <= '1';
    608773              FTU_rs485_control_State <= SET_PRESCALING_TRANSMIT;
    609774            elsif txcnt = ((RS485_BLOCK_WIDTH / 8) - 1) then        -- check sum
    610775              txcnt <= txcnt + 1;
    611               tx_data_sig <= "00000000";  -- NOT YET IMPLEMENTED!!!
     776              tx_data_sig <= crc_sig;
    612777              tx_start_sig <= '1';
    613778              FTU_rs485_control_State <= SET_PRESCALING_TRANSMIT;
    614779            else                        -- transmission finished
    615780              txcnt <= 0;
     781              reset_crc_sig <= '1';
    616782              FTU_rs485_control_State <= RECEIVE;
    617783            end if;
     
    755921            elsif txcnt = ((RS485_BLOCK_WIDTH / 8) - 2) then        -- CRC error counter
    756922              txcnt <= txcnt + 1;
    757               tx_data_sig <= "00000000";  -- NOT YET IMPLEMENTED!!!
     923              tx_data_sig <= conv_std_logic_vector(crc_error_cnt_sig, 8);
    758924              tx_start_sig <= '1';
    759925              FTU_rs485_control_State <= READ_RATES_TRANSMIT;
    760926            elsif txcnt = ((RS485_BLOCK_WIDTH / 8) - 1) then        -- check sum
    761927              txcnt <= txcnt + 1;
    762               tx_data_sig <= "00000000";  -- NOT YET IMPLEMENTED!!!
     928              tx_data_sig <= crc_sig;
    763929              tx_start_sig <= '1';
    764930              FTU_rs485_control_State <= READ_RATES_TRANSMIT;
    765931            else                        -- transmission finished
    766932              txcnt <= 0;
     933              reset_crc_sig <= '1';
    767934              FTU_rs485_control_State <= RECEIVE;
    768935            end if; 
     
    8561023            elsif txcnt = ((RS485_BLOCK_WIDTH / 8) - 2) then        -- CRC error counter
    8571024              txcnt <= txcnt + 1;
    858               tx_data_sig <= "00000000";  -- NOT YET IMPLEMENTED!!!
     1025              tx_data_sig <= conv_std_logic_vector(crc_error_cnt_sig, 8);
    8591026              tx_start_sig <= '1';
    8601027              FTU_rs485_control_State <= READ_DAC_TRANSMIT;
    8611028            elsif txcnt = ((RS485_BLOCK_WIDTH / 8) - 1) then        -- check sum
    8621029              txcnt <= txcnt + 1;
    863               tx_data_sig <= "00000000";  -- NOT YET IMPLEMENTED!!!
     1030              tx_data_sig <= crc_sig;
    8641031              tx_start_sig <= '1';
    8651032              FTU_rs485_control_State <= READ_DAC_TRANSMIT;             
    8661033            else                        -- transmission finished
    8671034              txcnt <= 0;
     1035              reset_crc_sig <= '1';
    8681036              FTU_rs485_control_State <= RECEIVE;
    8691037            end if; 
     
    9471115            elsif txcnt = ((RS485_BLOCK_WIDTH / 8) - 2) then        -- CRC error counter
    9481116              txcnt <= txcnt + 1;
    949               tx_data_sig <= "00000000";  -- NOT YET IMPLEMENTED!!!
     1117              tx_data_sig <= conv_std_logic_vector(crc_error_cnt_sig, 8);
    9501118              tx_start_sig <= '1';
    9511119              FTU_rs485_control_State <= READ_ENABLE_TRANSMIT;
    9521120            elsif txcnt = ((RS485_BLOCK_WIDTH / 8) - 1) then        -- check sum
    9531121              txcnt <= txcnt + 1;
    954               tx_data_sig <= "00000000";  -- NOT YET IMPLEMENTED!!!
     1122              tx_data_sig <= crc_sig;
    9551123              tx_start_sig <= '1';
    9561124              FTU_rs485_control_State <= READ_ENABLE_TRANSMIT;   
    9571125            else                        -- transmission finished
    9581126              txcnt <= 0;
     1127              reset_crc_sig <= '1';
    9591128              FTU_rs485_control_State <= RECEIVE;
    9601129            end if; 
     
    10081177            elsif txcnt = ((RS485_BLOCK_WIDTH / 8) - 2) then        -- CRC error counter
    10091178              txcnt <= txcnt + 1;
    1010               tx_data_sig <= "00000000";  -- NOT YET IMPLEMENTED!!!
     1179              tx_data_sig <= conv_std_logic_vector(crc_error_cnt_sig, 8);
    10111180              tx_start_sig <= '1';
    10121181              FTU_rs485_control_State <= READ_PRESCALING_TRANSMIT;
    10131182            elsif txcnt = ((RS485_BLOCK_WIDTH / 8) - 1) then        -- check sum
    10141183              txcnt <= txcnt + 1;
    1015               tx_data_sig <= "00000000";  -- NOT YET IMPLEMENTED!!!
     1184              tx_data_sig <= crc_sig;
    10161185              tx_start_sig <= '1';
    10171186              FTU_rs485_control_State <= READ_PRESCALING_TRANSMIT;
    10181187            else                        -- transmission finished
    10191188              txcnt <= 0;
     1189              reset_crc_sig <= '1';
    10201190              FTU_rs485_control_State <= RECEIVE;
    10211191            end if; 
     
    10261196
    10271197        when PING_PONG_TRANSMIT =>
     1198          crc_enable_sig <= '0';
    10281199          if tx_busy_sig = '0' then
    10291200            if txcnt = 0 then           -- start delimiter
     
    10991270            elsif txcnt = ((RS485_BLOCK_WIDTH / 8) - 2) then        -- CRC error counter
    11001271              txcnt <= txcnt + 1;
    1101               tx_data_sig <= "00000000";  -- NOT YET IMPLEMENTED!!!
     1272              tx_data_sig <= conv_std_logic_vector(crc_error_cnt_sig, 8);
    11021273              tx_start_sig <= '1';
    11031274              FTU_rs485_control_State <= PING_PONG_TRANSMIT;
    11041275            elsif txcnt = ((RS485_BLOCK_WIDTH / 8) - 1) then        -- check sum
    11051276              txcnt <= txcnt + 1;
    1106               tx_data_sig <= "00000000";  -- NOT YET IMPLEMENTED!!!
     1277              tx_data_sig <= crc_sig;
    11071278              tx_start_sig <= '1';
    11081279              FTU_rs485_control_State <= PING_PONG_TRANSMIT;
    11091280            else                        -- transmission finished
    11101281              txcnt <= 0;
     1282              reset_crc_sig <= '1';
    11111283              FTU_rs485_control_State <= RECEIVE;
    11121284            end if; 
  • firmware/FTU/rs485/FTU_rs485_interpreter.vhd

    r10047 r10050  
    3939    block_valid            : IN  std_logic;
    4040    brd_add                : IN  std_logic_vector(5 downto 0);
     41    crc_error_cnt          : OUT integer range 0 to 255 := 0;
    4142    int_new_DACs           : OUT std_logic := '0';
    4243    int_new_enables        : OUT std_logic := '0';
     
    5657
    5758  signal block_valid_sr : std_logic_vector(3 downto 0) := (others => '0');
     59  signal reset_crc_sig  : std_logic := '0';
     60  signal crc_enable_sig : std_logic := '0';
     61  signal crc_match_sig  : std_logic := '0';
     62  signal data_block_sig : std_logic_vector(RS485_BLOCK_WIDTH - 1 downto 0) := (others => '0');
     63  signal crc_error_cntr : integer range 0 to 255 := 0;
    5864
    5965  signal dac_array_rs485_out_sig    : dac_array_type    := DEFAULT_DAC;
     
    6167  signal prescaling_rs485_out_sig   : STD_LOGIC_VECTOR(7 downto 0) := conv_std_logic_vector(DEFAULT_PRESCALING,8);
    6268 
    63   type FTU_rs485_interpreter_StateType is (WAIT_FOR_DATA, CHECK_HEADER, DECODE);
     69  type FTU_rs485_interpreter_StateType is (INIT, WAIT_FOR_DATA, WAIT_CRC, CHECK_CRC, CHECK_HEADER, DECODE);
    6470  signal FTU_rs485_interpreter_State : FTU_rs485_interpreter_StateType;
     71
     72  component ucrc_par
     73    generic(
     74      POLYNOMIAL : std_logic_vector;
     75      INIT_VALUE : std_logic_vector;
     76      DATA_WIDTH : integer range 2 to 256;
     77      SYNC_RESET : integer range 0 to 1
     78    );
     79    port(
     80      clk_i   : in  std_logic;
     81      rst_i   : in  std_logic;
     82      clken_i : in  std_logic;
     83      data_i  : in  std_logic_vector(DATA_WIDTH - 1 downto 0);
     84      match_o : out std_logic;
     85      crc_o   : out std_logic_vector(POLYNOMIAL'length - 1 downto 0)
     86    );
     87  end component;
    6588 
    6689begin
    6790
     91  Inst_ucrc_par : ucrc_par
     92    generic map(
     93      POLYNOMIAL => CRC_POLYNOMIAL,
     94      INIT_VALUE => CRC_INIT_VALUE,
     95      DATA_WIDTH => 224,
     96      SYNC_RESET => 1
     97    )
     98    port map(
     99      clk_i   => clk,
     100      rst_i   => reset_crc_sig,
     101      clken_i => crc_enable_sig,
     102      data_i  => data_block_sig,
     103      match_o => crc_match_sig,
     104      crc_o   => open
     105    );
     106 
    68107  FTU_rs485_interpreter_FSM: process (clk)
    69108  begin
    70109    if Rising_edge(clk) then
    71110      case FTU_rs485_interpreter_State is
     111
     112        when INIT =>
     113          reset_crc_sig <= '1';
     114          FTU_rs485_interpreter_State <= WAIT_FOR_DATA;
    72115       
    73         when WAIT_FOR_DATA => -- default state, waiting for valid 16-byte block
     116        when WAIT_FOR_DATA => -- default state, waiting for valid 28-byte block
    74117          block_valid_sr <= block_valid_sr(2 downto 0) & block_valid;
    75118          int_new_DACs        <= '0';
     
    82125          int_ping_pong       <= '0';
    83126          if (block_valid_sr(3 downto 2) = "01") then  -- rising edge of valid signal
     127            crc_enable_sig <= '1';
     128            data_block_sig <= data_block;
     129            FTU_rs485_interpreter_State <= WAIT_CRC;
     130          else
     131            crc_enable_sig <= '0';
     132            FTU_rs485_interpreter_State <= WAIT_FOR_DATA;
     133          end if;
     134          reset_crc_sig <= '0';
     135
     136        when WAIT_CRC =>
     137          crc_enable_sig <= '0';
     138          FTU_rs485_interpreter_State <= CHECK_CRC;
     139         
     140        when CHECK_CRC =>
     141          reset_crc_sig  <= '1';
     142          if (crc_match_sig = '1') then
    84143            FTU_rs485_interpreter_State <= CHECK_HEADER;
     144            crc_error_cnt <= crc_error_cntr;
     145            crc_error_cntr <= 0;
    85146          else
    86             FTU_rs485_interpreter_State <= WAIT_FOR_DATA;
    87           end if;
    88 
     147            if crc_error_cntr < 255 then
     148              crc_error_cntr <= crc_error_cntr + 1;
     149            end if;
     150            FTU_rs485_interpreter_State <= WAIT_FOR_DATA;
     151          end if;
     152         
    89153        when CHECK_HEADER => -- check start delimiter and addresses
    90154          int_new_DACs        <= '0';
     
    103167            FTU_rs485_interpreter_State <= WAIT_FOR_DATA;
    104168          end if;
    105 
     169          reset_crc_sig <= '0';
     170         
    106171        when DECODE => -- decode instruction
    107172          if(data_block(39 downto 32) = "00000000") then -- set DACs
Note: See TracChangeset for help on using the changeset viewer.