svedach 0 4 февраля, 2019 Опубликовано 4 февраля, 2019 · Жалоба Добрый вечер, столкнулся с ситуацией, в которой не понимаю, откуда берется generated clock (vivado 2018.3). HDL синтезировался в следующую структуру: Spoiler Вроде все синхронно... Но: Spoiler подскажите, откуда он берется? Исходник: Spoiler module LinesSender( //Выходные сигналы для шины AXI Stream input TCLK, output TValid, output [63 : 0] TData, output [7 : 0] TStrb, output TLast, input TReady, output TUser, //Входные сигналы AXIS для профиля input ProfileAXIS_Clck, input ProfileAXIS_RstN, input [63 : 0] ProfileAXIS_TData, input ProfileAXIS_TValid, output ProfileAXIS_TReady, input ProfileAXIS_TLast, //Сигналы управления input SendingStart, output reg SendingDone, //Количество линий для отправки input [15 : 0] LinesCount, //Количество данных point2line input [15 : 0] Point2LineCount, //Сигналы для чтения линий из буффера линий output reg [11 : 0] lines_rd_addr, input [63 : 0] lines_rd_out, //Сигналы для чтения индекслов линий точек профиля для отправки output reg [11 : 0] points2lines_rd_addr, input [63 : 0] points2lines_rd_out, //Отладка output [31 : 0] debug_LSND_State ); /*=======================================================================================================*/ wire FIFO_tready; reg [63 : 0] FIFO_tdata; reg FIFO_tlast; reg FIFO_tvalid; /*=======================================================================================================*/ /*=======================================================================================================*/ reg [15 : 0] SendedLinesCounter; reg SendLinesDone; /*=======================================================================================================*/ /*=======================================================================================================*/ reg [15 : 0] SendedPoint2LineCounter; reg SendPoint2LineDone; reg SendPoint2LineLast; /*=======================================================================================================*/ //Debug вывод в file integer debug_OutLines; //АВТОМАТ состояний, отправляющий линии reg [4 : 0] LineSenderState; reg [4 : 0] LineSenderStateDly; reg [4 : 0] LineSenderNextState; parameter LSND_Idle = 5'd0; //Ожидание отправки parameter LSND_WriteLinesHeader = LSND_Idle + 1; //Запись заголовка линий parameter LSND_SendLines = LSND_WriteLinesHeader + 1; //Передача линий parameter LSND_SendPoint2Line = LSND_SendLines + 1; //Передача point2line parameter LSND_SendingComplete = LSND_SendPoint2Line + 1; //Окончание передачи (сброс флагов и т.д.) assign debug_LSND_State = LineSenderState; initial begin //Debug запись в файл debug_OutLines = $fopen("OutputLines.txt", "w"); //Начальные значения автомата состояний LineSenderState <= LSND_Idle; LineSenderStateDly <= LSND_Idle; LineSenderNextState <= LSND_Idle; SendedLinesCounter <= 0; SendLinesDone <= 0; lines_rd_addr <= 0; SendedPoint2LineCounter <= 0; SendPoint2LineDone <= 0; SendPoint2LineLast <= 0; //Сигналы состояния SendingDone <= 0; end //Переход следующего состояния в текущие и сброс always @(posedge ProfileAXIS_Clck) begin if (ProfileAXIS_RstN == 0) LineSenderState <= LSND_Idle; else LineSenderState <= LineSenderNextState; LineSenderStateDly <= LineSenderState; end //Следующее состояние always @(*) begin case (LineSenderState) /*0*/ LSND_Idle: LineSenderNextState <= (SendingStart) ? LSND_WriteLinesHeader : LSND_Idle; /*1*/ LSND_WriteLinesHeader: LineSenderNextState <= LSND_SendLines; /*2*/ LSND_SendLines: LineSenderNextState <= (SendLinesDone) ? LSND_SendPoint2Line : LSND_SendLines; /*2*/ LSND_SendPoint2Line: LineSenderNextState <= (SendPoint2LineDone) ? LSND_SendingComplete : LSND_SendPoint2Line; /*2*/ LSND_SendingComplete: LineSenderNextState <= LSND_Idle; endcase end always @(posedge ProfileAXIS_Clck) begin SendingDone <= (LineSenderState == LSND_SendingComplete); end always @(posedge ProfileAXIS_Clck) begin if (LineSenderState == LSND_Idle) SendedLinesCounter <= 0; else if (LineSenderState == LSND_SendLines) SendedLinesCounter <= SendedLinesCounter + 1; else SendedLinesCounter <= SendedLinesCounter; SendLinesDone <= (SendedLinesCounter == (LinesCount - 2)); if (LineSenderState == LSND_Idle) lines_rd_addr <= 0; else if (LineSenderState == LSND_SendLines) lines_rd_addr <= lines_rd_addr + 1; else lines_rd_addr <= lines_rd_addr; end always @(posedge ProfileAXIS_Clck) begin if (LineSenderState == LSND_Idle) SendedPoint2LineCounter <= 0; else if (LineSenderState == LSND_SendPoint2Line) SendedPoint2LineCounter <= SendedPoint2LineCounter + 1; else SendedPoint2LineCounter <= SendedPoint2LineCounter; SendPoint2LineDone <= (SendedPoint2LineCounter == (Point2LineCount - 2)); if (LineSenderState == LSND_Idle) points2lines_rd_addr <= 0; else if (LineSenderState == LSND_SendPoint2Line) points2lines_rd_addr <= points2lines_rd_addr + 1; else points2lines_rd_addr <= points2lines_rd_addr; SendPoint2LineLast <= (SendedPoint2LineCounter == (Point2LineCount - 1)); end axis_async_fifo #( .ADDR_WIDTH(11), .DATA_WIDTH(64), .KEEP_ENABLE(0), .KEEP_WIDTH(1), .LAST_ENABLE(1), .ID_ENABLE(0), .ID_WIDTH(1), .DEST_ENABLE(0), .DEST_WIDTH(1), .USER_ENABLE(0), .USER_WIDTH(1), .FRAME_FIFO(1), .USER_BAD_FRAME_VALUE(0), .USER_BAD_FRAME_MASK(1), .DROP_BAD_FRAME(1), .DROP_WHEN_FULL(1) ) AXIS_FIFO1 ( // Common reset .async_rst(!ProfileAXIS_RstN), // AXI input .s_clk(ProfileAXIS_Clck), .s_axis_tdata(FIFO_tdata), .s_axis_tkeep(0), .s_axis_tvalid(FIFO_tvalid), .s_axis_tready(FIFO_tready), .s_axis_tlast(FIFO_tlast), .s_axis_tid(), .s_axis_tdest(), .s_axis_tuser(), // AXI output .m_clk(TCLK), .m_axis_tdata(TData), .m_axis_tkeep(), .m_axis_tvalid(TValid), .m_axis_tready(TReady), .m_axis_tlast(TLast), .m_axis_tid(), .m_axis_tdest(), .m_axis_tuser(), // Status .s_status_overflow(), .s_status_bad_frame(), .s_status_good_frame(), .m_status_overflow(), .m_status_bad_frame(), .m_status_good_frame() ); always @(posedge ProfileAXIS_Clck) begin case (LineSenderStateDly) LSND_Idle: begin FIFO_tdata <= ProfileAXIS_TData; FIFO_tvalid <= ProfileAXIS_TValid; FIFO_tlast <= 1'b0; end LSND_WriteLinesHeader: begin FIFO_tdata <= {LinesCount, 48'd0}; FIFO_tvalid <= 1'b1; FIFO_tlast <= 1'b0; end LSND_SendLines: begin FIFO_tdata <= lines_rd_out; FIFO_tvalid <= 1'b1; FIFO_tlast <= 1'b0; end LSND_SendPoint2Line: begin FIFO_tdata <= points2lines_rd_out; FIFO_tvalid <= 1'b1; FIFO_tlast <= SendPoint2LineLast; end default: begin FIFO_tdata <= 0; FIFO_tvalid <= 1'b0; FIFO_tlast <= 1'b0; end endcase end endmodule Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MegaVolt 25 4 февраля, 2019 Опубликовано 4 февраля, 2019 · Жалоба А исходник подозрительного места? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Avex 1 4 февраля, 2019 Опубликовано 4 февраля, 2019 · Жалоба А где здесь генерейтед клок? На схеме все три флопа работают на одном клоке. В тайминг репорте показан путь от регистра до регистра. Генерейтед клока нигде не наблюдаю, все на одном клоке Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
svedach 0 5 февраля, 2019 Опубликовано 5 февраля, 2019 · Жалоба Alex, полностью с Вами согласен, но вод у Вивадо видимо свое мнение. Эта цепь отнесена, как я понимаю, к клоковым: Spoiler Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RobFPGA 27 5 февраля, 2019 Опубликовано 5 февраля, 2019 · Жалоба Приветствую! Может от того что у вас Math_s0_axis_clk не определен как клок и для него не заданны constraints Vivado и глючит (и она бредит хоть каким нибудь мужикомклоком )? Удачи! Rob. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dvlwork 0 5 февраля, 2019 Опубликовано 5 февраля, 2019 · Жалоба А не может ли это быть сигналом данных, растрассированным по клоковым линиям? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 5 февраля, 2019 Опубликовано 5 февраля, 2019 · Жалоба При таком описании конечного автомата (нет значения по умолчанию или квалификатора что указан полный набор состояний) у вас вивадо сообщений о появлении защелки на сигнале LineSenderNextState не выдает? Может быть в этом дело. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
svedach 0 5 февраля, 2019 Опубликовано 5 февраля, 2019 · Жалоба 24 minutes ago, RobFPGA said: Приветствую! Может от того что у вас Math_s0_axis_clk не определен как клок и для него не заданны constraints Vivado и глючит (и она бредит хоть каким нибудь мужикомклоком )? Удачи! Rob. Констрейнил его как клок, не помогало... dvlwork, это после синтеза, имплементации не было... des00, интересно, сча буду пробовать... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RobFPGA 27 5 февраля, 2019 Опубликовано 5 февраля, 2019 · Жалоба Приветствую! Можете вывести список/картинку всех 7ми цепей от LineSenderState_reg[1]? Удачи! Rob. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dvlwork 0 5 февраля, 2019 Опубликовано 5 февраля, 2019 (изменено) · Жалоба 12 минут назад, svedach сказал: dvlwork, это после синтеза, имплементации не было вас вообще этот сигнал приходит на тактовый вход хоть какого-нибудь триггера? Изменено 5 февраля, 2019 пользователем dvlwork Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
svedach 0 5 февраля, 2019 Опубликовано 5 февраля, 2019 · Жалоба Все, разобрался, прав был des00, сделал значение по-умолчанию (default: LineSenderNextState <= LSND_Idle;) и generated clocks сразу пропали. Всем спасибо! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
lexx 0 5 февраля, 2019 Опубликовано 5 февраля, 2019 · Жалоба Странно, а при синтезе разве наличие latch-ей не выдает? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться