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

Переход с Artix-7 на Logos2

Добрый день, коллеги!

Мне наконец пришли платы на PangoMicro.

Сейчас пытаюсь разобраться какие примитивы на что подменять при переводе проекта с Xilinx.

Возник ряд вопросов, подскажите, пожалуйста, кто в курсе.

1. IBUFDS подменяем на GTP_INBUFDS?

2. BUFR для того чтобы сделать байтовый клок из битового клока SERDES подменяем на GTP_IOCLKDIV_E2?

3. BUFIO для SERDES подменяем на ????? Может я невнимательно смотрел, но не нашёл аналога данного примитива...

Я сейчас пытаюсь переписать следующий кусок кода на Logos2:

IBUFDS				#(
					.DIFF_TERM             (DIFF_TERM),
					.IBUF_LOW_PWR          ("FALSE"),
					.IOSTANDARD            (IOSTANDARD)
					)
					
					cam_ck_ibufds (
					.I                     (cam_ck_p),
					.IB                    (cam_ck_n),
					.O                     (cam_ck_)
					) ;


BUFIO				cam_ck_bufio (
					.I                     (cam_ck_),		// 1-bit input: Clock input (connect to an IBUF or BUFMR).
					.O                     (cam_ck_hs)		// 1-bit output: Clock output (connect to I/O clock loads).
					) ;


