FTDI社のUSB3.0ブリッジIC FT601の転送レートを同IC搭載ボードUSB-107を用いて実際に計測しました。
転送レートの理論値はデータ32bit幅・100MHz動作という仕様から、400MB/s (MByte/sec 以下同様)となっています。
設定
以下の設定で測定を行いました。
- 動作モード:245 FIFO, 100MHz
- 測定範囲(送信/受信):1MB~50MB を1MB Step (50点)
- 測定回数:10回を平均
- D3XXデバイスドライババージョン:v1.2.0.6
- 送受信対象ボード:EDA-302
結果
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;
下記もご参照ください
- FT600関連製品特設ページ:https://www.hdl.co.jp/FT600/index.html
お問い合わせについて
開発ツールの使い方などは、弊社のサポート外とさせていただいております。
ご担当の代理店様などにお尋ねください。
ソースなどの提供は行っておりません。予めご了承ください。
[kw] TEC-FPGA 2017-04-25 FT601 USB-107 EDA-302
[]