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

EgorT

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

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

Весь контент EgorT


  1. Работал с этой компанией. Остались смешанные чувства. С одной стороны вроде бы все честно - они заключают с вами контракт, пересылают денежки на долларовый счет, предлагают вам создать ИП для вашей же безопасности (то есть как вам налоги платить решаете вы), с другой стороны здесь все минусы удаленной работы с китайцами. Работают у них несколько русскоговорящих (из России и может есть с Украины), как всегда индусы, египтяне и китайцы. Это не подработка, а именно полная занятость с увольнением с предыдущей работы, они это требуют. Начальник с которым придется работать Ronald Hui, будет вам присылать тз по скайпу, составленное кривоватым английским языком и этот же начальник будет в 4 утра (по Москве) спрашивать вас по скайпу "Как дела? Сегодня будет готов модуль?", объяснить ему, что у вас разные часовые пояса не представляется возможным. Так как они делают свои чипы, то пытаются выжать максимум в плане экономии ресурсов. Если не удалось сэкономить ресурсы, то выкидывают часть функциональности, на этом у меня и подгорело, сделал им модуль, протестировал, всё ок, по ресурсам экономичнее некуда, но, видимо, по ресурсам всеравно не вписывался в их план, в итоге этот Ronald пишет, что надо убрать одну весьма нетривиальную функцию (над которой я мозг ломал неделю), ну я и плюнул. Сам по себе начальник Ronald Hui оставляет впечатление компетентного, но некоторые разработчики-индусы, модули которых пришлось проверять и тестировать не оставили такого впечатления.
  2. Design Partition вроде как доступен для бесплатной версии. Нет, не доступен.
  3. Видимо, в вашей конкретной АЦП не отключается.
  4. Ну вот же у вас в даташите на АЦП написано, что для обозначения конца фрейма можно использовать один из трех символов, К28.7, К28.1, К28.5. Очевидно, что у вас используется К28.5. Другое дело, что по умолчанию должен быть К28.7, но если вы как-то инициализируете АЦП, то может быть и пишете что-то в этот регистр.
  5. В нём есть замены, но заменяется на другой символ, BC это символ синхронизации, в нормальных данных он не должен всплывать. В некоторых АЦП можно отключать замену.
  6. Вот есть такой же вопрос https://forums.xilinx.com/t5/Timing-Analysis/How-to-calculate-max-and-min-Data-delays-on-board-trace-delay-in/td-p/331227
  7. Это задержка прохождения сигнала по плате.
  8. Так в следующем посте doom13 задал эти фалзпасы и опять пакеты терялись и т.д.
  9. Попробуйте написать так: create_clock -period 8.000 -name LAN_RXC -waveform {2.000 6.000} [get_ports LAN_RXC] А вообще, у меня уже давно появляется сомнение в том, что констрейны для RGMII работают. Много раз было такое, что не прописываешь констрейны и интерфейс отлично работает, а когда прописываешь - появляются ошибки. Даже в официальных отладочных платах с референс дизайном, где прописаны все констрейны и т.д. сетевой интерфейс (RGMII) работает с ошибками и возникает вопрос: почему?
  10. Не уверен, но, возможно, это работатет только в Windows версии.
  11. Ну тогда Вам точно не обойтись без описания констрейнов в sdc файле. Кроме того, добавляя кучу клоков, сдвинутых по фазе, Вы создадите себе еще больше проблем. Начните с sdc файла, почему Вы еще этого не сделали.
  12. Макимальная частота, с которой может работать RAM (M10K Block) в Cyclone V со speed-grade -С6 - 315 МГц, в тестовом проекте вполне возможно вы уложились в это ограничение, в проекте побольше уже не уложились. Попробуйте сначала задать клок в sdc файле, потом посмотреть репорт. И каким образом Вы задерживаете клок?
  13. Это у Вас NCO на 5 МГц не работает? Как реализовывали? Если на RAM, то очень странно, если на регистрах, то может действительно не работает, что тоже странно. Что в констрейнах задавали? А понял, вы генерите 5 МГц, Тогда какую частоту подаёте на NCO?
  14. Скорее всего Вы не досмотрели. Работаю с Cyclone 10 LP, FIR II есть.
  15. Попробуйте Custom PHY, на Cyclone V, 5 гигабит нормально поднимаются.
  16. Ещё более интересно будет ли версия чипа с процессором (ARM)?
  17. Не помню, чтобы блок initial не инициализировал у меня память в Quartus. Насколько я помню, можно даже файл с инит-данными прочитать. // Quartus II Verilog Template // Single port RAM with single read/write address and initial contents // specified with an initial block module single_port_ram_with_init #(parameter DATA_WIDTH=8, parameter ADDR_WIDTH=6) ( input [(DATA_WIDTH-1):0] data, input [(ADDR_WIDTH-1):0] addr, input we, clk, output [(DATA_WIDTH-1):0] q ); // Declare the RAM variable reg [DATA_WIDTH-1:0] ram[2**ADDR_WIDTH-1:0]; // Variable to hold the registered read address reg [ADDR_WIDTH-1:0] addr_reg; // Specify the initial contents. You can also use the $readmemb // system task to initialize the RAM variable from a text file. // See the $readmemb template page for details. initial begin : INIT integer i; for(i = 0; i < 2**ADDR_WIDTH; i = i + 1) ram[i] = {DATA_WIDTH{1'b1}}; end always @ (posedge clk) begin // Write if (we) ram[addr] <= data; addr_reg <= addr; end // Continuous assignment implies read returns NEW data. // This is the natural behavior of the TriMatrix memory // blocks in Single Port mode. assign q = ram[addr_reg]; endmodule
  18. У чувака то работает, но доступа к DDR буферам у него все равно нет, поэтому 1 Гбит у него не получается и на Triple Speed Ethernet не получится.
  19. На тестере можно увидеть например количество битовых ошибок, определить правильно ли подсчитана контрольная сумма, возможно в преамбуле проблемы (это тоже может тестер показать), по крайней мере он может показать, что проблема точно не в FPGA или наоборот. ОС на ПК может не пропускать например пакеты с неправильной CRC (или даже сетевая карта на ПК может такое делать). Ну и тайминги на FPGA, должны обязательно выполняться) У меня была такая же схема ПК->ПЛИС->ПК, только не RGMII, а MII, тоже пакеты терялись, проблемы решить не удалось, забросил, с RGMII проще мне кажется.
  20. Добавил картинки Да, данные не fast_output register, как же я мог забыть про это. Fast_output помогает, убирает слэки по сетапу, но появились слэки по холду, хоть и намного меньше) Думаю придется делать второй клок на PLL, сдвинутый по фазе.
  21. Да уж, всё очень запутано. Не стал создавать отдельную тему, решил спросить в этой. Проблема банальная: не сходятся тайминги. Итак, описание. Есть ПЛИС Cyclone V (5CEBA9F23C8), к ней подключается ЦАП, на ПЛИС заводится частота, с ПЛИС на ЦАП выводится код и частота. Соответственно внутри ПЛИС генерируется частота для ЦАП 210 МГц с помощью PLL. Код в в ПЛИС очень простой. module X5_DAC( (*chip_pin = "M9"*) input clk_26M, (*chip_pin = "v6, U8, U7, U6, T8, T7, R7, R6, R5, P6, P7, N6, M6, M7"*) output reg [13:0] D_D, (*chip_pin = "W8"*) output wire D_CLK ); // alt_pll alt_pll( .refclk (clk_26M), // refclk.clk .rst (1'b0), // reset.reset .outclk_0 (D_CLK) // outclk0.clk ); // reg [8:0] period_cnt; reg pulse_ena; // always@(posedge D_CLK) begin period_cnt<=period_cnt+1'b1; pulse_ena<=&period_cnt; if (pulse_ena) D_D<=14'b1111_1111_1111_11; else D_D<=14'h0; end // endmodule Собственно, каждый раз как счетчик period_cnt переполняется на ЦАП выводятся все единицы. Теперь констрейны: #************************************************************** # Time Information #************************************************************** set_time_format -unit ns -decimal_places 3 #************************************************************** # Create Clock #************************************************************** create_clock -name {clk_26M} -period 38.461 -waveform { 0.000 19.230 } [get_ports {clk_26M}] #************************************************************** # Create Generated Clock #************************************************************** create_generated_clock -name {alt_pll|alt_pll_inst|altera_pll_i|general[0].gpll~FRACTIONAL_PLL|vcoph[0]} -source [get_pins {alt_pll|alt_pll_inst|altera_pll_i|general[0].gpll~FRACTIONAL_PLL|refclkin}] -duty_cycle 50/1 -multiply_by 202 -divide_by 5 -master_clock {clk_26M} [get_pins {alt_pll|alt_pll_inst|altera_pll_i|general[0].gpll~FRACTIONAL_PLL|vcoph[0]}] create_generated_clock -name {alt_pll|alt_pll_inst|altera_pll_i|general[0].gpll~PLL_OUTPUT_COUNTER|divclk} -source [get_pins {alt_pll|alt_pll_inst|altera_pll_i|general[0].gpll~PLL_OUTPUT_COUNTER|vco0ph[0]} ] -duty_cycle 50/1 -multiply_by 1 -divide_by 5 -master_clock {alt_pll|alt_pll_inst|altera_pll_i|general[0].gpll~FRACTIONAL_PLL|vcoph[0]} [get_pins {alt_pll|alt_pll_inst|altera_pll_i|general[0].gpll~PLL_OUTPUT_COUNTER|divclk}] create_generated_clock -name {clk_210M} -source [get_pins {alt_pll|alt_pll_inst|altera_pll_i|outclk_wire[0]~CLKENA0|inclk}] -duty_cycle 50/1 -multiply_by 1 -divide_by 1 -master_clock {alt_pll|alt_pll_inst|altera_pll_i|general[0].gpll~PLL_OUTPUT_COUNTER|divclk} [get_pins {alt_pll|alt_pll_inst|altera_pll_i|outclk_wire[0]~CLKENA0|outclk}] create_generated_clock -name {D_CLK} -source [get_pins {alt_pll|alt_pll_inst|altera_pll_i|outclk_wire[0]~CLKENA0|outclk}] -duty_cycle 50/1 -multiply_by 1 -divide_by 1 -master_clock {clk_210M} [get_ports {D_CLK}] #************************************************************** # Set Clock Uncertainty #************************************************************** set_clock_uncertainty -rise_from [get_clocks {alt_pll|alt_pll_inst|altera_pll_i|general[0].gpll~PLL_OUTPUT_COUNTER|divclk}] -rise_to [get_clocks {D_CLK}] -setup 0.420 set_clock_uncertainty -rise_from [get_clocks {alt_pll|alt_pll_inst|altera_pll_i|general[0].gpll~PLL_OUTPUT_COUNTER|divclk}] -rise_to [get_clocks {D_CLK}] -hold 0.130 set_clock_uncertainty -rise_from [get_clocks {alt_pll|alt_pll_inst|altera_pll_i|general[0].gpll~PLL_OUTPUT_COUNTER|divclk}] -fall_to [get_clocks {D_CLK}] -setup 0.420 set_clock_uncertainty -rise_from [get_clocks {alt_pll|alt_pll_inst|altera_pll_i|general[0].gpll~PLL_OUTPUT_COUNTER|divclk}] -fall_to [get_clocks {D_CLK}] -hold 0.130 set_clock_uncertainty -rise_from [get_clocks {alt_pll|alt_pll_inst|altera_pll_i|general[0].gpll~PLL_OUTPUT_COUNTER|divclk}] -rise_to [get_clocks {alt_pll|alt_pll_inst|altera_pll_i|general[0].gpll~PLL_OUTPUT_COUNTER|divclk}] -setup 0.400 set_clock_uncertainty -rise_from [get_clocks {alt_pll|alt_pll_inst|altera_pll_i|general[0].gpll~PLL_OUTPUT_COUNTER|divclk}] -rise_to [get_clocks {alt_pll|alt_pll_inst|altera_pll_i|general[0].gpll~PLL_OUTPUT_COUNTER|divclk}] -hold 0.070 set_clock_uncertainty -rise_from [get_clocks {alt_pll|alt_pll_inst|altera_pll_i|general[0].gpll~PLL_OUTPUT_COUNTER|divclk}] -fall_to [get_clocks {alt_pll|alt_pll_inst|altera_pll_i|general[0].gpll~PLL_OUTPUT_COUNTER|divclk}] -setup 0.400 set_clock_uncertainty -rise_from [get_clocks {alt_pll|alt_pll_inst|altera_pll_i|general[0].gpll~PLL_OUTPUT_COUNTER|divclk}] -fall_to [get_clocks {alt_pll|alt_pll_inst|altera_pll_i|general[0].gpll~PLL_OUTPUT_COUNTER|divclk}] -hold 0.070 set_clock_uncertainty -fall_from [get_clocks {alt_pll|alt_pll_inst|altera_pll_i|general[0].gpll~PLL_OUTPUT_COUNTER|divclk}] -rise_to [get_clocks {D_CLK}] -setup 0.420 set_clock_uncertainty -fall_from [get_clocks {alt_pll|alt_pll_inst|altera_pll_i|general[0].gpll~PLL_OUTPUT_COUNTER|divclk}] -rise_to [get_clocks {D_CLK}] -hold 0.130 set_clock_uncertainty -fall_from [get_clocks {alt_pll|alt_pll_inst|altera_pll_i|general[0].gpll~PLL_OUTPUT_COUNTER|divclk}] -fall_to [get_clocks {D_CLK}] -setup 0.420 set_clock_uncertainty -fall_from [get_clocks {alt_pll|alt_pll_inst|altera_pll_i|general[0].gpll~PLL_OUTPUT_COUNTER|divclk}] -fall_to [get_clocks {D_CLK}] -hold 0.130 set_clock_uncertainty -fall_from [get_clocks {alt_pll|alt_pll_inst|altera_pll_i|general[0].gpll~PLL_OUTPUT_COUNTER|divclk}] -rise_to [get_clocks {alt_pll|alt_pll_inst|altera_pll_i|general[0].gpll~PLL_OUTPUT_COUNTER|divclk}] -setup 0.400 set_clock_uncertainty -fall_from [get_clocks {alt_pll|alt_pll_inst|altera_pll_i|general[0].gpll~PLL_OUTPUT_COUNTER|divclk}] -rise_to [get_clocks {alt_pll|alt_pll_inst|altera_pll_i|general[0].gpll~PLL_OUTPUT_COUNTER|divclk}] -hold 0.070 set_clock_uncertainty -fall_from [get_clocks {alt_pll|alt_pll_inst|altera_pll_i|general[0].gpll~PLL_OUTPUT_COUNTER|divclk}] -fall_to [get_clocks {alt_pll|alt_pll_inst|altera_pll_i|general[0].gpll~PLL_OUTPUT_COUNTER|divclk}] -setup 0.400 set_clock_uncertainty -fall_from [get_clocks {alt_pll|alt_pll_inst|altera_pll_i|general[0].gpll~PLL_OUTPUT_COUNTER|divclk}] -fall_to [get_clocks {alt_pll|alt_pll_inst|altera_pll_i|general[0].gpll~PLL_OUTPUT_COUNTER|divclk}] -hold 0.070 set_clock_uncertainty -rise_from [get_clocks {clk_210M}] -rise_to [get_clocks {clk_210M}] -setup 0.400 set_clock_uncertainty -rise_from [get_clocks {clk_210M}] -rise_to [get_clocks {clk_210M}] -hold 0.060 set_clock_uncertainty -rise_from [get_clocks {clk_210M}] -fall_to [get_clocks {clk_210M}] -setup 0.400 set_clock_uncertainty -rise_from [get_clocks {clk_210M}] -fall_to [get_clocks {clk_210M}] -hold 0.060 set_clock_uncertainty -rise_from [get_clocks {clk_210M}] -rise_to [get_clocks {D_CLK}] -setup 0.420 set_clock_uncertainty -rise_from [get_clocks {clk_210M}] -rise_to [get_clocks {D_CLK}] -hold 0.120 set_clock_uncertainty -rise_from [get_clocks {clk_210M}] -fall_to [get_clocks {D_CLK}] -setup 0.420 set_clock_uncertainty -rise_from [get_clocks {clk_210M}] -fall_to [get_clocks {D_CLK}] -hold 0.120 set_clock_uncertainty -fall_from [get_clocks {clk_210M}] -rise_to [get_clocks {clk_210M}] -setup 0.400 set_clock_uncertainty -fall_from [get_clocks {clk_210M}] -rise_to [get_clocks {clk_210M}] -hold 0.060 set_clock_uncertainty -fall_from [get_clocks {clk_210M}] -fall_to [get_clocks {clk_210M}] -setup 0.400 set_clock_uncertainty -fall_from [get_clocks {clk_210M}] -fall_to [get_clocks {clk_210M}] -hold 0.060 set_clock_uncertainty -fall_from [get_clocks {clk_210M}] -rise_to [get_clocks {D_CLK}] -setup 0.420 set_clock_uncertainty -fall_from [get_clocks {clk_210M}] -rise_to [get_clocks {D_CLK}] -hold 0.120 set_clock_uncertainty -fall_from [get_clocks {clk_210M}] -fall_to [get_clocks {D_CLK}] -setup 0.420 set_clock_uncertainty -fall_from [get_clocks {clk_210M}] -fall_to [get_clocks {D_CLK}] -hold 0.120 #************************************************************** # Set Input Delay #************************************************************** #************************************************************** # Set Output Delay #************************************************************** set_output_delay -add_delay -max -clock [get_clocks {D_CLK}] 2.000 [get_ports {D_D[0]}] set_output_delay -add_delay -min -clock [get_clocks {D_CLK}] -1.500 [get_ports {D_D[0]}] set_output_delay -add_delay -max -clock [get_clocks {D_CLK}] 2.000 [get_ports {D_D[1]}] set_output_delay -add_delay -min -clock [get_clocks {D_CLK}] -1.500 [get_ports {D_D[1]}] set_output_delay -add_delay -max -clock [get_clocks {D_CLK}] 2.000 [get_ports {D_D[2]}] set_output_delay -add_delay -min -clock [get_clocks {D_CLK}] -1.500 [get_ports {D_D[2]}] set_output_delay -add_delay -max -clock [get_clocks {D_CLK}] 2.000 [get_ports {D_D[3]}] set_output_delay -add_delay -min -clock [get_clocks {D_CLK}] -1.500 [get_ports {D_D[3]}] set_output_delay -add_delay -max -clock [get_clocks {D_CLK}] 2.000 [get_ports {D_D[4]}] set_output_delay -add_delay -min -clock [get_clocks {D_CLK}] -1.500 [get_ports {D_D[4]}] set_output_delay -add_delay -max -clock [get_clocks {D_CLK}] 2.000 [get_ports {D_D[5]}] set_output_delay -add_delay -min -clock [get_clocks {D_CLK}] -1.500 [get_ports {D_D[5]}] set_output_delay -add_delay -max -clock [get_clocks {D_CLK}] 2.000 [get_ports {D_D[6]}] set_output_delay -add_delay -min -clock [get_clocks {D_CLK}] -1.500 [get_ports {D_D[6]}] set_output_delay -add_delay -max -clock [get_clocks {D_CLK}] 2.000 [get_ports {D_D[7]}] set_output_delay -add_delay -min -clock [get_clocks {D_CLK}] -1.500 [get_ports {D_D[7]}] set_output_delay -add_delay -max -clock [get_clocks {D_CLK}] 2.000 [get_ports {D_D[8]}] set_output_delay -add_delay -min -clock [get_clocks {D_CLK}] -1.500 [get_ports {D_D[8]}] set_output_delay -add_delay -max -clock [get_clocks {D_CLK}] 2.000 [get_ports {D_D[9]}] set_output_delay -add_delay -min -clock [get_clocks {D_CLK}] -1.500 [get_ports {D_D[9]}] set_output_delay -add_delay -max -clock [get_clocks {D_CLK}] 2.000 [get_ports {D_D[10]}] set_output_delay -add_delay -min -clock [get_clocks {D_CLK}] -1.500 [get_ports {D_D[10]}] set_output_delay -add_delay -max -clock [get_clocks {D_CLK}] 2.000 [get_ports {D_D[11]}] set_output_delay -add_delay -min -clock [get_clocks {D_CLK}] -1.500 [get_ports {D_D[11]}] set_output_delay -add_delay -max -clock [get_clocks {D_CLK}] 2.000 [get_ports {D_D[12]}] set_output_delay -add_delay -min -clock [get_clocks {D_CLK}] -1.500 [get_ports {D_D[12]}] set_output_delay -add_delay -max -clock [get_clocks {D_CLK}] 2.000 [get_ports {D_D[13]}] set_output_delay -add_delay -min -clock [get_clocks {D_CLK}] -1.500 [get_ports {D_D[13]}] Ну тут сначала описывается клок, который подаётся на ПЛИС, 26 МГц, потом клоки на PLL, потом описывается выходной клок, который идет на ЦАП (D_CLK, он же на ножке ПЛИС). Потом идут uncertainty, их генерирует сам таймквест, как и все эти длинные, ужасные имена в pll. Потом идут отношения выходного клока (D_CLK) с выходными данными (D_D), здесь указано все согласно с даташитом ЦАП. И естественно после компиляции таймквест ругается, слэк в setup summary отрицательный. Картинки из таймквеста прикреплены в архиве. Не понимаю, что еще нужно добавить к констрейнам, чтобы они выполнялись. Или неужели пятые циклоны настолько медленные, констрейны не выполняются и на 125 МГц, к слову на третьем циклоне по крайней мере на 125 МГц все в порядке. TQ.zip
  22. Я помню, задавал я set_max_delay и set_min_delay между регистрами, чтобы подвинуть их поближе друг к другу, так ни таймквест (не ругался), ни квартус (не двигал) на это никак не реагировал. Сейчас может еще раз попробую. Ну а чтобы избавиться от распространения "Х" в моделировании надо добавить +no_notifier. http://electronix.ru/forum/index.php?showtopic=86076
  23. Именно так я как раз сейчас сделал ;) И это пока лучший вариант при метастабильности. Ну, наверное, все об этом знают. И, кстати, после XOR придётся еще ставить синхронизацию, ну или желательно. В теории да, таймквест тоже подтверждает, но почему-то при моделировании, если синхронизация после XOR,то сигнал на выходе рано или поздно всеравно становится "х" и расползается, со схемой перед XOR пока что такого замечено не было.
×
×
  • Создать...