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

Я что-то походу залип.

 

Тривиальный код:

        output reg [15:0] data_o,
        input [15:0] data_i,
        inout [15:0] phy_fd
...
    reg [15:0] phy_fd_reg;

    always @(posedge phy_ifclk, posedge reset) begin
        if(reset) begin
            data_o <= 0;
            phy_fd_reg <= 0;
        end
        else begin
                        data_o <= phy_fd;
            phy_fd_reg <= data_i; // можно так
            //phy_fd_reg <= phy_fd_reg + 1; // а можно и так - без разницы
        end
    end
    
    assign phy_fd = !phy_slwr ? data_i : 16'bz;

 

Это вырезка из автомата работы с CY7C68013A в режиме Slave FIFO.

 

Вытаскиваю в сигналтап сигнал phy_fd. Вижу что во время вывода в порт буфер никогда не выставляет на свой выход значения (всегда сидят нули), хотя OE вроде бы подается (на акртинке показан вариант с счетчиком):

post-67084-1449143612_thumb.png

 

При этом на прием работает нормально.

Я где-то неправ?

Изменено пользователем ilkz

Поделиться сообщением


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

Я что-то походу залип.

 

Тривиальный код:

        output reg [15:0] data_o,
        input [15:0] data_i,
        inout [15:0] phy_fd
...
    reg [15:0] phy_fd_reg;

    always @(posedge phy_ifclk, posedge reset) begin
        if(reset) begin
            data_o <= 0;
            phy_fd_reg <= 0;
        end
        else begin
                        data_o <= phy_fd;
            phy_fd_reg <= data_i; // можно так
            //phy_fd_reg <= phy_fd_reg + 1; // а можно и так - без разницы
        end
    end
    
    assign phy_fd = !phy_slwr ? data_i : 16'bz;

 

Это вырезка из автомата работы с CY7C68013A в режиме Slave FIFO.

 

Вытаскиваю в сигналтап сигнал phy_fd. Вижу что во время вывода в порт буфер никогда не выставляет на свой выход значения (всегда сидят нули), хотя OE вроде бы подается (на акртинке показан вариант с счетчиком):

post-67084-1449143612_thumb.png

 

При этом на прием работает нормально.

Я где-то неправ?

 

походу не то в сигналтап добавил

 

Поделиться сообщением


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

Ок, привожу полный код модуля:

