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

en-valb

Участник
  • Постов

    91
  • Зарегистрирован

  • Посещение

Репутация

0 Обычный

Информация о en-valb

  • Звание
    Частый гость
    Частый гость

Информация

  • Город
    Array

Посетители профиля

1 864 просмотра профиля
  1. Всем доброго дня! Есть задача подключить к процессору физик ethernet на RTL8211FSI-VS есть требование о наличии PTP. У RTL8211FSI-VS имеется вход PTP_CLKIN. На него хочу подать от генератора 125 МГц, но в регистре PTP_CLK_CFG RTL8211FSI-VS есть 6:5 биты с помощью которых можно выбрать частоту подаваемую на вход PTP_CLKIN: 10 МГц, 25 МГц и 125 МГц. Предполагаю, что частоты 10 МГц и 25 МГц используются когда период синхронизации на столько велик, что счетчик PTP переполнился бы при частоте 125 МГц. Требований к точности синхронизации нет. Самое простое решение это поставить генератор на одну частоту, но на какую? Или может быть поставить перестраиваемый генератор? Весь интернет обшарил в поисках информации, о PTP, но в основном попадается информация в части программного обеспечения, какой нибудь reference design пусть да же на другой физик найти не смог. Третья неделя как пошла, а окончательного решения принять по этому вопросу ни как не могу. Еще нужно раздать этот сигнал на 2 физика, может кто подскажет тактовые буфферы доступные сейчас к покупке, китайские какие нибудь.
  2. Заработало! В инструкции Gowin_EMPU_M1 Download Reference Design есть ссылка на архив с разными проектами там есть в папке solution проект DK_START_GW1N9_V1.1 с контроллером flash памяти. В проекте DK_START_GW1N9_V1.1 есть файл userflash_controller.v необходимо этот файл включить в проект вместо IP Gowin Flash Controller. Почему то в IP Core Generator Gowin Flash Controller не поддерживает режим отображения памяти. Хотя в описании ядра написано "...and AHB Bus interface is to connect AHB Bus in MCU with AHB Bus, as an instruction memory or data storage for MCU...". Ссылка на проект.
  3. Всем доброго дня! Плата Tang Nano 9k c FPGA GW1NR-LV9QN88PC6/I5 ревизия C. Поднимаю SoC Cortex-M1. Пытаюсь запустить программу из User Flash. Для этого в настройках ядра Cortex-M1 вкладка Memory в разделе ITCM Select устанавливаю External Instruction Memory. В keil соответственно прописываю для: IROM1 - Start 0x00000000, Size 0x10000, IRAM1 - Start 0x20000000, Size 0x8000. Компилирую HW и SW в настройках Gowin Programmer указываю MCU Mode L и добавляю файлы *.fs и *.bin сохраняю. Все в соответствии с инструкцией Gowin_EMPU_M1 Download Reference Design на странице 15(17) глава 5 Embedded UserFlash Download. Прошиваю ПЛИС, аппаратная часть запускается (видно по 4-м светодиодам которые подтянуты pull up), но программа не стартует. Флеш память подключаю через IP блок Gowin Flash Controller в настройках указываю шину AHB. Тут я интуитивно принял решение так как сигналы которые выпускает Cortex-M1 на внешнюю флешь соответствуют сигналам шины AHB. Возможно я здесь что то не правильно сделал. В инструкции ни чего по этому поводу не нашел. В Gowin_EMPU_M1 Download Reference Design в разделе 5.3 Design Flow, в пункте 3 сказано "Instantiate UserFlash Controller (GW1N-9C/GW1NR-9C FLASH608K) Memory Map as the instruction memory of Gowin_EMPU_M1." Этот пункт я закрыл как писал выше Gowin Flash Controller-ом. Ссылка на проект. `resetall module Gowin_EMPU_M1_template ( LED, TDI, TMS, TCK, TDO, UART1RXD, UART1TXD, HCLK, //System Clock hwRstn //System Reset ); input HCLK; // System clock input hwRstn; // System reset //UART0 input UART1RXD; output UART1TXD; //JTAG inout TDI; inout TMS; inout TCK; inout TDO; //LED output [3:0] LED; wire MCLK; //mcu clock Gowin_rPLL u_Gowin_rPLL ( .clkout(MCLK), //output clkout 40MHz .clkin(HCLK) //input clkin 50MHz ); wire [31:0] EXTFLASH_HRDATA; wire EXTFLASH_HREADY; wire [1:0] EXTFLASH_HRESP; wire [1:0] EXTFLASH_HTRANS; wire [2:0] EXTFLASH_HSIZE; wire EXTFLASH_HWRITE; wire [31:0] EXTFLASH_HADDR; wire [31:0] EXTFLASH_HWDATA; wire EXTFLASH_HSEL; wire EXTFLASH_HCLK; Gowin_EMPU_M1_Top your_instance_name( .LOCKUP(), //output LOCKUP .HALTED(), //output HALTED .GPIOIN(16'h0000), //input [15:0] GPIOIN .GPIOOUT(LED), //output [15:0] GPIOOUT .GPIOOUTEN(), //output [15:0] GPIOOUTEN .JTAG_3(), //inout JTAG_3 .JTAG_4(), //inout JTAG_4 .JTAG_5(TDI), //inout JTAG_5 .JTAG_6(), //inout JTAG_6 .JTAG_7(TMS), //inout JTAG_7 .JTAG_8(), //inout JTAG_8 .JTAG_9(TCK), //inout JTAG_9 .JTAG_10(), //inout JTAG_10 .JTAG_11(), //inout JTAG_11 .JTAG_12(), //inout JTAG_12 .JTAG_13(TDO), //inout JTAG_13 .JTAG_14(), //inout JTAG_14 .JTAG_15(), //inout JTAG_15 .JTAG_16(), //inout JTAG_16 .JTAG_17(), //inout JTAG_17 .JTAG_18(), //inout JTAG_18 .UART0RXD(1'b0), //input UART0RXD .UART0TXD(), //output UART0TXD .UART1RXD(UART1RXD), //input UART1RXD .UART1TXD(UART1TXD), //output UART1TXD .TIMER0EXTIN(1'b0), //input TIMER0EXTIN .TIMER1EXTIN(1'b0), //input TIMER1EXTIN .EXTFLASH0HRDATA(EXTFLASH_HRDATA), //input [31:0] EXTFLASH0HRDATA .EXTFLASH0HREADYOUT(EXTFLASH_HREADY), //input EXTFLASH0HREADYOUT .EXTFLASH0HRESP(EXTFLASH_HRESP), //input [1:0] EXTFLASH0HRESP .EXTFLASH0HTRANS(EXTFLASH_HTRANS), //output [1:0] EXTFLASH0HTRANS .EXTFLASH0HBURST(), //output [2:0] EXTFLASH0HBURST .EXTFLASH0HPROT(), //output [3:0] EXTFLASH0HPROT .EXTFLASH0HSIZE(EXTFLASH_HSIZE), //output [2:0] EXTFLASH0HSIZE .EXTFLASH0HWRITE(EXTFLASH_HWRITE), //output EXTFLASH0HWRITE .EXTFLASH0HREADYMUX(), //output EXTFLASH0HREADYMUX .EXTFLASH0HMASTER(), //output [3:0] EXTFLASH0HMASTER .EXTFLASH0HMASTLOCK(), //output EXTFLASH0HMASTLOCK .EXTFLASH0HADDR(EXTFLASH_HADDR), //output [31:0] EXTFLASH0HADDR .EXTFLASH0HWDATA(EXTFLASH_HWDATA), //output [31:0] EXTFLASH0HWDATA .EXTFLASH0HSEL(EXTFLASH_HSEL), //output EXTFLASH0HSEL .EXTFLASH0HCLK(EXTFLASH_HCLK), //output EXTFLASH0HCLK .EXTFLASH0HRESET(EXTFLASH_HRESETn), //output EXTFLASH0HRESET .HCLK(MCLK), //input HCLK .hwRstn(hwRstn) //input hwRstn ); Gowin_Flash_Controller_Top program_flash_memory ( .AHB_HRDATA(EXTFLASH_HRDATA), //output [31:0] AHB_HRDATA .AHB_HREADY(EXTFLASH_HREADY), //output AHB_HREADY .AHB_HRESP(EXTFLASH_HRESP), //output [1:0] AHB_HRESP .AHB_HTRANS(EXTFLASH_HTRANS), //input [1:0] AHB_HTRANS .AHB_HSIZE(EXTFLASH_HSIZE), //input [2:0] AHB_HSIZE .AHB_HWRITE(EXTFLASH_HWRITE), //input AHB_HWRITE .AHB_HADDR(EXTFLASH_HADDR), //input [31:0] AHB_HADDR .AHB_HWDATA(EXTFLASH_HWDATA), //input [31:0] AHB_HWDATA .AHB_HSEL(EXTFLASH_HSEL), //input AHB_HSEL .AHB_HCLK(EXTFLASH_HCLK), //input AHB_HCLK .AHB_HRESETn(EXTFLASH_HRESETn) //input AHB_HRESETn ); endmodule Что я мог здесь пропустить? BSRAM в качестве ITCM в соответствии с главой 2 инструкции Gowin_EMPU_M1 Download Reference Design у меня все заработало.
  4. Вот теперь правильный и hold и setup!!! Значения перепутал, в min и max. В min вбил значение максимальной задержки, а в max значение минимальной задержки. #************************************************************** # Set Output Delay #************************************************************** # максимальная задержка клока до ПЛИС (задержка от источника тактовой частоты до плис по печатным проводникам через разъем HSMC) set CLK_bs_delay_max 0.1 # максимальная задержка данных от ПЛИС до ЦАП (задержка данных от портов плис по печатным проводникам через разъем HSMC до ЦАП) set DATA_delay_max 0.1 # минимальная задержка клока до ЦАП (задержка от источника тактовой частоты через мультиплексор 0.7 ns + буфер дифпары минимальная задержка 0.9 ns) #set CLK_bd_delay_min 3.45 set CLK_bd_delay_min 1.7 #(tSU ЦАП по справочнику) set tSU 1.0 set tmax [expr $CLK_bs_delay_max + $tSU + $DATA_delay_max - $CLK_bd_delay_min] #set tmax [expr $CLK_bs_delay_max + $tSU + $DATA_delay_max] # минимальная задержка клока до ПЛИС (задержка от источника тактовой частоты до плис по печатным проводникам через разъем HSMC) set CLK_bs_delay_min 0.1 # минимальная задержка данных от ПЛИС до ЦАП (задержка данных от портов плис по печатным проводникам через разъем HSMC до ЦАП) set DATA_delay_min 0.1 # максимальная задержка клока до ЦАП (задержка от источника тактовой частоты через мультиплексор 0.7 ns + буфер дифпары минимальная задержка 2.5 ns) #set CLK_bd_delay_max 5.55 set CLK_bd_delay_max 3.3 #(tH ЦАП по справочнику) set tH 1.0 set tmin [expr $CLK_bs_delay_min - $tH + $DATA_delay_min - $CLK_bd_delay_max] #set tmin [expr $CLK_bs_delay_min - $tH + $DATA_delay_min] Теперь похоже на правду). des00, благодарю за помощь от всей души!!!
  5. Добавил задержку CLK по плате на ЦАП, Time Quest ругаться перестал. #************************************************************** # Set Output Delay #************************************************************** # максимальная задержка клока до ПЛИС (задержка от источника тактовой частоты до плис по печатным проводникам через разъем HSMC) set CLK_bs_delay_max 0.1 # максимальная задержка данных от ПЛИС до ЦАП (задержка данных от портов плис по печатным проводникам через разъем HSMC до ЦАП) set DATA_delay_max 0.1 # минимальная задержка клока до ЦАП (задержка от источника тактовой частоты через мультиплексор 0.7 ns + буфер дифпары минимальная задержка 0.9 ns) #set CLK_bd_delay_min 3.45 set CLK_bd_delay_min 3.3 #(tSU ЦАП по справочнику) set tSU 1.0 set tmax [expr $CLK_bs_delay_max + $tSU + $DATA_delay_max - $CLK_bd_delay_min] #set tmax [expr $CLK_bs_delay_max + $tSU + $DATA_delay_max] # минимальная задержка клока до ПЛИС (задержка от источника тактовой частоты до плис по печатным проводникам через разъем HSMC) set CLK_bs_delay_min 0.1 # минимальная задержка данных от ПЛИС до ЦАП (задержка данных от портов плис по печатным проводникам через разъем HSMC до ЦАП) set DATA_delay_min 0.1 # максимальная задержка клока до ЦАП (задержка от источника тактовой частоты через мультиплексор 0.7 ns + буфер дифпары минимальная задержка 2.5 ns) #set CLK_bd_delay_max 5.55 set CLK_bd_delay_max 1.7 #(tH ЦАП по справочнику) set tH 1.0 set tmin [expr $CLK_bs_delay_min - $tH + $DATA_delay_min - $CLK_bd_delay_max] #set tmin [expr $CLK_bs_delay_min - $tH + $DATA_delay_min] Но теперь по холду подозрительно огромный запас получился. Я видимо с CLK_bd_delay_min и CLK_bd_delay_max перестарался, хотя вроде как по даташиту.
  6. На счет задержки по плате, у AD/DA Data Conversion Card между CLK_IN_P куда я генератор подключил и ЦАП стоит две микросхемы, мультиплексор и буфер. На мультиплексор по даташит propagation delay 0.7 ns, а на буфер от 0.9 ns до 2.5 ns дополнительно какая то задержка по плате, пусть 0.1 ns. В сторону ПЛИС тактовая идет напрямую через разъем на выводы AA26, AB27. Соответственно в формулу я должен включить суммарную задержку CLK_bd_delay_min = 0.7+0.9+0.1 и CLK_bd_delay_max = 0.7+2.5+0.1. Я правильно понимаю? Стало значительно лучше! #************************************************************** # Set Output Delay #************************************************************** # максимальная задержка клока до ПЛИС (задержка от источника тактовой частоты до плис по печатным проводникам через разъем HSMC) set CLK_bs_delay_max 0.1 # максимальная задержка данных от ПЛИС до ЦАП (задержка данных от портов плис по печатным проводникам через разъем HSMC до ЦАП) set DATA_delay_max 0.1 # минимальная задержка клока до ЦАП (задержка от источника тактовой частоты через мультиплексор 0.7 ns + буфер дифпары минимальная задержка 0.9 ns) #set CLK_bd_delay_min 3.45 set CLK_bd_delay_min 3.3 #(tSU ЦАП по справочнику) set tSU 1.0 #set tmax [expr $CLK_bs_delay_max + $tSU + $DATA_delay_max - $CLK_bd_delay_min] set tmax [expr $CLK_bs_delay_max + $tSU + $DATA_delay_max] # минимальная задержка клока до ПЛИС (задержка от источника тактовой частоты до плис по печатным проводникам через разъем HSMC) set CLK_bs_delay_min 0.1 # минимальная задержка данных от ПЛИС до ЦАП (задержка данных от портов плис по печатным проводникам через разъем HSMC до ЦАП) set DATA_delay_min 0.1 # максимальная задержка клока до ЦАП (задержка от источника тактовой частоты через мультиплексор 0.7 ns + буфер дифпары минимальная задержка 2.5 ns) #set CLK_bd_delay_max 5.55 set CLK_bd_delay_max 1.7 #(tH ЦАП по справочнику) set tH 1.0 #set tmin [expr $CLK_bs_delay_min - $tH + $DATA_delay_min - $CLK_bd_delay_max] set tmin [expr $CLK_bs_delay_min - $tH + $DATA_delay_min] set_output_delay -add_delay -max -clock [get_clocks {dac_clk}] $tmax [get_ports {lfm_out[0]}] set_output_delay -add_delay -min -clock [get_clocks {dac_clk}] $tmin [get_ports {lfm_out[0]}] set_output_delay -add_delay -max -clock [get_clocks {dac_clk}] $tmax [get_ports {lfm_out[1]}] set_output_delay -add_delay -min -clock [get_clocks {dac_clk}] $tmin [get_ports {lfm_out[1]}] set_output_delay -add_delay -max -clock [get_clocks {dac_clk}] $tmax [get_ports {lfm_out[2]}] set_output_delay -add_delay -min -clock [get_clocks {dac_clk}] $tmin [get_ports {lfm_out[2]}] set_output_delay -add_delay -max -clock [get_clocks {dac_clk}] $tmax [get_ports {lfm_out[3]}] set_output_delay -add_delay -min -clock [get_clocks {dac_clk}] $tmin [get_ports {lfm_out[3]}] set_output_delay -add_delay -max -clock [get_clocks {dac_clk}] $tmax [get_ports {lfm_out[4]}] set_output_delay -add_delay -min -clock [get_clocks {dac_clk}] $tmin [get_ports {lfm_out[4]}] set_output_delay -add_delay -max -clock [get_clocks {dac_clk}] $tmax [get_ports {lfm_out[5]}] set_output_delay -add_delay -min -clock [get_clocks {dac_clk}] $tmin [get_ports {lfm_out[5]}] set_output_delay -add_delay -max -clock [get_clocks {dac_clk}] $tmax [get_ports {lfm_out[6]}] set_output_delay -add_delay -min -clock [get_clocks {dac_clk}] $tmin [get_ports {lfm_out[6]}] set_output_delay -add_delay -max -clock [get_clocks {dac_clk}] $tmax [get_ports {lfm_out[7]}] set_output_delay -add_delay -min -clock [get_clocks {dac_clk}] $tmin [get_ports {lfm_out[7]}] set_output_delay -add_delay -max -clock [get_clocks {dac_clk}] $tmax [get_ports {lfm_out[8]}] set_output_delay -add_delay -min -clock [get_clocks {dac_clk}] $tmin [get_ports {lfm_out[8]}] set_output_delay -add_delay -max -clock [get_clocks {dac_clk}] $tmax [get_ports {lfm_out[9]}] set_output_delay -add_delay -min -clock [get_clocks {dac_clk}] $tmin [get_ports {lfm_out[9]}] set_output_delay -add_delay -max -clock [get_clocks {dac_clk}] $tmax [get_ports {lfm_out[10]}] set_output_delay -add_delay -min -clock [get_clocks {dac_clk}] $tmin [get_ports {lfm_out[10]}] set_output_delay -add_delay -max -clock [get_clocks {dac_clk}] $tmax [get_ports {lfm_out[11]}] set_output_delay -add_delay -min -clock [get_clocks {dac_clk}] $tmin [get_ports {lfm_out[11]}] set_output_delay -add_delay -max -clock [get_clocks {dac_clk}] $tmax [get_ports {lfm_out[12]}] set_output_delay -add_delay -min -clock [get_clocks {dac_clk}] $tmin [get_ports {lfm_out[12]}] set_output_delay -add_delay -max -clock [get_clocks {dac_clk}] $tmax [get_ports {lfm_out[13]}] set_output_delay -add_delay -min -clock [get_clocks {dac_clk}] $tmin [get_ports {lfm_out[13]}]
  7. А ведь действительно, видимо глянул в даташит ADC по ошибке, на бумажку выписал tsu и th, и больше не сверялся. Внимательности у меня конечно не занимать. Премного благодарен!!! Сейчас все исправлю.
  8. Не выходит каменный цветок! Двинул фазу на +90, Time Ques перестал выдавать ошибки, но сигнал на выходе ЦАП испортился.
  9. Вот что получилось: Создал виртуальный клок dac_clk #************************************************************** # Create Clock #************************************************************** create_clock -name {refclk} -period 10.000 -waveform { 0.000 5.000 } [get_ports {refclk}] create_clock -name {dac_clk} -period 10.000 -waveform { 0.000 5.000 } Объединил входной клок refclk и виртуальный клок dac_clk в эксклюзивную группу #************************************************************** # Set Clock Groups #************************************************************** set_clock_groups -exclusive -group [get_clocks {dac_clk refclk}] И переписал set_output_delay #************************************************************** # Set Output Delay #************************************************************** # максимальная задержка клока до ПЛИС (задержка от источника тактовой частоты до плис по печатным проводникам через разъем HSMC) set CLK_bs_delay_max 0.2 # максимальная задержка данных от ПЛИС до ЦАП (задержка данных от портов плис по печатным проводникам через разъем HSMC до ЦАП) set DATA_delay_max 0.5 # минимальная задержка клока до ЦАП (задержка от источника тактовой частоты через мультиплексор 0.7 ns + буфер дифпары минимальная задержка 0.9 ns) set CLK_bd_delay_min 1.6 #(tSU ЦАП по справочнику) set tSU 2.9 # минимальная задержка клока до ПЛИС (задержка от источника тактовой частоты до плис по печатным проводникам через разъем HSMC) set CLK_bs_delay_min 0.2 # минимальная задержка данных от ПЛИС до ЦАП (задержка данных от портов плис по печатным проводникам через разъем HSMC до ЦАП) set DATA_delay_min 0.5 # максимальная задержка клока до ЦАП (задержка от источника тактовой частоты через мультиплексор 0.7 ns + буфер дифпары минимальная задержка 2.5 ns) set CLK_bd_delay_max 3.2 #(tH ЦАП по справочнику) set tH 3.8 set_output_delay -add_delay -max -clock [get_clocks {dac_clk}] [expr $CLK_bs_delay_max + $tSU + $DATA_delay_max - $CLK_bd_delay_min] [get_ports {lfm_out[0]}] set_output_delay -add_delay -min -clock [get_clocks {dac_clk}] [expr $CLK_bs_delay_min - $tH + $DATA_delay_min - $CLK_bd_delay_max] [get_ports {lfm_out[0]}] set_output_delay -add_delay -max -clock [get_clocks {dac_clk}] [expr $CLK_bs_delay_max + $tSU + $DATA_delay_max - $CLK_bd_delay_min] [get_ports {lfm_out[1]}] set_output_delay -add_delay -min -clock [get_clocks {dac_clk}] [expr $CLK_bs_delay_min - $tH + $DATA_delay_min - $CLK_bd_delay_max] [get_ports {lfm_out[1]}] set_output_delay -add_delay -max -clock [get_clocks {dac_clk}] [expr $CLK_bs_delay_max + $tSU + $DATA_delay_max - $CLK_bd_delay_min] [get_ports {lfm_out[2]}] set_output_delay -add_delay -min -clock [get_clocks {dac_clk}] [expr $CLK_bs_delay_min - $tH + $DATA_delay_min - $CLK_bd_delay_max] [get_ports {lfm_out[2]}] set_output_delay -add_delay -max -clock [get_clocks {dac_clk}] [expr $CLK_bs_delay_max + $tSU + $DATA_delay_max - $CLK_bd_delay_min] [get_ports {lfm_out[3]}] set_output_delay -add_delay -min -clock [get_clocks {dac_clk}] [expr $CLK_bs_delay_min - $tH + $DATA_delay_min - $CLK_bd_delay_max] [get_ports {lfm_out[3]}] set_output_delay -add_delay -max -clock [get_clocks {dac_clk}] [expr $CLK_bs_delay_max + $tSU + $DATA_delay_max - $CLK_bd_delay_min] [get_ports {lfm_out[4]}] set_output_delay -add_delay -min -clock [get_clocks {dac_clk}] [expr $CLK_bs_delay_min - $tH + $DATA_delay_min - $CLK_bd_delay_max] [get_ports {lfm_out[4]}] set_output_delay -add_delay -max -clock [get_clocks {dac_clk}] [expr $CLK_bs_delay_max + $tSU + $DATA_delay_max - $CLK_bd_delay_min] [get_ports {lfm_out[5]}] set_output_delay -add_delay -min -clock [get_clocks {dac_clk}] [expr $CLK_bs_delay_min - $tH + $DATA_delay_min - $CLK_bd_delay_max] [get_ports {lfm_out[5]}] set_output_delay -add_delay -max -clock [get_clocks {dac_clk}] [expr $CLK_bs_delay_max + $tSU + $DATA_delay_max - $CLK_bd_delay_min] [get_ports {lfm_out[6]}] set_output_delay -add_delay -min -clock [get_clocks {dac_clk}] [expr $CLK_bs_delay_min - $tH + $DATA_delay_min - $CLK_bd_delay_max] [get_ports {lfm_out[6]}] set_output_delay -add_delay -max -clock [get_clocks {dac_clk}] [expr $CLK_bs_delay_max + $tSU + $DATA_delay_max - $CLK_bd_delay_min] [get_ports {lfm_out[7]}] set_output_delay -add_delay -min -clock [get_clocks {dac_clk}] [expr $CLK_bs_delay_min - $tH + $DATA_delay_min - $CLK_bd_delay_max] [get_ports {lfm_out[7]}] set_output_delay -add_delay -max -clock [get_clocks {dac_clk}] [expr $CLK_bs_delay_max + $tSU + $DATA_delay_max - $CLK_bd_delay_min] [get_ports {lfm_out[8]}] set_output_delay -add_delay -min -clock [get_clocks {dac_clk}] [expr $CLK_bs_delay_min - $tH + $DATA_delay_min - $CLK_bd_delay_max] [get_ports {lfm_out[8]}] set_output_delay -add_delay -max -clock [get_clocks {dac_clk}] [expr $CLK_bs_delay_max + $tSU + $DATA_delay_max - $CLK_bd_delay_min] [get_ports {lfm_out[9]}] set_output_delay -add_delay -min -clock [get_clocks {dac_clk}] [expr $CLK_bs_delay_min - $tH + $DATA_delay_min - $CLK_bd_delay_max] [get_ports {lfm_out[9]}] set_output_delay -add_delay -max -clock [get_clocks {dac_clk}] [expr $CLK_bs_delay_max + $tSU + $DATA_delay_max - $CLK_bd_delay_min] [get_ports {lfm_out[10]}] set_output_delay -add_delay -min -clock [get_clocks {dac_clk}] [expr $CLK_bs_delay_min - $tH + $DATA_delay_min - $CLK_bd_delay_max] [get_ports {lfm_out[10]}] set_output_delay -add_delay -max -clock [get_clocks {dac_clk}] [expr $CLK_bs_delay_max + $tSU + $DATA_delay_max - $CLK_bd_delay_min] [get_ports {lfm_out[11]}] set_output_delay -add_delay -min -clock [get_clocks {dac_clk}] [expr $CLK_bs_delay_min - $tH + $DATA_delay_min - $CLK_bd_delay_max] [get_ports {lfm_out[11]}] set_output_delay -add_delay -max -clock [get_clocks {dac_clk}] [expr $CLK_bs_delay_max + $tSU + $DATA_delay_max - $CLK_bd_delay_min] [get_ports {lfm_out[12]}] set_output_delay -add_delay -min -clock [get_clocks {dac_clk}] [expr $CLK_bs_delay_min - $tH + $DATA_delay_min - $CLK_bd_delay_max] [get_ports {lfm_out[12]}] set_output_delay -add_delay -max -clock [get_clocks {dac_clk}] [expr $CLK_bs_delay_max + $tSU + $DATA_delay_max - $CLK_bd_delay_min] [get_ports {lfm_out[13]}] set_output_delay -add_delay -min -clock [get_clocks {dac_clk}] [expr $CLK_bs_delay_min - $tH + $DATA_delay_min - $CLK_bd_delay_max] [get_ports {lfm_out[13]}] Теперь на диаграмме вижу, что запускающий клок это refclk, а защелкивающий клок это dac_clk Картина поменялась в лучшую сторону, но все еще не достаточно. Теперь как я понимаю необходимо подключить тактирование внутренней логики к выходу PLL и немного пододвинуть запускающий клок? Вы это имеете ввиду? module ddio( input wire d0, input wire d1, input wire clk, output wire out ); reg r_d0; reg r_d1; always @(posedge clk) begin r_d0 <= d0; r_d1 <= d1; end assign out = clk ? r_d0 : r_d1; endmodule Сейчас у меня вот так Такой вариант хуже? DDIO мне наверное не нужен, мне дифференциальную пару тактового сигнала на ПЛИС завести надо, а на ЦАП идет 14-ти разрядная параллельная шина униполярных сигналов.
  10. Переключил внутреннюю логику на входную частоту от которой непосредственно ЦАП тактируется, выход PLL сейчас висит не подключенный. Задал констрейны: set_output_delay -add_delay -max -clock [get_clocks {refclk}] 2.900 [get_ports {lfm_out[0]}] set_output_delay -add_delay -min -clock [get_clocks {refclk}] 3.800 [get_ports {lfm_out[0]}] set_output_delay -add_delay -max -clock [get_clocks {refclk}] 2.900 [get_ports {lfm_out[1]}] set_output_delay -add_delay -min -clock [get_clocks {refclk}] 3.800 [get_ports {lfm_out[1]}] set_output_delay -add_delay -max -clock [get_clocks {refclk}] 2.900 [get_ports {lfm_out[2]}] set_output_delay -add_delay -min -clock [get_clocks {refclk}] 3.800 [get_ports {lfm_out[2]}] set_output_delay -add_delay -max -clock [get_clocks {refclk}] 2.900 [get_ports {lfm_out[3]}] set_output_delay -add_delay -min -clock [get_clocks {refclk}] 3.800 [get_ports {lfm_out[3]}] set_output_delay -add_delay -max -clock [get_clocks {refclk}] 2.900 [get_ports {lfm_out[4]}] set_output_delay -add_delay -min -clock [get_clocks {refclk}] 3.800 [get_ports {lfm_out[4]}] set_output_delay -add_delay -max -clock [get_clocks {refclk}] 2.900 [get_ports {lfm_out[5]}] set_output_delay -add_delay -min -clock [get_clocks {refclk}] 3.800 [get_ports {lfm_out[5]}] set_output_delay -add_delay -max -clock [get_clocks {refclk}] 2.900 [get_ports {lfm_out[6]}] set_output_delay -add_delay -min -clock [get_clocks {refclk}] 3.800 [get_ports {lfm_out[6]}] set_output_delay -add_delay -max -clock [get_clocks {refclk}] 2.900 [get_ports {lfm_out[7]}] set_output_delay -add_delay -min -clock [get_clocks {refclk}] 3.800 [get_ports {lfm_out[7]}] set_output_delay -add_delay -max -clock [get_clocks {refclk}] 2.900 [get_ports {lfm_out[8]}] set_output_delay -add_delay -min -clock [get_clocks {refclk}] 3.800 [get_ports {lfm_out[8]}] set_output_delay -add_delay -max -clock [get_clocks {refclk}] 2.900 [get_ports {lfm_out[9]}] set_output_delay -add_delay -min -clock [get_clocks {refclk}] 3.800 [get_ports {lfm_out[9]}] set_output_delay -add_delay -max -clock [get_clocks {refclk}] 2.900 [get_ports {lfm_out[10]}] set_output_delay -add_delay -min -clock [get_clocks {refclk}] 3.800 [get_ports {lfm_out[10]}] set_output_delay -add_delay -max -clock [get_clocks {refclk}] 2.900 [get_ports {lfm_out[11]}] set_output_delay -add_delay -min -clock [get_clocks {refclk}] 3.800 [get_ports {lfm_out[11]}] set_output_delay -add_delay -max -clock [get_clocks {refclk}] 2.900 [get_ports {lfm_out[12]}] set_output_delay -add_delay -min -clock [get_clocks {refclk}] 3.800 [get_ports {lfm_out[12]}] set_output_delay -add_delay -max -clock [get_clocks {refclk}] 2.900 [get_ports {lfm_out[13]}] set_output_delay -add_delay -min -clock [get_clocks {refclk}] 3.800 [get_ports {lfm_out[13]}] Сигнал на осциллографе хороший. На диаграмме выше видно, что запускающий clock задержан на 7.308 ns. Или это можно рассматривать как сдвиг фазы на 7.308 ns? Тогда нужно фазу пододвинуть, с помощью PLL наверное?
  11. andrew_b, благодарю за помощь, планировал от внешнего 10 МГц все затактировать, но видимо придется 100 МГц генератор покупать. В pin planer для входной частоты сделал I/O Standart дифференциальный вход. Теперь этот вход 100 МГц (раньше был 50 МГц). Подключил его на PLL. У PLL теперь на входе и выходе 100 МГц. Оставил его(PLL) так как далее скорее всего понадобятся другие частоты. sdc файл полностью переделал, во вложении. Остальное пока не трогал. На AD/DA Data Conversion Card допаял перемычку на R111 чтобы вход CLK сделать униполярным и подал на него с генератора 100 МГц. Все картинки на осциллографе хорошие, но пока не заданы констрейны set_output_delay. Буду разбираться как их описать под новую конфигурацию схемы тактирования ЦАП. dds.out.sdc
  12. Всем доброго дня! Прошу помочь, не могу разобраться, что делаю не так. Имеется: 1. SoCKit 2. AD/DA Data Conversion Card Генерирую ЛЧМ сигнал с помощью NCO. С помощью TimeQuest в GUI задал констрейны: 1. На входную тактовую частоту 50 МГц поступающую на PLL. 2. create_generated_clock на порождаемый с помощью PLL клок 100 МГц от входного клока 50 МГц 3. На выходную тактовую частоту из ПЛИС для DAC которая является дифференциальной. Для каждого порта dac_clk_p и dac_clk_n отдельный create_generated_clock исходя из соображений, что эти клоки порождаемые от выходной из PLL частоты 100 МГц. а) Правильно ли я тут сделал, исходя из того что assign dac_clk_p = clk_100MHz; assign dac_clk_n = ~clk_100MHz; б) Нужно ли мне объединять в эксклюзивную группу dac_clk_p и dac_clk_n? Как я понял в группу объединяются синхронные клоки здесь как раз такой случай. 4. set_output_delay -min и set_output_delay -max на порты поступающие от ПЛИС на ЦАП относительно dac_clk_p. В соответствии с datasheet на ЦАП для -min задал значение th = 3.8 nS, для -max tsu = 2.9 nS. Проблема в том, что если не задавать констрейны set_output_delay сигнал на выходе ЦАП чистый, но если задать сигнал зашумлен (иголки). Предполагаю, что я не верно задаю set_output_delay и ухудшаю параметры по tsu/th сигналов поступающих на ЦАП. dds.out.sdc dds.out_Set_Output_Delay.sdc
  13. Так и понял. Подбираюсь потихоньку к Hyperlinx. На плату пока резисторы 0 Ом по шине данных поставил на всякий случай. Спасибо!
  14. Пытаюсь понять на сколько адекватные результаты моделирования.
×
×
  • Создать...