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

egorman44

Свой
  • Постов

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

  • Посещение

Сообщения, опубликованные egorman44


  1. 3 hours ago, Doka said:

    есть кейсы в которых фифо надо тоже предынициализировать перед работой ? :umnik2:

    нет таких кейсов , ессно надо удалить (просто копипастил откуда-то) :

     

    set all_rams [get_cells -hier -filter {IS_PRIMITIVE  && REF_NAME =~ RAMB*}]
  2. Если вы работает в батче то заворачиваете все то, что написал Роб в скрипт file_name.tcl (можно добававить, чтобы скрипт писал в файл):
     

    set bram_file [open "your_directory/bram_file.log" "w"]
    
    set all_rams [get_cells -hier -filter {IS_PRIMITIVE  && ((REF_NAME =~ RAMB*) || (REF_NAME =~ FIFO*))}]
    
    foreach ram $all_rams {
    
      puts $bram_file "Ram $ram is in location [get_property LOC $ram]\n"
    
    }
    
    close $bram_file

    И последней строчкой в вашем скрипте по имплементу исполняйте file_name.tcl:

    source file_name.tcl

     

  3. А еще при особом желании и острой необходимости можно замутить переинициализацию вашей блочной памяти прямо в bit файл. Для этого надо найти географическое положении памяти после имплемента, вынуть его и положить в mmi файл , скормить все утилитке updatemem от Xilinx и радоваться жизни. ООоочень помогает если билд процесс длиться безобразно долгое количество времени. 

  4. Похоже я поборол этот глюк, по умолчанию разделитель в иерархическом имени в Synplify является точка "." и я предполагаю , что задав констрейн на выход BUFG через

     

    t:xilinx_1gig_pcs_pma_inst.inst.core_clocking_i.bufg_userclk2.O

     

    синтезатор не смог понять что "bufg_userclk2.O" - это выход "O" у "буфера bufg_userclk2".

     

    Пришлось отказаться от использования SCOPE и использовать "/" в качестве разделителя:

     

    set_hierarchy_separator {/}

    create_clock -name {TXUSRCLK2} [get_pins {xilinx_1gig_pcs_pma_inst/inst/core_clocking_i/bufg_userclk2.O}] -period {16}

     

  5. Всем здравствуйте подскажите пожалуйста , как мне задать create_clock для выходного пина клокового буфера BUFG. Тут появилась какая-то гуйня под названием SCOPE я в ней обзываю клок и указываю объект откуда он зарождается, путь к объекту взял в Technology View. Нажимаю Check Constraints в репорте получаю следующее:

     

    create_clock -name { TXUSRCLK2 } { t:xilinx_1gig_pcs_pma_inst.inst.core_clocking_i.bufg_userclk2.O } -period { 16 }
        @E:"/u/esmirnov/wa_B0/atlanticB0_three/Logic/fpga/synplify_run/dig_fpga_top/dig_fpga_top.fdc":28:0:28:0|object "t:xilinx_1gig_pcs_pma_inst.inst.core_clocking_i.bufg_userclk2.O" does not exist

     

    Кто может подсказать чего ему не нравиться ?

     

     

    2016_07_20_18_35_55.png

  6. Насколько я знаю нельзя тупо взять RXAUI и влепить в зад модулю SFP+, должен быть конвертер из XAUI в SFI.

     

    Ему же можно влепить 10Gbase - X/R. А модулю SFP - ещё и SGMII можно совместно с 1000base-x, чем же RXAUI будет хуже ?! То что тут 2 лэйна , и будут траблы с синхронизацией, или это все я глупости говорю какие-то :biggrin:

     

    Вы бы написали к какой борде какие SFP модули хотите подключить... (кстати, не забывайте, есть SFP (<=1G), а есть SFP+ (10G)).

     

    я писал:

    Смотрю на PHY вижу, что у него со стороны MAC - 8 SFP+ модулей.

    Чип на борде такой http://www.aquantia.com/products/data-center/aq2402/

     

  7. Здравствуйте многоуважаемые форумчане. Есть задача подключить борду с 10G PHY к MAC'y реализованном на отладке ПЛИС. Из скудной информации на PHY понял, что со стороны MAC можно использовать XFI / RXAUI интерфейсы. Полазив в стандартных корках Xilinx я нашел RXAUI IP core, успех ! Смотрю на PHY вижу, что у него со стороны MAC - 8 SFP+ модулей.

     

    У меня накопилось несколько вопросов, на которые я затрудняюсь найти ответы спрашивая это у Интернета.

     

    1. Я всегда думал, что sfp это просто конвертер электрического диф. сигнала в оптический , и соответственно sfp модулю по барабану какой протокол по дифф паре в него поступает , будь то 10Gbase-R или RXAUI. Во втором случае, просто будет необходимо использовать два sfp кабеля для подключения, т.к. у RXAUI на выходе 2 лэйна по 6.25 Мbs?

     

    2. Что такое XFI ? Загуглив я наткнулся на оптические модули конкурентов SFP , но какое отношение это имеет к протокольным делам я не понял.

     

    Господа помогите разобраться в этом сложном оптическом мире ? :wacko:

  8. Эм... нашел вкладку Design Optimization , там стоит Enable Most Optimization(o4) , т.е. как я понял, оптимизации очень много :) Выше только О5. Но когда захотел поменять , то кнопка ОК не активна оказалась. Че он ? В консоль скидывает грозную красную надпись типа оптимизация отменена.

     

    # Optimization canceled

     

    upd. Черт, все работает , все сигналы отображаются. Но я был готов поклясться , что в прошлый раз этого не было :laughing:

  9. Добрый день ! :santa2: Имеются пару-тройку сигналов, которые пересекают клоковый домен, объявлены типа:

     

    reg [ADDR_WIDTH_par : 0]  gray_rd_ptr_in_wr_domain[1:0];

     

    И что-то modelsim не хочет выводить их содержимое в окно wave, сразу располагает на вкладку Memory List. Ну собственно ребяты подскажите как отобразить такие сигналы , если конечно имеется возможность ?

  10. Огромное спасибо за ответы. :)

     

    Было такое. Когда у неклокового сигнала слишком большой fanout, placer начинает вставлять глобальные буферы на этот сигнал. Уменьшайте fanout или вставляйте доп. регистры.

     

    Эта версия кажется мне правдоподобной.

     

     

  11. Здравствуйте многоуважаемые форумчане.

    Сегодня занялся переносом проекта со Spartan'a 3 на 6-ой. Выкинул некоторые примитивы, поменял назначения пинов и т.д. и т.п. Начал собирать проект и во время "Place and Route" мне вывалилось сообщение:

     

    ERROR:Place:1136 - This design contains a global buffer instance,
       <i2c_module/word_control/fsm/wr_rd_derived_clock_cb>, driving the net,
       <mpi_rw>, that is driving the following (first 30) non-clock load pins.
       < PIN:
       tss_module/tss_module/connect_mem/BU2/U0/blk_mem_generator/valid.cstr/ramloop
       [0].ram.r/s3a_noinit.ram/dpram.ram.WEA3; >
       < PIN:
       tss_module/tss_module/connect_mem/BU2/U0/blk_mem_generator/valid.cstr/ramloop
       [0].ram.r/s3a_noinit.ram/dpram.ram.WEA2; >
       < PIN:
       tss_module/tss_module/connect_mem/BU2/U0/blk_mem_generator/valid.cstr/ramloop
       [0].ram.r/s3a_noinit.ram/dpram.ram.WEA1; >
       < PIN:
       tss_module/tss_module/connect_mem/BU2/U0/blk_mem_generator/valid.cstr/ramloop
       [0].ram.r/s3a_noinit.ram/dpram.ram.WEA0; >
       This is not a recommended design practice in Spartan-6 due to limitations in
       the global routing that may cause excessive delay, skew or unroutable
       situations.  It is recommended to only use a BUFG resource to drive clock
       loads. If you wish to override this recommendation, you may use the
       CLOCK_DEDICATED_ROUTE constraint (given below) in the .ucf file to demote
       this message to a WARNING and allow your design to continue.
       < PIN "i2c_module/word_control/fsm/wr_rd_derived_clock_cb.O"
       CLOCK_DEDICATED_ROUTE = FALSE; >

     

    Все что написал он мне, я понял. Но извините, почему сигнал <mpi_rw> с выхода автомата состояний, который управляет записью в BLOCK RAM, был заведен в глобальный клоковый буфер?! Я сбит с толку, господа прошу разъяснить что не так и кто в этом виноват . И понятно, что можно использовать CLOCK_DEDICATED_ROUTE дабы перемолоть все вышеупомянутое, но это не по фэншую вроде бы как.

     

  12. Здравствуйте. Собираю 4-х разрядный счетчик нажатия кнопки на плате LDM-XC3S500E-PQ208.

     

    Выдает следующую ошибку:

     

    ......

    ERROR:Place:1018 - A clock IOB / clock component pair have been found that are not placed at an optimal clock IOB /

    clock site pair. The clock component <but1_BUFGP/BUFG> is placed at site <BUFGMUX_X1Y0>. The IO component <but1> is

    placed at site <IPAD174>. This will not allow the use of the fast path between the IO and the Clock buffer. If this

    sub optimal condition is acceptable for this design, you may use the CLOCK_DEDICATED_ROUTE constraint in the .ucf

    file to demote this message to a WARNING and allow your design to continue. However, the use of this override is

    highly discouraged as it may lead to very poor timing results. It is recommended that this error condition be

    corrected in the design. A list of all the COMP.PINs used in this clock placement rule is listed below. These

    examples can be used directly in the .ucf file to override this clock rule.

    < NET "but1" CLOCK_DEDICATED_ROUTE = FALSE; >

     

     

    подскажите, где я ошибся?

    Извините конечно, но мне кажется, что Вы на тактовый вход триггера, хотите подать сигнал с кнопки ?! В то время как надо подавать тактовый сигнал :)

  13. Ну так то вам правильно сказали. Для начала стоить определить где теряются пакеты. Как я понял есть два линка (сеть - PHY - FPGA - switch) и (switch - CPU). Switch управляемый ? Содержит счётчики принятых/отправленных/ошибок? Flow control присутствует где-нибудь? Нет ли потери пакетов в софте процессора?

     

    Управляемый и даже подключен к процессору, но софт для процессора не написан :) Так что switch просто устанавливается при включении по дефолту и вперед. Про flow control ответить затрудняюсь. На отладке проц с тем же софтом, но подключенный напрямую к PHY не теряет пакетов .

     

    Есть предположение, что MII через PLD разъемы и общей трассой протяженностью примерно 20 см, может много чего поймать. Интересно, есть какая-нибудь бумажка, по поводу этого дела ? Например , длина проводников не должна превышать столько-то столько-то для MII. Или это ересь ?! :)

  14. я бы начал с выяснения где именно и в каком направлении валятся пакеты. а уже потом бы думал как лечить.

     

    Но при проверке, допустим генерируя 2 Мб/с трафика, теряется 2% пакетов, приходящих к процессору .

     

    Генерирую трафик UDP, утилитой iperf. Во время теста мониторю вход RX_ERR на наличие ошибок, но событие не наступает .

  15. Всем здравствуйте ! :)

     

    На устройстве используем 100 Мб Ethernet. На плате №1 имеется микросхема PHY которая принимает пакеты, далее передает их по MII к FPGA. FPGA осуществляет простой проброс MII интерфейса и через PLD коннекторы все это дело передается на плату №2. На плате №2 MII далее идет на switch к которому подключен процессор. В таком подключении сеть на процессоре присутствует. Но при проверке, допустим генерируя 2 Мб/с трафика, теряется 2% пакетов, приходящих к процессору.

     

    По поводу длины линий, на плате №1, RX_CLK длиннее остальных на 50мм (полная длина линии от FPGA до PLD коннекторов 152 мм), между остальными линиями (RXD<0..3>, RX_DV, ... ) разбег не превышает 2.5 мм. На плате № 2 длины проводников согласованны.

     

    Я занялся расчетами и получил что RX_CLK опаздывает (очень) примерно на 0,35 нс, период MII = 40 нс. Я так полагаю это не критично ?!

     

    Пробовал пропускать сигналы RX линии MII через D триггеры тактируемые на частоте 150 МГц, пробовал задерживать сигнал RX_CLK на величину кратную 1/6 периода ничего не помогло . :(

     

    Господа прошу помощи в разрешении вопроса. Куда примерно посмотреть, что попробовать, чтобы исчезли потери пакетов. ?! :)

  16. еще один вопрос. как заполнить м- последовательностью ПЗУ ПЛИС. ? ну тоесть я могу в регистр залить последовательность так что бы потом она там всегда была ?

    Можно инициализировать регистр в initial блоке

    reg[3:0] rom [0:7];
    
    initial begin
    rom[0] = 4'b1011;
    rom[1] = 4'b0001;
    rom[2] = 4'b0011;
    rom[3] = 4'b0010;
    rom[4] = 4'b1110;
    rom[5] = 4'b0111;
    rom[6] = 4'b0101;
    rom[7] = 4'b0100;
    end

     

    UPD: ну только если в дальнейшем вы обязуетесь нигде не присваивать новых значений двумерному массиву rom :)

    UPD2: да и в правду чего жадничать , есть такой документ под названием 1364.1 IEEE Standard for Verilog ® Register Transfer Level Synthesis там в параграфе 5.6 Modeling read-only memories (ROM) собственно можно посмотреть примеры моделирования ROM памяти при помощи Verilog

  17. always @(posedge handshake)
    begin
        got_handshake <= 1;
    end

     

    Не уверен, что сигнал с названием handshake является тактовым. Вы в клоковое дерево вашей ПЛИС пытаетесь завести сигнал handshake так делать нельзя. Такое ощущение, что здесь вы хотите синтезировать защелку по сигналу handshake, так и синтезируйте, если очень конечно нужно:

    always @(*)
    if(handshake)
      got_handshake = 1;

     

    always @(*)
    begin 
       if (counter_next > 1024)
           begin
                    counter_next <= 0;
          end
        else
          counter_next <= counter + 1'b1;
    end
    
    reg [0:0] state, next_state;
    always@(*)
    begin
          if (rst) begin
             out <= 0;
             out2 <= 0;
             counter <= 0;
                state <= S1;
          end
          else
              case (state)
                S1 : begin
                      out <= DA1[counter];
                            out2 <= 1'h1;
                            next_state = got_handshake ? S2 : S1;  
                            counter <= counter_next;
                     end              
                    S2 : begin
                      out <= frame[counter];
                            out2 <= 1'h1;
                            next_state = S1; 
                            counter <= 0;
                          end
              endcase                      
    end

    очень странно, что вы пытаетесь сделать автомат и счетчик асинхронными, у Вас отсутствует кварц на плате ? :) Такой автомат работать не будет. Посмотрели бы пример от Altera хотяб:

    always @(posedge clk or posedge reset)
         begin
              if (reset)
                   state = zero;
              else
                   case (state)
                        zero:
                             state = one;
                        one:
                             if (in)
                                  state = zero;
                             else
                                  state = two;
                        two:
                             state = three;
                        three:
                             state = zero;
                   endcase
         end

    Откуда видно, что автомат из состояния в состояние переходит по переднему фронту clk, ну еще и асинхронно сбрасывается по reset.

     

    Я так думал что когда описываешь комбинаторную логику пользуешься блокирующим присваиванием (=). И собственно использовать оба типа присваивания в одном always блоке , тоже не особо приветствуется:

     S2 : begin
                      out <= frame[counter];
                      out2 <= 1'h1;
                      next_state = S1; 
                      counter <= 0;
             end

    Я так полагаю Вы не особо тщательно смотрели ваши книги по верилогу :) Для начала бы Вам разобраться в синтезе комбинаторной и последовательной логики (combinational and sequential logic) ну и с блокирующим и неблокирующим присвоением соответственно.

     

  18. Я бы Вам рекомендовал почитать что-нибудь от Sunburst Design - у этих ребят много рассуждений по поводу реализации конечного автомата на Verilog и SV, конечно если с английским хорошо. У Iosifk на сайте есть краткий курс , там тоже описаны FSM'ки. Да собственно по первому же запросу в Google на тему "fsm verilog" вывалился пример от Altera.

    Я думаю лучше самому понять как это работает, потому что конечный автомат - есть очень важный момент в цифровой схемотехнике. :)

  19. Только нужно понять как этот конечный автомат правильно написать, чтобы первый байт отправлялся непрерывно пока не придет внешний emacclienttxack, а как пришел - все остальное

    А чего тут такого сложного ? Берете карандаш ,листок , бумагу ... Рисуете состояния и правила перехода из них, затем плавно переносите на HDL. Тема fsm verilog/VHDL гуглится хорошо. Я же вроде бы писал :

    можно написать конечный автомат, который будет висеть в состояние до того момента как придет emacclienttxack, и находясь в новом состоянии будет выдавать новые данные на clientemactxd.

     

    Или Вам еще не доводилось описывать конечные автоматы ? Вы на каком языке собрались это делать ?

     

  20. Как на Verilog описать задержку первого байта до прихода emacclienttxack ?

     

    post-84716-1433239757_thumb.jpg

     

    можно написать конечный автомат, который будет висеть в состояние до того момента как придет emacclienttxack, и находясь в новом состоянии будет выдавать новые данные на clientemactxd. Опять же настоятельно рекомендую посмотреть пример. В примере между MAC контроллером и модулем client_side вставлен FIFO, и соблюдение всех рукопожатий ложится на этот модуль, Вам же остается просто кидать данные в FIFO и следить чтобы он не переполнился, если вы работаете на передачу.

     

    Может быть, кто-нибудь использовал конструкцию The wait statement в верилоге ?

     

    Для верификации сколько хош :)

     

    UPD: я может чего не так понял , если вы пользуете ядро под номером 4.6 то в папке куда у вас сгенирировалась корка есть папка example_design в ней и смотрите пример

  21. К сожалению я затрудняюсь сказать что-либо глядя на Ваши картинки, но когда я с ним разбирался я взял за основу пример который генерится визардом (AddresSwap как то так этот модуль называется). я с одной стороны подключил Chip scope с другой комп с Wireshark. Mac в исполнении Xilinx формирует преамбулу, SFD и FCS. все остальное тело пакета надо грузить через интерфейс данных.
    очень верный способ, на мой взгляд. Плюс ко всему там тестбенч написан, который можете запустить даже в Isim и посмотреть что к чему. Так же есть дока официальная на корку UG138 "LogiCORE IP Tri-Mode Ethernet MAC v4.5" там все ответы на интересующие Вас вопросы.
  22. Мне нужно генерировать и отправлять сразу на шину.

    Не понятно как в верилоге описать счетчик до 1500byte

    reg counter;
    parameter [7:0] data [0:1499] = {1500'h гигантское число};
    
    always @(posedge clk or posedge rst)
    
    if (rst)
    begin
      out <= 0;
      counter <= 0;
    end
    else 
           begin
                out <= counter > 1500 ? 0 : data[counter];
            counter <= counter + 1'b1;
        end
    end

    Как-то так? Или как?=)

     

    Как я понял у вас есть 1500 байт данных, которыми вы инициализируете массив и вам надо их выдать наружу, коль хотите использовать parameter ? Не проще ли будет использовать RAM блоки на 1500 байт, и формируя адрес читать содержимое, выдавая по 8 бит. Предварительно проинициализируйте RAM блок командой $readmemb.

    Да и как у Вас счетчик то работает ? Может он по какой-то внешней команде начинает считать и останавливается , или же постоянно молотит переполняясь на значении 1500 ?

     

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