`include "timescale.v"

// FX2LP-FPGA interface, slave-FIFO mode, FPGA is master
// see Cypress AN61345
module usb
   (
       input clk,
       input reset,

       output busy,

       input [15:0] data_i,
       input wr_data,

       output reg [15:0] data_o,
       output reg data_received,

       // FX2LP phy
       input phy_ifclk,        // 48MHz internal IF clock
       input phy_flaga,        // EP2 empty flag (EP2 - OUT, 512-bytes, 4x, bulk), EP_OUT: [HOST]->[FPGA]
       input phy_flagd,        // EP6 full flag (EP6 - IN, 512-bytes, 4x, bulk),    EP_IN: [HOST]<-[FPGA]
       output reg phy_slrd,
       output reg phy_slwr,
       output reg phy_sloe,
       output reg [1:0] phy_fifoadr,
       inout [15:0] phy_fd
   );

   wire ep_out_not_empty = phy_flaga;
   wire ep_out_empty = ~phy_flaga;
   wire ep_in_full = phy_flagd;

   localparam ST_FREE = 0;
   localparam ST_READ_OUT_EP = 1;
   localparam ST_WRITE_IN_EP = 2;

   reg [1:0] state;
   reg [15:0] phy_fd_reg;
   reg ep_out_not_empty_reg;

   always @(posedge phy_ifclk, posedge reset) begin
       if(reset) begin
           state <= ST_FREE;
           phy_fifoadr <= 0;
           phy_sloe <= 1;
           phy_slrd <= 1;
           phy_slwr <= 1;
           phy_fd_reg <= 0;
           data_o <= 0;
           data_received <= 0;
           ep_out_not_empty_reg <= 0;
       end
       else begin
           ep_out_not_empty_reg <= ep_out_not_empty;

           case(state)
               ST_FREE:
                   begin
                       if(ep_out_not_empty) begin
                           phy_fifoadr = 0;
                           phy_sloe <= 0;
                           phy_slrd <= 0;
                           phy_slwr <= 1;
                           state <= ST_READ_OUT_EP;
                       end
                       else if(wr_data & (ep_in_full == 1)) begin
                           //phy_fd_reg <= data_i;
                           phy_fd_reg <= phy_fd_reg + 1;
                           phy_fifoadr = 2;
                           phy_sloe <= 0;
                           phy_slrd <= 1;
                           phy_slwr <= 0;
                           state <= ST_WRITE_IN_EP;
                       end
                   end

               ST_READ_OUT_EP:
                   begin
                       data_o <= phy_fd;
                       if(ep_out_empty) begin
                           phy_fifoadr = 0;
                           phy_sloe <= 1;
                           phy_slrd <= 1;
                           phy_slwr <= 1;
                           data_received <= 0;
                           state <= ST_FREE;
                       end
                       else data_received <= 1;
                   end

               ST_WRITE_IN_EP:
                   begin
                       //phy_fd_reg <= data_i;
                       phy_fd_reg <= phy_fd_reg + 1;
                       if(!wr_data) begin
                           phy_fifoadr = 0;
                           phy_sloe <= 1;
                           phy_slrd <= 1;
                           phy_slwr <= 1;
                           state <= ST_FREE;
                       end
                   end

               default:
                   begin
                       phy_fifoadr <= 0;
                       phy_sloe <= 1;
                       phy_slrd <= 1;
                       phy_slwr <= 1;
                       data_received <= 0;
                       state <= ST_FREE;
                   end
           endcase

       end
   end

   assign busy = ep_out_not_empty | ep_out_not_empty_reg;
   //assign phy_fd = phy_fd_reg;
   assign phy_fd = !phy_slwr ? phy_fd_reg : 16'bz;
   //assign phy_fd = !phy_slwr ? data_i : 16'bz;

endmodule

Изменено пользователем ilkz

Поделиться сообщением


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

Если usb_slwr (на рисунке) соответствует phy_slwr (в коде), а usb_fd (на рисунке) соответствует phy_fd (в коде), то должно работать.

Поделиться сообщением


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

doom13, соответствует. Но не работает ))

 

upd: может ли такое быть, если phy-девайс не отпускает свою шину?

Изменено пользователем ilkz

Поделиться сообщением


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

Вытаскиваю в сигналтап сигнал phy_fd.
Это работать не должно. 3х стабильный сигнал существует только на выходе FPGA, после соответствующего буфера. Вы его должны были либо сами нарисовать (тогда никаких inout не будет вообще), либо за вас это сделал синтезатор. В сигналтап (который работает со внутренними сигналами в FPGA) он попасть никак не может. Странно, что синтезатор не обругался.

 

Добавьте в сигналтап отдельно phy_slwr и phy_fd_reg

 

Поделиться сообщением


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

post-67084-1449149632_thumb.png

 

См. два последних сигнала.

Странно, но phy_slwr идет единицей, хотя должен нулем.

 

Оптимизация квартусом))

Поделиться сообщением


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

Это работать не должно.

Если всё сделано правильно, то работает:

module top
(
    ...
    inout [63:0] EMIF_D,
    ...
);
    emifRAM EMIFBUFF_0 (    
        ...
        .bus_io(EMIF_D),
        ...
    );
endmodule

module emifRAM
(    
    ...
    inout [63:0] bus_io,
    ... 
);
    assign bus_io = (oenable_n) ? 16'hz : bus_data;
endmodule

 

Странно, но phy_slwr идет единицей, хотя должен нулем.

Похоже, вот ответ на Ваш вопрос.

Поделиться сообщением


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

Похоже, вот ответ на Ваш вопрос.

 

Душой-то я с Вами согласен, но тогда какая настройка такую пакость устроила?

Кому интересно, прикладываю проект.

test.rar

Поделиться сообщением


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

Душой-то я с Вами согласен, но тогда какая настройка такую пакость устроила?

Кому интересно, прикладываю проект.

test.rar

 

phy_sloe - вроде при записи "1" дб

 

а на счет несоответствия уровней попробуй отключить Power_Up Don't Care

Поделиться сообщением


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

phy_sloe - вроде при записи "1" дб

Согласно даташиту должна быть 1.

 

Поделиться сообщением


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

Согласно даташиту должна быть 1.

да это и без даташита должно быть понятно, что Output Enable (при активном нулевом уровне) у слейва при записи дб "1"

но вот в коде у ТС он устанавливается в 0

Поделиться сообщением


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

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

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

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

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

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

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

×
×
  • Создать...