Print

 FTDI社のUSB3.0ブリッジIC FT601の転送レートを同IC搭載ボードUSB-107を用いて実際に計測しました。
 転送レートの理論値はデータ32bit幅・100MHz動作という仕様から、400MB/s (MByte/sec 以下同様)となっています。

 

設定

以下の設定で測定を行いました。

 

結果

 PCにより結果が異なりました。下記のPCでは送信 194MB/s, 受信 311MB/sとなりました。

別のPCでは送信 354MB/s, 受信 327MB/sとなりました。

 

FPGAの受信ステートマシン例

clkは100MHzです。FIFOへの書込処理が含まれています。

entity H_FT600_S245_32_RX_V3 is

 port (
  clk    : in std_logic;
  reset  : in std_logic;
  be     : in std_logic_vector(3 downto 0);
  rxf    : in std_logic;
  oe     : out std_logic;
  rd     : out std_logic;
  data   : in std_logic_vector(31 downto 0);
  rcv_length : out std_logic_vector(15 downto 0);
  rcv_data   : out std_logic_vector(31 downto 0);
  fifo_wreq : out std_logic
 );
end entity;

architecture rtl of H_FT600_S245_32_RX_V3 is

   type state_type is (idle,s0,s1,s2,t0);
   signal state : state_type;
   signal rcv_length_r : std_logic_vector(15 downto 0);
   signal rcv_data_r   : std_logic_vector(31 downto 0); 
   signal rxf_r : std_logic;
   signal oe_r  : std_logic;
   signal rd_r  : std_logic;
   signal data_r : std_logic_vector(31 downto 0);

begin   
   rcv_length <= rcv_length_r;
   rcv_data <= rcv_data_r;

   process (clk, reset, rxf)
   begin
   if reset = '1' then
      state <= idle;
      oe <= '1';
      rd <= '1';
      rcv_length_r <= X"0000";
      rcv_data_r <= X"00000000";
      oe_r <= '1';
      rd_r <= '1';
      fifo_wreq <= '0';
   elsif rising_edge(clk) then
      rxf_r <= rxf;
      oe <= oe_r;
      rd <= rd_r;
      data_r <= data;
      case state is
         when idle =>
            rcv_length_r <= X"0000";
            rcv_data_r <= X"00000000";
            rd_r <= '1';
            if rxf_r = '0' then
               state <= s0;
               oe_r <= '0';
            else
               oe_r <= '1';
               state <= idle;
            end if;
         when s0 =>
            rd_r <= '0';
            state <= s1;
         when s1 =>
            state <= s2;
         when s2 =>
            state <= t0;
         ---------------------------------------
         when t0 =>
            if rxf_r = '0' then
               rcv_data_r <= data_r;
               rcv_length_r <= rcv_length_r + '1';
               fifo_wreq <= '1';
               state <= t0;
            else
               oe_r <= '1';
               rd_r <= '1';
               fifo_wreq <= '0';
               state <= idle;
            end if;
         ---------------------------------------
      end case;
   end if;
   end process;
end rtl;

 

FPGA送信ステートマシン例

clkは100MHz(反転位相)です。FIFOからの読込処理が含まれています。

entity H_FT600_S245_32_TX_V5 is

 port(
  clk180 : in std_logic;
  reset  : in std_logic;
  txe    : in std_logic;
  wr     : out std_logic;
  be     : out std_logic_vector(3 downto 0);
  data   : out std_logic_vector(31 downto 0);
  fifo_data : in std_logic_vector(31 downto 0);
  fifo_rreq : out std_logic
 );
end entity;

architecture rtl of H_FT600_S245_32_TX_V5 is

   type state_type is (idle,s0,s1,t0);
   signal state : state_type;
   signal txe_r  : std_logic;
   signal be_r   : std_logic_vector(3 downto 0);
   signal data_r : std_logic_vector(31 downto 0);
   signal fifo_data_r : std_logic_vector(31 downto 0);

begin
   data <= fifo_data_r;
   be <= be_r;
   ---------------------------------------------
   process (clk180, reset)
   begin
   if reset = '1' then
      state <= idle;
      wr <= '1';
      txe_r <= '1';
      fifo_rreq <= '0';
      be_r <= (others=>'0');
      data_r <= (others=>'0');  
   elsif rising_edge(clk180) then   
      txe_r <= txe;
      fifo_data_r <= fifo_data;
      case state is
         when idle =>      
            be_r <= (others=>'1');
            data_r <= (others=>'0');
            fifo_rreq <= '0';
            if txe_r = '0' then
               state <= s0;
               fifo_rreq <= '1';
            else
               state <= idle;
            end if;
         ---------------------------------------------
         when s0 =>
            state <= s1;
         when s1 =>
            wr <= '0';
            state <= t0;
         --------------------------------------
         when t0 =>
            if txe_r = '0' then
               if data_r = x"FFFFFFFF" then
                  data_r <= x"00000000";
               else
                  data_r <= data_r + x"11111111";
               end if;
               state <= t0;
            else
               wr <= '1';
               state <= idle;
            end if;
         --------------------------------------
      end case;
   end if;
   end process;
end rtl;

 

 

下記もご参照ください

 

お問い合わせについて

開発ツールの使い方などは、弊社のサポート外とさせていただいております。
ご担当の代理店様などにお尋ねください。

ソースなどの提供は行っておりません。予めご了承ください。

 


[kw] TEC-FPGA 2017-04-25 FT601 USB-107 EDA-302


[]