ft245if.vhd

    1  -- title:              FT245 I/F
    2  -- author:             Sebastian Weiss
    3  -- last change:        08.10.13
    4 
    5 
    6 library IEEE;
    7 use IEEE.std_logic_1164.all;
    8 use IEEE.numeric_std.all;
    9 
   10 entity ft245if is
   11         port
   12         (
   13                 clk             : in std_logic;
   14                 rst             : in std_logic;
   15 
   16                 usb_rd_n        : out std_logic;
   17                 usb_wr          : out std_logic;
   18                 usb_dq          : inout std_logic_vector(7 downto 0);
   19                 usb_txe_n       : in std_logic;
   20                 usb_rxf_n       : in std_logic;
   21 
   22                 wr_d            : in std_logic_vector(7 downto 0);
   23                 rd_d            : out std_logic_vector(7 downto 0);
   24                 wr_req          : in std_logic;
   25                 rd_req          : in std_logic;
   26                 ready           : out std_logic;
   27                 if_en           : in std_logic
   28         );
   29 end entity;
   30 
   31 architecture behavioral of ft245if is
   32 -- signals for bus handling
   33 signal wr_reg   : std_logic_vector(7 downto 0);
   34 signal rd_reg   : std_logic_vector(7 downto 0) := (others => '0');
   35 signal rd_n     : std_logic := '1';
   36 signal wr       : std_logic := '0';
   37 signal wr_en    : std_logic;
   38 
   39 -- signals for the controller
   40 constant wr2wr_val      : unsigned(2 downto 0) := "011";
   41 constant wr_val         : unsigned(2 downto 0) := "010";
   42 constant rd2rd_val      : unsigned(2 downto 0) := "101";
   43 constant rd_val         : unsigned(2 downto 0) := "011";
   44 type state_t is (
   45         idle,
   46         wait_for_txe_low,
   47         write_data,
   48         wait_wr2wr,
   49         wait_for_rxf_low,
   50         read_data,
   51         wait_rd2rd
   52         );
   53 signal state    : state_t;
   54 signal cnt      : unsigned(2 downto 0);
   55 begin
   56 
   57         -- bus handling
   58         usb_rd_n        <= rd_n         when if_en = '1'        else 'Z';
   59         usb_wr          <= wr           when if_en = '1'        else 'Z';
   60         wr_en           <= rd_n and wr and if_en;
   61         usb_dq          <= wr_reg       when wr_en = '1'        else (others => 'Z');
   62         rd_d            <= rd_reg;
   63 
   64         -- controller
   65         process begin
   66                 wait until rising_edge(clk);
   67                 if (rst = '1') or (if_en = '0') then
   68                         state   <= idle;
   69                         cnt     <= "000";
   70                 end if;
   71                 case state is
   72                         when idle =>
   73                                 ready <= '1';
   74                                 if wr_req = '1' then
   75                                         state   <= wait_for_txe_low;
   76                                         wr_reg  <= wr_d;
   77                                 end if;
   78                                 if rd_req = '1' then
   79                                         state   <= wait_for_rxf_low;
   80                                 end if;
   81 
   82                         when wait_for_txe_low =>
   83                                 ready   <= '0';
   84                                 cnt     <= "000";
   85                                 wr      <= '0';
   86                                 if usb_txe_n = '0' then
   87                                         state   <= write_data;
   88                                 end if;
   89 
   90                         when write_data =>
   91                                 cnt     <= cnt + "001";
   92                                 wr      <= '1';
   93                                 if cnt >= wr_val then
   94                                         state   <= wait_wr2wr;
   95                                         cnt     <= "000";
   96                                 end if;
   97 
   98                        when wait_wr2wr =>
   99                                 cnt     <= cnt + "001";
  100                                 wr      <= '0';
  101                                 if cnt >= wr2wr_val then
  102                                         if wr_req = '1' then
  103                                                 state   <= wait_for_txe_low;
  104                                         else
  105                                                 ready   <= '1';
  106                                                 state   <= idle;
  107                                         end if;
  108                                 end if;
  109 
  110                         when wait_for_rxf_low =>
  111                                 ready   <= '0';
  112                                 cnt     <= "000";
  113                                 rd_n    <= '1';
  114                                 if usb_txe_n = '0' then
  115                                         state   <= read_data;
  116                                 end if;
  117 
  118                         when read_data =>
  119                                 cnt     <= cnt + "001";
  120                                 rd_n    <= '0';
  121                                 if cnt >= rd_val then
  122                                         state   <= wait_rd2rd;
  123                                         cnt     <= "000";
  124                                         rd_reg  <= usb_dq;
  125                                 end if;
  126 
  127                         when wait_rd2rd =>
  128                                 cnt     <= cnt + "001";
  129                                 rd_n    <= '1';
  130                                 if cnt >= rd2rd_val then
  131                                         if rd_req = '1' then
  132                                                 state   <= wait_for_rxf_low;
  133                                         else
  134                                                 ready   <= '1';
  135                                                 state   <= idle;
  136                                         end if;
  137                                 end if;
  138                 end case;
  139         end process;
  140 end behavioral;
  141 

This page was generated using GHDL 0.29 (20100109) [Sokcho edition], a program written by Tristan Gingold