Changeset 10009 for firmware


Ignore:
Timestamp:
Oct 18, 2010, 12:37:44 PM (9 years ago)
Author:
weitzel
Message:
DNA identifier added and RS485 debugged
Location:
firmware/FTU
Files:
2 added
7 edited

Legend:

Unmodified
Added
Removed
  • firmware/FTU/FTU_control.vhd

    r9939 r10009  
    5151    read_enables            : IN  std_logic;   -- from RS485 module
    5252    read_prescaling         : IN  std_logic;   -- from RS485 module
     53    ping_pong               : IN  std_logic;   -- from RS485 module
    5354    dac_array_rs485_out     : IN  dac_array_type;                -- from RS485 module
    5455    enable_array_rs485_out  : IN  enable_array_type;             -- from RS485 module
    5556    prescaling_rs485_out    : IN  STD_LOGIC_VECTOR(7 downto 0);  -- from RS485 module
     57    dna_ready               : IN  std_logic;  -- from FTU_dna_gen
    5658    reset                   : OUT std_logic;
    5759    config_start            : OUT std_logic;
     
    7072    enables_ready           : OUT std_logic := '0';   -- to RS485 module
    7173    prescaling_ready        : OUT std_logic := '0';   -- to RS485 module
     74    ping_pong_ready         : OUT std_logic := '0';   -- to RS485 module
    7275    dac_array               : OUT dac_array_type;
    7376    enable_array            : OUT enable_array_type;
    7477    cntr_reset              : OUT STD_LOGIC;
    75     prescaling              : OUT STD_LOGIC_VECTOR(7 downto 0)
     78    prescaling              : OUT STD_LOGIC_VECTOR(7 downto 0);
     79    dna_start               : OUT std_logic := '0'  -- to FTU_dna_gen
    7680  );
    7781end FTU_control;
     
    113117
    114118  signal new_rates_sig  : STD_LOGIC := '0';
    115   signal new_rates_busy : STD_LOGIC := '0';
     119  signal new_rates_busy : STD_LOGIC := '1';  -- veto the writing of new rates until in RUNNING
    116120 
    117121  signal new_DACs_in_RAM       : STD_LOGIC := '0';
     
    119123  signal new_prescaling_in_RAM : STD_LOGIC := '0';
    120124
    121   type FTU_control_StateType is (IDLE, INIT, RUNNING,
    122                                  CONFIG_ENABLE, CONFIG_DAC, CONFIG_COUNTER,
     125  type FTU_control_StateType is (IDLE, INIT_RAM, INIT_DNA, RUNNING,
     126                                 CONFIG_ENABLE, CONFIG_DAC, CONFIG_DAC_WAIT, CONFIG_COUNTER,
    123127                                 WRITE_RATES, WRITE_DAC, WRITE_ENABLE, WRITE_PRESCALING,
    124                                  READOUT_RATES, READOUT_DAC, READOUT_ENABLE, READOUT_PRESCALING);
     128                                 READOUT_RATES, READOUT_DAC, READOUT_ENABLE, READOUT_PRESCALING,
     129                                 DO_PING_PONG);
    125130  signal FTU_control_State : FTU_control_StateType;
    126131 
     
    140145
    141146        when IDLE =>  -- wait for DCMs to lock
    142           config_start_sig <= '0';
    143           ram_ena_sig <= '0';
    144           ram_wea_sig <= "0";
    145147          if (clk_ready = '1') then
    146             FTU_control_State <= INIT;
     148            FTU_control_State <= INIT_DNA;
    147149          else
    148150            FTU_control_State <= IDLE;
    149151          end if;
    150          
    151         when INIT =>  -- load default config data to RAM, see also ftu_definitions.vhd for more info
    152           new_rates_busy <= '1';
    153           config_start_sig <= '0';
     152
     153        when INIT_DNA =>  -- determine FPGA DNA
     154          if (dna_ready = '1') then
     155            FTU_control_State <= INIT_RAM;
     156            dna_start <= '0';
     157          else
     158            dna_start <= '1';
     159            FTU_control_State <= INIT_DNA;
     160          end if;
     161                         
     162        when INIT_RAM =>  -- load default config data to RAM, see also ftu_definitions.vhd for more info
    154163          ram_ena_sig <= '1';
    155164          ram_wea_sig <= "1";
     
    162171              ram_dia_sig <= DEFAULT_ENABLE(ram_ada_cntr / 2)(15 downto 8);
    163172            end if;
    164             FTU_control_State <= INIT;
     173            FTU_control_State <= INIT_RAM;
    165174          elsif (ram_ada_cntr < (NO_OF_ENABLE*RAM_ADDR_RATIO + NO_OF_COUNTER*RAM_ADDR_RATIO)) then  -- default counter values
    166175            ram_dia_sig <= (others => '0');
    167             FTU_control_State <= INIT;
     176            FTU_control_State <= INIT_RAM;
    168177          elsif (ram_ada_cntr < (NO_OF_ENABLE*RAM_ADDR_RATIO + NO_OF_COUNTER*RAM_ADDR_RATIO + (NO_OF_DAC - NO_OF_DAC_NOT_USED)*RAM_ADDR_RATIO)) then  -- default DACs
    169178            if (ram_ada_cntr < (NO_OF_ENABLE*RAM_ADDR_RATIO + NO_OF_COUNTER*RAM_ADDR_RATIO + (NO_OF_DAC - NO_OF_DAC_NOT_USED - 1)*RAM_ADDR_RATIO)) then
     
    180189              end if;
    181190            end if;
    182             FTU_control_State <= INIT;
     191            FTU_control_State <= INIT_RAM;
    183192          elsif (ram_ada_cntr = (NO_OF_ENABLE*RAM_ADDR_RATIO + NO_OF_COUNTER*RAM_ADDR_RATIO + (NO_OF_DAC - NO_OF_DAC_NOT_USED)*RAM_ADDR_RATIO)) then  -- default prescaling
    184193            ram_dia_sig <= conv_std_logic_vector(DEFAULT_PRESCALING,8);
    185             FTU_control_State <= INIT;
     194            FTU_control_State <= INIT_RAM;
    186195          elsif (ram_ada_cntr = (NO_OF_ENABLE*RAM_ADDR_RATIO + NO_OF_COUNTER*RAM_ADDR_RATIO + (NO_OF_DAC - NO_OF_DAC_NOT_USED)*RAM_ADDR_RATIO) + 1) then  -- default overflow register
    187196            ram_dia_sig <= (others => '0');
    188             FTU_control_State <= INIT;
     197            FTU_control_State <= INIT_RAM;
    189198          elsif (ram_ada_cntr = (NO_OF_ENABLE*RAM_ADDR_RATIO + NO_OF_COUNTER*RAM_ADDR_RATIO + (NO_OF_DAC - NO_OF_DAC_NOT_USED)*RAM_ADDR_RATIO) + 2) then  -- default checksum
    190199            ram_dia_sig <= (others => '0');
    191             FTU_control_State <= INIT;
     200            FTU_control_State <= INIT_RAM;
    192201          elsif (ram_ada_cntr = (NO_OF_ENABLE*RAM_ADDR_RATIO + NO_OF_COUNTER*RAM_ADDR_RATIO + (NO_OF_DAC - NO_OF_DAC_NOT_USED)*RAM_ADDR_RATIO) + 3) then  -- empty RAM cell
    193202            ram_dia_sig <= (others => '0');
    194             FTU_control_State <= INIT;
     203            FTU_control_State <= INIT_RAM;
    195204          else
    196205            ram_dia_sig <= (others => '0');
     
    252261                ram_ada_sig <= conv_std_logic_vector((NO_OF_ENABLE*RAM_ADDR_RATIO + NO_OF_COUNTER*RAM_ADDR_RATIO + (NO_OF_DAC - NO_OF_DAC_NOT_USED)*RAM_ADDR_RATIO), RAM_ADDR_WIDTH_A);
    253262                FTU_control_State <= READOUT_PRESCALING;
     263              elsif (new_DACs = '0' and new_enables = '0' and new_prescaling = '0' and
     264                   read_rates = '0' and read_DACs = '0' and read_enables = '0' and read_prescaling = '0' and
     265                   ping_pong = '1') then
     266                FTU_control_State <= DO_PING_PONG;               
    254267              else               
    255268                FTU_control_State <= RUNNING;  --no commands from RS485 -> stay running
     
    302315        when CONFIG_DAC =>
    303316          new_rates_busy <= '1';
    304           if (ram_dac_cntr <= (NO_OF_DAC - NO_OF_DAC_NOT_USED + 2)) then           
    305             ram_dac_cntr <= ram_dac_cntr + 1;
    306             if (ram_dac_cntr = 0) then
    307               FTU_control_State <= CONFIG_DAC;
    308               ram_adb_sig <= conv_std_logic_vector((NO_OF_ENABLE + NO_OF_COUNTER + ram_dac_cntr + 1), RAM_ADDR_WIDTH_B);
    309             elsif (ram_dac_cntr > 0 and ram_dac_cntr < (NO_OF_DAC - NO_OF_DAC_NOT_USED)) then
    310               dac_array_sig(ram_dac_cntr - 1) <= conv_integer(unsigned(ram_dob(11 downto 0)));
    311               ram_adb_sig <= conv_std_logic_vector((NO_OF_ENABLE + NO_OF_COUNTER + ram_dac_cntr + 1), RAM_ADDR_WIDTH_B);
    312               FTU_control_State <= CONFIG_DAC;
    313             elsif (ram_dac_cntr > 0 and ram_dac_cntr < (NO_OF_DAC - NO_OF_DAC_NOT_USED + 1)) then
    314               dac_array_sig(ram_dac_cntr - 1 + NO_OF_DAC_NOT_USED) <= conv_integer(unsigned(ram_dob(11 downto 0)));
    315               ram_adb_sig <= (others => '0');
    316               FTU_control_State <= CONFIG_DAC;
    317               DACs_ready <= '1';
    318             else
    319               ram_adb_sig <= (others => '0');
    320               config_start_sig <= '1';
    321               DACs_ready <= '0';
    322               FTU_control_State <= CONFIG_DAC;
    323             end if;
    324           else
    325             if (config_ready = '1') then
    326               ram_dac_cntr <= 0;
    327               new_DACs_in_RAM <= '0';
    328               cntr_reset_sig <= '1';
    329               new_rates_busy <= '0';
    330               FTU_control_State <= RUNNING;
    331             elsif (config_ready = '0' and config_started = '1') then
    332               ram_enb_sig <= '0';
    333               config_start_sig <= '0';
    334               FTU_control_State <= CONFIG_DAC;
    335             else
    336               FTU_control_State <= CONFIG_DAC;
    337             end if;
    338           end if;
    339 
     317          ram_dac_cntr <= ram_dac_cntr + 1;
     318          if (ram_dac_cntr = 0) then
     319            ram_adb_sig <= conv_std_logic_vector((NO_OF_ENABLE + NO_OF_COUNTER + ram_dac_cntr + 1), RAM_ADDR_WIDTH_B);
     320            FTU_control_State <= CONFIG_DAC;
     321          elsif (ram_dac_cntr < (NO_OF_DAC - NO_OF_DAC_NOT_USED)) then
     322            dac_array_sig(ram_dac_cntr - 1) <= conv_integer(unsigned(ram_dob(11 downto 0)));
     323            ram_adb_sig <= conv_std_logic_vector((NO_OF_ENABLE + NO_OF_COUNTER + ram_dac_cntr + 1), RAM_ADDR_WIDTH_B);
     324            FTU_control_State <= CONFIG_DAC;
     325          elsif (ram_dac_cntr < (NO_OF_DAC - NO_OF_DAC_NOT_USED + 1)) then
     326            dac_array_sig(ram_dac_cntr - 1 + NO_OF_DAC_NOT_USED) <= conv_integer(unsigned(ram_dob(11 downto 0)));
     327            ram_adb_sig <= (others => '0');
     328            FTU_control_State <= CONFIG_DAC;
     329            DACs_ready <= '1';
     330          else
     331            ram_adb_sig <= (others => '0');
     332            ram_enb_sig <= '0';
     333            config_start_sig <= '1';
     334            ram_dac_cntr <= 0;
     335            DACs_ready <= '0';
     336            FTU_control_State <= CONFIG_DAC_WAIT;
     337          end if;
     338         
     339        when CONFIG_DAC_WAIT =>
     340          if (config_ready = '1') then
     341            new_DACs_in_RAM <= '0';
     342            cntr_reset_sig <= '1';
     343            new_rates_busy <= '0';
     344            config_start_sig <= '0';
     345            FTU_control_State <= RUNNING;
     346          elsif (config_ready = '0' and config_started = '1') then
     347            new_rates_busy <= '1';
     348            config_start_sig <= '0';
     349            FTU_control_State <= CONFIG_DAC_WAIT;
     350          else
     351            new_rates_busy <= '1';
     352            config_start_sig <= '1';
     353            FTU_control_State <= CONFIG_DAC_WAIT;
     354          end if;
     355         
    340356        when WRITE_RATES =>  -- write trigger/patch rates to RAM B and overflow register to RAM A
    341357          new_rates_busy <= '1';
     
    535551            FTU_control_State <= RUNNING;
    536552          end if;
    537  
     553
     554        when DO_PING_PONG =>  -- just answer to FTM
     555          wait_cntr <= wait_cntr + 1;
     556          if (wait_cntr = 0) then
     557            ping_pong_ready <= '1';
     558            FTU_control_State <= DO_PING_PONG;
     559          else
     560            ping_pong_ready <= '0';
     561            wait_cntr <= 0;
     562            FTU_control_State <= RUNNING;
     563          end if;
     564           
    538565      end case;
    539566    end if;
  • firmware/FTU/FTU_top.vhd

    r9939 r10009  
    3939    ext_clk   : IN  STD_LOGIC;                      -- external clock from FTU board
    4040    brd_add   : IN  STD_LOGIC_VECTOR(5 downto 0);   -- geographic board/slot address
    41     brd_id    : IN  STD_LOGIC_VECTOR(7 downto 0);   -- local solder-programmable board ID
     41    --brd_id    : IN  STD_LOGIC_VECTOR(7 downto 0);   -- local solder-programmable board ID
    4242   
    4343    -- rate counters LVDS inputs
     
    7373
    7474    -- testpoints
    75     TP_A        : OUT STD_LOGIC_VECTOR(11 downto 0)   -- testpoints   
     75    TP_A        : OUT STD_LOGIC_VECTOR(11 downto 0)   -- testpoints
    7676  );
    7777end FTU_top;
     
    131131  signal read_enables_sig           : std_logic;
    132132  signal read_prescaling_sig        : std_logic;
     133  signal ping_pong_sig              : std_logic;
    133134  signal dac_array_rs485_out_sig    : dac_array_type;
    134135  signal enable_array_rs485_out_sig : enable_array_type;
     
    136137
    137138  --signals to RS485 module, all initialized in FTU_control
    138   signal rates_ready_sig             : std_logic;
    139   signal DACs_ready_sig              : std_logic;
    140   signal enables_ready_sig           : std_logic;
    141   signal prescaling_ready_sig        : std_logic; 
     139  signal rates_ready_sig             : std_logic;
     140  signal DACs_ready_sig              : std_logic;
     141  signal enables_ready_sig           : std_logic;
     142  signal prescaling_ready_sig        : std_logic;
     143  signal ping_pong_ready_sig         : std_logic;
    142144  signal rate_array_rs485_sig        : rate_array_type;
    143145  signal overflow_array_rs485_in_sig : STD_LOGIC_VECTOR(7 downto 0);
     146
     147  --signals for FPGA DNA identifier
     148  signal dna_sig : STD_LOGIC_VECTOR(63 downto 0);  -- initialized in FTU_dna_gen
     149  signal dna_start_sig : STD_LOGIC;  -- initialized in FTU_control
     150  signal dna_ready_sig : STD_LOGIC;  -- initialized in FTU_dna_gen
    144151 
    145152  component FTU_clk_gen
     
    182189      read_enables            : IN  std_logic;
    183190      read_prescaling         : IN  std_logic;
     191      ping_pong               : IN  std_logic;
    184192      dac_array_rs485_out     : IN  dac_array_type;
    185193      enable_array_rs485_out  : IN  enable_array_type;
    186194      prescaling_rs485_out    : IN  STD_LOGIC_VECTOR(7 downto 0);
     195      dna_ready               : IN  std_logic;
    187196      reset                   : OUT std_logic;
    188197      config_start            : OUT std_logic;
     
    200209      DACs_ready              : OUT std_logic;
    201210      enables_ready           : OUT std_logic;
    202       prescaling_ready        : OUT std_logic; 
     211      prescaling_ready        : OUT std_logic;
     212      ping_pong_ready         : OUT std_logic;
    203213      dac_array               : OUT dac_array_type;
    204214      enable_array            : OUT enable_array_type;
    205215      cntr_reset              : OUT STD_LOGIC;
    206       prescaling              : OUT STD_LOGIC_VECTOR(7 downto 0)
     216      prescaling              : OUT STD_LOGIC_VECTOR(7 downto 0);
     217      dna_start               : OUT std_logic
    207218    );
    208219  end component;
     
    229240      DACs_ready              : IN  std_logic;
    230241      enables_ready           : IN  std_logic;
    231       prescaling_ready        : IN  std_logic; 
     242      prescaling_ready        : IN  std_logic;
     243      ping_pong_ready         : IN  std_logic;
    232244      rate_array_rs485        : IN  rate_array_type;
    233245      overflow_array_rs485_in : IN  STD_LOGIC_VECTOR(7 downto 0);
     
    235247      enable_array_rs485_in   : IN  enable_array_type;
    236248      prescaling_rs485_in     : IN  STD_LOGIC_VECTOR(7 downto 0);
     249      dna                     : IN  STD_LOGIC_VECTOR(63 downto 0);
    237250      rx_en                   : OUT std_logic;
    238251      tx_d                    : OUT std_logic;
     
    245258      read_enables            : OUT std_logic;
    246259      read_prescaling         : OUT std_logic;
     260      ping_pong               : OUT std_logic;
    247261      dac_array_rs485_out     : OUT dac_array_type;
    248262      enable_array_rs485_out  : OUT enable_array_type;
     
    250264    );
    251265  end component;
    252    
     266
     267  component FTU_dna_gen
     268    port(
     269      clk   : IN  STD_LOGIC;
     270      start : IN  STD_LOGIC;
     271      dna   : OUT STD_LOGIC_VECTOR(63 downto 0);
     272      ready : OUT STD_LOGIC
     273    );
     274  end component;
     275 
    253276  component FTU_dual_port_ram
    254277    port(
     
    413436      read_enables            => read_enables_sig,
    414437      read_prescaling         => read_prescaling_sig,
     438      ping_pong               => ping_pong_sig,
    415439      dac_array_rs485_out     => dac_array_rs485_out_sig, 
    416440      enable_array_rs485_out  => enable_array_rs485_out_sig,
    417       prescaling_rs485_out    => prescaling_rs485_out_sig, 
     441      prescaling_rs485_out    => prescaling_rs485_out_sig,
     442      dna_ready               => dna_ready_sig,
    418443      reset                   => reset_sig,
    419444      config_start            => config_start_sig,
     
    432457      enables_ready           => enables_ready_sig,
    433458      prescaling_ready        => prescaling_ready_sig,
     459      ping_pong_ready         => ping_pong_ready_sig,
    434460      dac_array               => dac_array_sig,
    435461      enable_array            => enable_array_sig,
    436462      cntr_reset              => cntr_reset_sig,
    437       prescaling              => prescaling_sig
     463      prescaling              => prescaling_sig,
     464      dna_start               => dna_start_sig
    438465    );
    439466 
     
    459486      enables_ready           => enables_ready_sig,
    460487      prescaling_ready        => prescaling_ready_sig,
     488      ping_pong_ready         => ping_pong_ready_sig,
    461489      rate_array_rs485        => rate_array_rs485_sig,
    462490      overflow_array_rs485_in => overflow_array_rs485_in_sig,
     
    464492      enable_array_rs485_in   => enable_array_sig,
    465493      prescaling_rs485_in     => prescaling_sig,
     494      dna                     => dna_sig,
    466495      rx_en                   => rx_en,
    467496      tx_d                    => tx,
     
    474503      read_enables            => read_enables_sig,
    475504      read_prescaling         => read_prescaling_sig,
     505      ping_pong               => ping_pong_sig,
    476506      dac_array_rs485_out     => dac_array_rs485_out_sig,
    477507      enable_array_rs485_out  => enable_array_rs485_out_sig,
    478508      prescaling_rs485_out    => prescaling_rs485_out_sig
     509    );
     510
     511  Inst_FTU_dna_gen : FTU_dna_gen
     512    port map(
     513      clk   => clk_50M_sig,
     514      start => dna_start_sig,
     515      dna   => dna_sig,
     516      ready => dna_ready_sig
    479517    );
    480518 
     
    493531      dinb  => ram_dib_sig,
    494532      doutb => ram_dob_sig
    495     );
     533    ); 
    496534 
    497535end Behavioral;
  • firmware/FTU/FTU_top_tb.vhd

    r9939 r10009  
    4646      ext_clk   : IN  STD_LOGIC;                      -- external clock from FTU board
    4747      brd_add   : IN  STD_LOGIC_VECTOR(5 downto 0);   -- geographic board/slot address
    48       brd_id    : IN  STD_LOGIC_VECTOR(7 downto 0);   -- local solder-programmable board ID
     48      --brd_id    : IN  STD_LOGIC_VECTOR(7 downto 0);   -- local solder-programmable board ID
    4949     
    5050      -- rate counters LVDS inputs
     
    8787  signal ext_clk     : STD_LOGIC := '0';
    8888  signal brd_add     : STD_LOGIC_VECTOR(5 downto 0) := (others => '0');
    89   signal brd_id      : STD_LOGIC_VECTOR(7 downto 0) := (others => '0');
     89  --signal brd_id      : STD_LOGIC_VECTOR(7 downto 0) := (others => '0');
    9090  signal patch_A_p   : STD_LOGIC := '0';
    9191  signal patch_A_n   : STD_LOGIC := '0';
     
    123123  -- Clock period definitions
    124124  constant ext_clk_period : TIME := 20 ns;
    125   constant baud_rate_period : TIME := 10 us;
     125  constant baud_rate_period : TIME := 4 us;
    126126 
    127127begin
     
    132132      ext_clk     => ext_clk,
    133133      brd_add     => brd_add,
    134       brd_id      => brd_id,
     134      --brd_id      => brd_id,
    135135      patch_A_p   => patch_A_p,
    136136      patch_A_n   => patch_A_n,
     
    285285    ---------------------------------------------------------------------------
    286286    assign_rs485("01000000"); --start delimiter
    287     wait for 1us;
     287    wait for 0us;
    288288    assign_rs485("00000000"); --FTU address
    289     wait for 10ns;
     289    wait for 0ns;
    290290    assign_rs485("11000000"); --FTM address
    291     wait for 100ns;
    292     assign_rs485("00000000"); --instruction
    293     wait for 200us;
    294     assign_rs485("00010000"); --data byte 01
    295     wait for 100ns;
     291    wait for 0ns;
     292    assign_rs485("00000101"); --instruction
     293    wait for 0us;
     294    assign_rs485("00000001"); --data byte 01
     295    wait for 0ns;
    296296    assign_rs485("00000000"); --data byte 02
    297     wait for 100ns;
    298     assign_rs485("10111100"); --data byte 03
    299     wait for 100ns;
    300     assign_rs485("00000001"); --data byte 04
    301     wait for 100ns;
    302     assign_rs485("00000000"); --data byte 05
    303     wait for 100ns;
     297    wait for 0ns;
     298    assign_rs485("00000010"); --data byte 03
     299    wait for 0ns;
     300    assign_rs485("00000000"); --data byte 04
     301    wait for 0ns;
     302    assign_rs485("00000100"); --data byte 05
     303    wait for 0ns;
    304304    assign_rs485("00000000"); --data byte 06
    305     wait for 100ns;
    306     assign_rs485("00000000"); --data byte 07
    307     wait for 100ns;
     305    wait for 0ns;
     306    assign_rs485("00001000"); --data byte 07
     307    wait for 0ns;
    308308    assign_rs485("00000000"); --data byte 08
    309     wait for 100ns;
    310     assign_rs485("00000000"); --data byte 09
    311     wait for 100ns;
     309    wait for 0ns;
     310    assign_rs485("00010000"); --data byte 09
     311    wait for 0ns;
    312312    assign_rs485("00000000"); --data byte 10
    313     wait for 100ns;
     313    wait for 0ns;
    314314    assign_rs485("00000000"); --data byte 11
    315     wait for 100ns;
     315    wait for 0ns;
    316316    assign_rs485("00000000"); --check sum
    317     wait for 100ns;
    318     ---------------------------------------------------------------------------
    319     -- keep rx line high
    320     ---------------------------------------------------------------------------
    321     rx <= '1';
     317    ---------------------------------------------------------------------------
     318    -- wait enough time and send another command
     319    ---------------------------------------------------------------------------
     320    wait for 1ms;
     321    assign_rs485("01000000"); --start delimiter
     322    wait for 0us;
     323    assign_rs485("00000000"); --FTU address
     324    wait for 0ns;
     325    assign_rs485("11000000"); --FTM address
     326    wait for 0ns;
     327    assign_rs485("00000101"); --instruction
     328    wait for 0us;
     329    assign_rs485("00000001"); --data byte 01
     330    wait for 0ns;
     331    assign_rs485("00000000"); --data byte 02
     332    wait for 0ns;
     333    assign_rs485("00000010"); --data byte 03
     334    wait for 0ns;
     335    assign_rs485("00000000"); --data byte 04
     336    wait for 0ns;
     337    assign_rs485("00000100"); --data byte 05
     338    wait for 0ns;
     339    assign_rs485("00000000"); --data byte 06
     340    wait for 0ns;
     341    assign_rs485("00001000"); --data byte 07
     342    wait for 0ns;
     343    assign_rs485("00000000"); --data byte 08
     344    wait for 0ns;
     345    assign_rs485("00010000"); --data byte 09
     346    wait for 0ns;
     347    assign_rs485("00000000"); --data byte 10
     348    wait for 0ns;
     349    assign_rs485("00000000"); --data byte 11
     350    wait for 0ns;
     351    assign_rs485("00000000"); --check sum
     352    ---------------------------------------------------------------------------
     353    -- don't forget final wait!
     354    ---------------------------------------------------------------------------
    322355    wait;
    323356   
  • firmware/FTU/ftu_board.ucf

    r9843 r10009  
    2626# local board-ID "solder programmable"
    2727#######################################################
    28 NET brd_id<0> LOC  = C4 | IOSTANDARD=LVCMOS33; # P0             
    29 NET brd_id<1> LOC  = C5 | IOSTANDARD=LVCMOS33; # P1             
    30 NET brd_id<2> LOC  = C6 | IOSTANDARD=LVCMOS33; # P2             
    31 NET brd_id<3> LOC  = C7 | IOSTANDARD=LVCMOS33; # P3             
    32 NET brd_id<4> LOC  = C8 | IOSTANDARD=LVCMOS33; # P4             
    33 NET brd_id<5> LOC  = B8 | IOSTANDARD=LVCMOS33; # P5             
    34 NET brd_id<6> LOC  = C9 | IOSTANDARD=LVCMOS33; # P6     
    35 NET brd_id<7> LOC  = B9 | IOSTANDARD=LVCMOS33; # P7     
     28#NET brd_id<0> LOC  = C4 | IOSTANDARD=LVCMOS33; # P0           
     29#NET brd_id<1> LOC  = C5 | IOSTANDARD=LVCMOS33; # P1           
     30#NET brd_id<2> LOC  = C6 | IOSTANDARD=LVCMOS33; # P2           
     31#NET brd_id<3> LOC  = C7 | IOSTANDARD=LVCMOS33; # P3           
     32#NET brd_id<4> LOC  = C8 | IOSTANDARD=LVCMOS33; # P4           
     33#NET brd_id<5> LOC  = B8 | IOSTANDARD=LVCMOS33; # P5           
     34#NET brd_id<6> LOC  = C9 | IOSTANDARD=LVCMOS33; # P6   
     35#NET brd_id<7> LOC  = B9 | IOSTANDARD=LVCMOS33; # P7   
    3636
    3737
  • firmware/FTU/ftu_definitions.vhd

    r9939 r10009  
    7474
    7575  --communication with FTM
    76   constant RS485_BAUD_RATE   : integer := 100000;  -- bits / sec in our case
     76  constant RS485_BAUD_RATE   : integer := 250000;  -- bits / sec in our case
    7777  constant RS485_BLOCK_WIDTH : integer := 128;     -- 16 byte protocol
    7878  constant RS485_START_DELIM : std_logic_vector(7 downto 0) := "01000000";  -- start delimiter
    7979  constant FTM_ADDRESS       : std_logic_vector(7 downto 0) := "11000000";  -- 192
     80
     81  --DNA identifier for simulation
     82  constant DNA_FOR_SIM : bit_vector := X"01710000E0000500";
    8083 
    8184end ftu_constants;
  • 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.