BSACPLD 14 4 июля Опубликовано 4 июля · Жалоба Добрый день, коллеги! Мне наконец пришли платы на 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? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
BSACPLD 14 7 июля Опубликовано 7 июля · Жалоба В итоге получилось вот в таком виде: 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. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
gutzan 0 23 июля Опубликовано 23 июля · Жалоба Здравствуйте. А у Вас задержки в модулях GTP_IODELAY_E2 не управляются (статические)? Наверно их нужно тогда подбирать? Или сделать динамическими и убрать требования set_input_delay. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
BSACPLD 14 23 июля Опубликовано 23 июля · Жалоба Статические, расчетные. Я уже разобрался. Надо было делать клок с помощью GTP_INBUFGDS вместо GTP_INBUFDS. После этого все тайминги сошлись. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться