ilkz 0 3 декабря, 2015 Опубликовано 3 декабря, 2015 (изменено) · Жалоба Я что-то походу залип. Тривиальный код: 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 вроде бы подается (на акртинке показан вариант с счетчиком): При этом на прием работает нормально. Я где-то неправ? Изменено 3 декабря, 2015 пользователем ilkz Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Realking 0 3 декабря, 2015 Опубликовано 3 декабря, 2015 · Жалоба Я что-то походу залип. Тривиальный код: 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 вроде бы подается (на акртинке показан вариант с счетчиком): При этом на прием работает нормально. Я где-то неправ? походу не то в сигналтап добавил Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
doom13 0 3 декабря, 2015 Опубликовано 3 декабря, 2015 · Жалоба Из кода не видно, как может меняться phy_slwr. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ilkz 0 3 декабря, 2015 Опубликовано 3 декабря, 2015 (изменено) · Жалоба Ок, привожу полный код модуля: `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 Изменено 3 декабря, 2015 пользователем ilkz Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
doom13 0 3 декабря, 2015 Опубликовано 3 декабря, 2015 · Жалоба Если usb_slwr (на рисунке) соответствует phy_slwr (в коде), а usb_fd (на рисунке) соответствует phy_fd (в коде), то должно работать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ilkz 0 3 декабря, 2015 Опубликовано 3 декабря, 2015 (изменено) · Жалоба doom13, соответствует. Но не работает )) upd: может ли такое быть, если phy-девайс не отпускает свою шину? Изменено 3 декабря, 2015 пользователем ilkz Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xvr 12 3 декабря, 2015 Опубликовано 3 декабря, 2015 · Жалоба Вытаскиваю в сигналтап сигнал phy_fd.Это работать не должно. 3х стабильный сигнал существует только на выходе FPGA, после соответствующего буфера. Вы его должны были либо сами нарисовать (тогда никаких inout не будет вообще), либо за вас это сделал синтезатор. В сигналтап (который работает со внутренними сигналами в FPGA) он попасть никак не может. Странно, что синтезатор не обругался. Добавьте в сигналтап отдельно phy_slwr и phy_fd_reg Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ilkz 0 3 декабря, 2015 Опубликовано 3 декабря, 2015 · Жалоба См. два последних сигнала. Странно, но phy_slwr идет единицей, хотя должен нулем. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Realking 0 3 декабря, 2015 Опубликовано 3 декабря, 2015 · Жалоба См. два последних сигнала. Странно, но phy_slwr идет единицей, хотя должен нулем. Оптимизация квартусом)) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ilkz 0 3 декабря, 2015 Опубликовано 3 декабря, 2015 · Жалоба NOT Gate Push-Back отключил - не помогает. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
doom13 0 3 декабря, 2015 Опубликовано 3 декабря, 2015 · Жалоба Это работать не должно. Если всё сделано правильно, то работает: 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 идет единицей, хотя должен нулем. Похоже, вот ответ на Ваш вопрос. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ilkz 0 3 декабря, 2015 Опубликовано 3 декабря, 2015 · Жалоба Похоже, вот ответ на Ваш вопрос. Душой-то я с Вами согласен, но тогда какая настройка такую пакость устроила? Кому интересно, прикладываю проект. test.rar Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Realking 0 3 декабря, 2015 Опубликовано 3 декабря, 2015 · Жалоба Душой-то я с Вами согласен, но тогда какая настройка такую пакость устроила? Кому интересно, прикладываю проект. test.rar phy_sloe - вроде при записи "1" дб а на счет несоответствия уровней попробуй отключить Power_Up Don't Care Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
doom13 0 3 декабря, 2015 Опубликовано 3 декабря, 2015 · Жалоба phy_sloe - вроде при записи "1" дб Согласно даташиту должна быть 1. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Realking 0 4 декабря, 2015 Опубликовано 4 декабря, 2015 · Жалоба Согласно даташиту должна быть 1. да это и без даташита должно быть понятно, что Output Enable (при активном нулевом уровне) у слейва при записи дб "1" но вот в коде у ТС он устанавливается в 0 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться