Перейти к содержанию

Прблемы с передачей данных FT601 + FGPA GOWIN


WorldMaster

Рекомендуемые сообщения

Здравствуйте. 

Есть задача подружить плис и USB мост FT601.

Пишу на VHDL. Вроде бы сделал чтобы ПЛИС писал данные в порт и с компа запрашиваю их.

Но есть какие то непонятные нюансы.

Вот сам код модуля отправки:

library IEEE;
use IEEE.STD_LOGIC_1164.ALL; 
use IEEE.numeric_std.all;
use work.types_package.all;


entity USB_BRIDGE is 
port (    
    in_clk : in std_logic;
    txe_n : in std_logic;
    rxf_n: in std_logic;
    wr_n: out std_logic;
    BE : inout std_logic_vector(3 downto 0):=(others=>'Z');
    DATA_1 : inout std_logic_vector(7 downto 0):=(others=>'Z');
    DATA_2 : inout std_logic_vector(7 downto 0):=(others=>'Z');
    DATA_3 : inout std_logic_vector(7 downto 0):=(others=>'Z');
    DATA_4 : inout std_logic_vector(7 downto 0):=(others=>'Z');

    Rst: in std_logic; -- ресет
    PC_WriteData: out std_logic; --  комп отправил данные в прибор
    PC_ReadData: out std_logic;    -- комп запрашивает данные от прибора

    RW:in std_logic; -- чтение или запись
    ChNum: in std_logic_vector(7 downto 0); -- номер канала
    tranfer_enable: in std_logic; -- сигнал на начало взаимодействия
    busy: out std_logic; -- сообщает что модуль занят
    transaction_complete: out std_logic; -- сообщает что транзакция успешно завершена
    LED_OT: out std_logic := '0';
    rx_buffer : out DataBuffer; 
    tx_buffer : in DataBuffer 
);
end USB_BRIDGE;


-- тут описываем логику работы ячейки
architecture logic of USB_BRIDGE is  
signal state: bridge_mode := Idle;   
signal outled :  std_logic;

begin 
 

process(in_clk, Rst)
variable bytes_cnt: integer :=0; -- счетчик принятых или отправленных байт
variable active_work: task_type := Idle;
VARIABLE outFifoStatus: unsigned(3 DOWNTO 0) :="0000";
VARIABLE inFifoStatus: unsigned(3 DOWNTO 0):="0000";
variable waitBulk: integer :=0;
variable timeout: integer :=0;

variable BE_state : std_logic_vector(3 downto 0):=(others=>'0');
variable DATA_1_state : std_logic_vector(7 downto 0):=(others=>'0');
variable DATA_2_state : std_logic_vector(7 downto 0):=(others=>'0');
variable DATA_3_state : std_logic_vector(7 downto 0):=(others=>'0');
variable DATA_4_state : std_logic_vector(7 downto 0):=(others=>'0');