BUFR				#(
					.BUFR_DIVIDE           ("2"),			// Values: "BYPASS, 1, 2, 3, 4, 5, 6, 7, 8" 
					.SIM_DEVICE            ("7SERIES")		// Must be set to "7SERIES" 
					)
					
					cam_ck_bufr (
					.I                     (cam_ck_),		// 1-bit input: Clock buffer input driven by an IBUF, MMCM or local interconnect
					.CLR                   (1'b0),			// 1-bit input: Active high, asynchronous clear (Divided modes only)
					.CE                    (1'b1),			// 1-bit input: Active high, clock enable (Divided modes only)
					.O                     (cam_ck)			// 1-bit output: Clock output port
					) ;

Пока не до конца получается подобрать замену для примитивов Xilinx:

GTP_INBUFDS			#(
					.TERM_DIFF             (DIFF_TERM),
					.IOSTANDARD            (IOSTANDARD)
					)
					
					cam_ck_ibufds (
					.I                     (cam_ck_p),
					.IB                    (cam_ck_n),
					.O                     (cam_ck_)
					) ;

// ??????????????????????????????????
BUFIO				cam_ck_bufio (
					.I                     (cam_ck_),		// 1-bit input: Clock input (connect to an IBUF or BUFMR).
					.O                     (cam_ck_hs)		// 1-bit output: Clock output (connect to I/O clock loads).
					) ;


GTP_IOCLKDIV_E2		#(
					.DIV_FACTOR            ("2")			// Values: "BYPASS, 1, 2, 3, 4, 5, 6, 7, 8" 
					)
					
					cam_ck_bufr (
					.CLKIN                 (cam_ck_),		// 1-bit input: Clock buffer input driven by an IBUF, MMCM or local interconnect
					.RST_N                 (1'b0),			// 1-bit input: Active high, asynchronous clear (Divided modes only)
					.CE                    (1'b1),			// 1-bit input: Active high, clock enable (Divided modes only)
					.CLKDIVOUT             (cam_ck)			// 1-bit output: Clock output port
					) ;

4. IDELAYE2 подменяем на GTP_IODELAY_E2?

5. ISERDESE2 подменяем на GTP_ISERDES_E2?

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


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

В итоге получилось вот в таком виде:

else if (FPGA_VENDOR == "PANGO") begin


GTP_INBUFDS			#(
					.TERM_DIFF             (DIFF_TERM),
					.IOSTANDARD            (IOSTANDARD)
					)
					
					cam_ck_ibufds (
					.I                     (cam_ck_p),
					.IB                    (cam_ck_n),
					.O                     (cam_ck_hs)
					) ;


GTP_IOCLKDIV_E2		#(
					.DIV_FACTOR            ("2")			// Values: "BYPASS, 1, 2, 3, 4, 5, 6, 7, 8" 
					)
					
					cam_ck_bufr (
					.CLKIN                 (cam_ck_hs),
					.RST_N                 (1'b1),
					.CE                    (1'b1),
					.CLKDIVOUT             (cam_ck)
					) ;


for (i=0 ; i<NUM_LVDS ; i=i+1) begin:loop_cam_d


GTP_INBUFDS			#(
					.TERM_DIFF             (DIFF_TERM),
					.IOSTANDARD            (IOSTANDARD)
					)
					
					cam_d_ibufds (
					.I                     (cam_d_p[i]),
					.IB                    (cam_d_n[i]),
					.O                     (cam_d[i])
					) ;


GTP_IODELAY_E2		#(
					.DELAY_STEP_VALUE      (IDELAY_VALUE),
					.DELAY_STEP_SEL        ("PARAMETER"),
					.TDELAY_EN             ("FALSE") 
					)
					
					cam_d_idelaye2 (
					.DELAY_SEL             (1'b1),			// INPUT
					.DELAY_STEP            (8'd0),			// INPUT[7:0]
					.EN_N                  (1'b0),			// INPUT
					.DI                    (cam_d[i]),		// INPUT
					.DO                    (cam_d_[i])		// OUTPUT
					) ;


GTP_ISERDES_E2		#(
					.ISERDES_MODE          ("DDR1TO4"),
					.CASCADE_MODE          ("MASTER"),
					.BITSLIP_EN            ("FALSE"),
					.GRS_EN                ("TRUE"),
					.NUM_ICE               (1'b0),
					.GRS_TYPE_Q0           ("RESET"),
					.GRS_TYPE_Q1           ("RESET"),
					.GRS_TYPE_Q2           ("RESET"),
					.GRS_TYPE_Q3           ("RESET"),
					.LRS_TYPE_Q0           ("ASYNC_RESET"),
					.LRS_TYPE_Q1           ("ASYNC_RESET"),
					.LRS_TYPE_Q2           ("ASYNC_RESET"),
					.LRS_TYPE_Q3           ("ASYNC_RESET")
					)
					
					cam_d_iserdese2 (
					.RST                   (reset),
					.ICE0                  (1'b1),
					.ICE1                  (1'b1),
					.DESCLK                (1'b0),
					.ICLK                  (cam_ck_hs),
					.ICLKB                 (~cam_ck_hs),
					.OCLK                  (1'b0),
					.ICLKDIV               (cam_ck),
					.DI                    (cam_d_[i]),
					.BITSLIP               (1'b0),
					.ISHIFTIN0             (1'b0),
					.ISHIFTIN1             (1'b0),
					.DO                    (cam_d_des_[i]),
					.ISHIFTOUT0            (),
					.ISHIFTOUT1            ()
					) ;


always @(posedge cam_ck) begin
	cam_d_des[i] <= ((INV_LVDS >> i) & 1)? ~cam_d_des_[i] : cam_d_des_[i] ;
end


end	// for (i=0 ; i<NUM_LVDS ; i=i+1) begin:loop_cam_d


end	// if (FPGA_VENDOR == "PANGO")

Проект собирается, но никак не получается правильно прописать тайминги для данного SERDES.

Пробовал как в Vivado:

set_false_path -rise_from [get_clocks {CAM_CK_VIRTUAL}] -rise_to [get_clocks {CAM_CK}]
set_false_path -fall_from [get_clocks {CAM_CK_VIRTUAL}] -fall_to [get_clocks {CAM_CK}]


set_input_delay -clock [get_clocks {CAM_CK_VIRTUAL}] -max  0.500 [get_ports {lvds_io_p[0]}]
set_input_delay -clock [get_clocks {CAM_CK_VIRTUAL}] -min -0.500 [get_ports {lvds_io_p[0]}]
set_input_delay -clock [get_clocks {CAM_CK_VIRTUAL}] -clock_fall -max -add_delay  0.500 [get_ports {lvds_io_p[0]}]
set_input_delay -clock [get_clocks {CAM_CK_VIRTUAL}] -clock_fall -min -add_delay -0.500 [get_ports {lvds_io_p[0]}]

set_input_delay -clock [get_clocks {CAM_CK_VIRTUAL}] -max  0.500 [get_ports {lvds_io_p[1]}]
set_input_delay -clock [get_clocks {CAM_CK_VIRTUAL}] -min -0.500 [get_ports {lvds_io_p[1]}]
set_input_delay -clock [get_clocks {CAM_CK_VIRTUAL}] -clock_fall -max -add_delay  0.500 [get_ports {lvds_io_p[1]}]
set_input_delay -clock [get_clocks {CAM_CK_VIRTUAL}] -clock_fall -min -add_delay -0.500 [get_ports {lvds_io_p[1]}]

set_input_delay -clock [get_clocks {CAM_CK_VIRTUAL}] -max  0.500 [get_ports {lvds_io_p[2]}]
set_input_delay -clock [get_clocks {CAM_CK_VIRTUAL}] -min -0.500 [get_ports {lvds_io_p[2]}]
set_input_delay -clock [get_clocks {CAM_CK_VIRTUAL}] -clock_fall -max -add_delay  0.500 [get_ports {lvds_io_p[2]}]
set_input_delay -clock [get_clocks {CAM_CK_VIRTUAL}] -clock_fall -min -add_delay -0.500 [get_ports {lvds_io_p[2]}]

set_input_delay -clock [get_clocks {CAM_CK_VIRTUAL}] -max  0.500 [get_ports {lvds_io_p[3]}]
set_input_delay -clock [get_clocks {CAM_CK_VIRTUAL}] -min -0.500 [get_ports {lvds_io_p[3]}]
set_input_delay -clock [get_clocks {CAM_CK_VIRTUAL}] -clock_fall -max -add_delay  0.500 [get_ports {lvds_io_p[3]}]
set_input_delay -clock [get_clocks {CAM_CK_VIRTUAL}] -clock_fall -min -add_delay -0.500 [get_ports {lvds_io_p[3]}]

Но в итоге для lvds_io_p[1] тайминги сходятся, а для lvds_io_p[0], lvds_io_p[2], lvds_io_p[3] вылезает slack по hold почти -1.24 ns.

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


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

Здравствуйте. А у Вас задержки в модулях GTP_IODELAY_E2 не управляются (статические)?

Наверно их нужно тогда подбирать?

Или сделать динамическими и убрать требования set_input_delay.

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


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

Статические, расчетные.

Я уже разобрался.

Надо было делать клок с помощью GTP_INBUFGDS вместо GTP_INBUFDS.

После этого все тайминги сошлись.

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


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

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

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

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

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

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

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

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

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