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

    

Откуда берется generated clock?

Добрый вечер, столкнулся с ситуацией, в которой не понимаю, откуда берется generated clock (vivado 2018.3). HDL синтезировался в следующую структуру:

Spoiler

image.thumb.png.bf792f35a8e87676c23eedc5eb0972d6.png

Вроде все синхронно... Но:

Spoiler

image.png.ef2e8632dc6761247d1dbb4701d82f73.png

подскажите, откуда он берется?

Исходник:

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

 

 

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


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

А исходник подозрительного места?

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


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

А где здесь генерейтед клок? На схеме  все три флопа работают на одном клоке. В тайминг репорте показан путь от регистра до регистра. Генерейтед клока нигде не наблюдаю, все на одном клоке

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


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

Alex, полностью с Вами согласен, но вод у Вивадо видимо свое мнение. Эта цепь отнесена, как я понимаю, к клоковым:

Spoiler

image.png.571a62fe52a10db3c4d0f971d9c5afb0.png

 

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


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

Приветствую!

Может от того что у вас Math_s0_axis_clk не определен как клок и для него не заданны constraints  Vivado и глючит (и она бредит хоть каким нибудь мужикомклоком :blush:)?  

Удачи! Rob.

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


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

А не может ли это быть сигналом данных, растрассированным по клоковым линиям?

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


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

При таком описании конечного автомата (нет значения по умолчанию или квалификатора что указан полный набор состояний) у вас вивадо сообщений о появлении защелки на сигнале LineSenderNextState не выдает? Может быть в этом дело.

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


Ссылка на сообщение
Поделиться на другие сайты
24 minutes ago, RobFPGA said:

Приветствую!

Может от того что у вас Math_s0_axis_clk не определен как клок и для него не заданны constraints  Vivado и глючит (и она бредит хоть каким нибудь мужикомклоком :blush:)?  

Удачи! Rob.

Констрейнил его как клок, не помогало...

dvlwork, это после синтеза, имплементации не было...

des00, интересно, сча буду пробовать...

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


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

Приветствую!

Можете вывести список/картинку  всех 7ми цепей от LineSenderState_reg[1]? 

Удачи! Rob.

 

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


Ссылка на сообщение
Поделиться на другие сайты
12 минут назад, svedach сказал:

dvlwork, это после синтеза, имплементации не было

 вас вообще этот сигнал приходит на тактовый вход хоть какого-нибудь триггера?

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

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


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

Все, разобрался, прав был des00, сделал значение по-умолчанию (default:                        LineSenderNextState <= LSND_Idle;) и generated clocks сразу пропали. Всем спасибо!

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


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

Странно, а при синтезе разве наличие latch-ей не выдает?

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


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

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
Авторизация