begin
    if Rst = '1' then
        --LED_OT <= '1';
        bytes_cnt := 0;  
        wr_n <='1';      
        if  rxf_n = '1' then
            BE_state := (others=>'1');
            DATA_1 <=(others=>'1');
            DATA_2 <= (others=>'Z'); -- чтобы можно было прочитать надо обязательно выставлять Z
            DATA_3 <= (others=>'1');
            DATA_4 <= (others=>'1');            


            outFifoStatus := unsigned(DATA_2(7 DOWNTO 4));          
            if outFifoStatus /= "1111" then
                -- значит пришли данные которые нужно считать
                PC_WriteData <='1'; 
            else 
                PC_WriteData <='0'; 
            end if;
 
            inFifoStatus:=unsigned(DATA_2(3 DOWNTO 0));
            if inFifoStatus /= "1111" then
                -- значит шина свободна для записи
                PC_ReadData <='1';
            else 
                PC_ReadData <='0';
            end if; 
        else 
            PC_WriteData <='0';
            PC_ReadData <='0';
        end if;


        busy <= '0';
        transaction_complete <= '0';
        active_work := Idle;
        state <= Idle;
    elsif rising_edge( in_clk) then
        case state is 
            when Idle =>
                busy <= '1';
                PC_WriteData <= '0'; 
                PC_ReadData <= '0'; 
                if tranfer_enable = '1' then  
                    -- выставляем нужные параметры на линиях и ждем начало окна передачи
                    -- command phase                    
                    if RW = '0' then
                        DATA_1 <= x"01";   
                        BE_state := "0000"; -- read 
                        active_work := ReadUSB;
                    else
                        DATA_1 <= x"01";  
                        BE_state := "0001"; -- write
                        active_work := WriteUSB;                        
                    end if;         
                    wr_n <= '0'; -- flag to ready             
                    bytes_cnt := 0;  
                    state <= Transfer1;     
                end if; 
            when Transfer1 => 
                if txe_n = '1' then 
                    DATA_1 <= (others=>'1');
                    DATA_2 <= (others=>'Z'); 
                    DATA_3 <= (others=>'1');
                    DATA_4 <= (others=>'1');
                    BE_state := "1111"; 
                    state <= Transfer; 
                    bytes_cnt:=0;
                end if;
    
            when Transfer =>  
                -- ждем начало окна и начинаем прием данных  
                if rxf_n = '0' then 
                    timeout :=0;
                    waitBulk:=0;                         
                    --LED_OT <= '0';
                    if bytes_cnt < 1020 then                        
                        DATA_1 <=  x"ae";
                        DATA_2 <=   x"ba";
                        DATA_3 <=   x"cf";
                        DATA_4 <=   x"fa";
                        BE_state := "1111"; -- count of valid bytes for 4 blocks
                        bytes_cnt := bytes_cnt + 1;                         
                    else                                                  
                        state <= WaitEndBulk;
                        wr_n <= '1';                               
                    end if;                  
                elsif waitBulk = 0 then
                    wr_n <= '1';                        
                    state <= WaitEndBulk; -- turn around 
                end if;  
            when WaitEndBulk => 
                    DATA_1 <=(others=>'1');
                    DATA_2 <= (others=>'Z');
                    DATA_3 <= (others=>'1');
                    DATA_4 <= (others=>'1');
                    BE_state := (others=>'1');
                state <= Complete; -- готово
            when Complete =>
                transaction_complete <= '1';
                busy <= '0';
        end case;
    end if;

BE <= BE_state;


end process;
end architecture;

 

Вроде бы работает но данные приходят на комп очень странно:.

первые 4 байта стабильно приходят значения линий на момент командной фазы. 

		[0]	0xff	byte
		[1]	0xfe	byte
		[2]	0xff	byte
		[3]	0xff	byte
		[4]	0x00	byte
		[5]	0x00	byte
		[6]	0x00	byte
		[7]	0x00	byte
		[8]	0x00	byte
		[9]	0x00	byte
		[10]	0x00	byte
		[11]	0x00	byte
		[12]	0x00	byte
		[13]	0x00	byte
		[14]	0x00	byte
		[15]	0x00	byte

затем нули.. 

Если повторить несколько раз чтение то однажды приходят правильные данные, но опять также с 4 байта.

		[0]	0xff	byte
		[1]	0xfe	byte
		[2]	0xff	byte
		[3]	0xff	byte
		[4]	0xae	byte
		[5]	0xba	byte
		[6]	0xcf	byte
		[7]	0xfa	byte
		[8]	0xae	byte
		[9]	0xba	byte
		[10]	0xcf	byte
		[11]	0xfa	byte
		[12]	0xae	byte
		[13]	0xba	byte
		[14]	0xcf	byte
		[15]	0xfa	byte
		[16]	0xae	byte
		[17]	0xba	byte
		[18]	0xcf	byte
		[19]	0xfa	byte
		[20]	0xae	byte

 

Вот даташит есть на мост https://www.ftdichip.com/old2020/Support/Documents/DataSheets/ICs/DS_FT600Q-FT601Q IC Datasheet.pdf

Вот диаграмма:

image.png.7c05fe994890a58be37c59d5716f5487.pngimage.png.4cd7b397e5f81be7bb859804bb515743.png

 

Может я в коде ошибся?? Буду благодарен любой помощи.

Спасибо.

 

 

 

 

 

 

Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...