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

cerg19

Свой
  • Постов

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

  • Посещение

Репутация

0 Обычный

Информация о cerg19

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

Контакты

  • Сайт
    Array
  • ICQ
    Array

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

2 570 просмотров профиля
  1. Коллеги, добрый день. Может кто сталкивался с таким блоком в Arria10 как CMU PLL. Это PLL которая стоит внутри приемопередатчиков и я не понимаю зачем она там, если есть FPLL две штуки. Сразу скажу зачем я смотрю про неё, хочется иметь засинхронизированный к RX потоку Serial клок и передать его в качестве опоры на TX интерфейс. т.е. чтобы RX и TX работали на идентичных частотах с нулевым расхождением
  2. Необходимо оперировать пакетами. 1. Пишите полноценный pcs для RX. он полностью будет работать на восстановленном клоке. потом переводите пакеты на свою частоту через FIFO. 2. Пишите полноценный pcs для TX. он будет работать на опорном клоке. 3. Пакеты передвайте на TX pcs через FIFO. если надо, вставляйте IDLE.
  3. Собственно вот какие я выводы сделал. Я не знаю как точно там сделано в вивадо, но при работе с большими проетами(заполненность плис больше 70%) и при довольно больших частотах(больше 200МГц) с разводкой всё плохо. Похоже при процессе рутинга естественно некоторые констрейны не совпадают и вивадо начинает пытаться их исправить переставляя местами регистры и луты, как я понял перестановке подвергаются и те регистры с которыми всё было ок. И вот она исправляет тайминг одного сигнала, но при этом часто портит другого, и всё повторяется. На какомто этапе она всёже останавляивается и иногда с таймингами на некоторых сигналах. Выход из положения это использование OOC. Суть в том что вы компилите и разводите большие и критически важные блоки отдельно. при этом вивадо пытается срутить только его и ей это удаётся(если нет, то переписывай код). Полученный dcp файл потом используется как black box в большом проекте. Этот файл содержит ваш модуль без таймингов и при компиляции большого проекта он не будет его рутить я просто возьмёт из dcp файла, где описано какие элементы и какие луты куда класть. BINGO!
  4. Ну все сигналы тактируются от одного клока, на который есть констрейн. По моей логише это должно автоматически накладывать констрейн на распространение сигналов между регистрами, тактируемые этим клоком. Но вивадо почемуто на них забивает. Частично помогает явное указане set_max_delay в констрейнах на интересуемый сигнал, который собирается с таймингами. Так же немного улучшило ситуацию директива NoTimingRelaxation для route. Ситуация улучшилась, но всёже иногда тайминги вылезают. Неужто на все сигналы мультиплексора необходимо явно указывать set_max_delay?
  5. FIFO и до этого были приколочены, обложил констрейнами 2/3 всех сигналов в мультиплексоре и он стал почти всегда собираться без таймингов. Подскажите пожалуйста как это сделать в vivado?
  6. Всем привет. Возникла такая проблема. На virtex7 реализован жирный мультиплексор 16 высокоскоростных потоков в один. Идея в том, что по 16 каналам валяться 64 битные слова с частотой 312МГц. Валяться они пакетами и скважность этих пакетов плавает со временем. Выходной поток имеет такую же пропускную способность(64 бит слова, 312МГц). Чтобы не потерять данные, пока в выходной поток пишем данные с одного канала, данные с других каналов пишутся в fifo. Каждый канал имеет своё собственное fifo размерностью 16384x64. Реализован алгоритм постепенного чтения из каждого фифо в определённой очереди, чтобы ни одно фифо не успело переполниться. Фифо получились большие и места этот мультиплексор занимает очень много. В итоге всё работает и ничего не теряется, но возникла проблема. Компиляция производится при помощи vivado 2014 и из раза в раз получается разный результат по таймингам. То их нет, то получаются большие тайминги(до 0.5нс). Причём мультиплексор давно написан и никаких изменений в нём не делается. Ему отведён отдельный регион на кристале где ему разводится и другой логики от других модулей там нет. Из сборки к сборке он не меняется. Я бы понял если бы тайминги были всегда, но компилятору всёже периодически удаётся его нормально развести. Может кто-нибудь посоветует как с этим бороться. Можно ли зафиксировать как-то результат разводки мультиплексора, или сказать компилятору разводить его пока не будет ошибок по таймингам?
  7. MSA SFP

    Добрый день. В проекте использую универсадьные SFP модули от фирмы flexoptix. Модули подключены к FPGA и их настройку произвожу сам. Эти SFP модули могут работать на скорости 0.1-2.67Gbit/s. Как я понял из документации, перед началом работы модуля необходимо выставить скорость работы модуля, а именно записать значения в регистры 4-10 по MSA. При включении прибора я пытаюсь записать необходимые значения по i2c интерфейсу и сразу же их считываю. В итоге значения регистров не соответсвуе тому, что пытаюсь записать. Он вообще не меняется. Так же возник вопрос с Option(64-65) регистрами. Необходимо ли в них записывать какие настройки, или эти регистры отражают состояния, задаваемые внешними ножками SFP(TX_disable, Rate_Select). Прошу совета по поводу записи в регистры и Option регистров. Смотрел времянку записи и чтения, всё по документации. Может есть какие особенности?
  8. VC-2 в STM-16

    Всем привет. Я написал для FPGA модуль, который принимает STM16 поток, парсит его и вытаскивает содержащиеся в нём VC-2. Реального потока у меня пока нет, так что хотел пока это всё промоделировать в modelsim. Может кто знает где можно взять реальный дамп STM16 потока с VC2 в нём?
  9. Всем спасибо за развёрнутые ответы, всё понятно.
  10. Здравствуйте. Сталкнулся с конструкцией написанной на SystemVerilog. A = B[5-:4]; Скажите пожалуйста, какие биты вектора В передаются в вектор А?
  11. вот видео для ZC702, там подробно рассказывают как первый проект сделать: https://www.youtube.com/watch?v=u0bW6lQvsVI
  12. с читабельным форматированием это значит примерно вот так: LIBRARY IEEE; USE IEEE.std_logic_1164.all; LIBRARY IEEE; USE IEEE.std_logic_unsigned.all; use IEEE.STD_LOGIC_ARITH.ALL; ENTITY SinTR IS GENERIC( koef : INTEGER := 2 --:= 3 --:= 1 ); PORT ( TAKT : in std_logic; strob : in std_logic; sdvig : in std_logic; data_serial : in std_logic; Clr : in std_logic; fout : out std_logic; Dfm : out std_logic; fmod_out : out std_logic_vector (4 downto 0) ); END SinTR; ARCHITECTURE beh OF SinTR IS signal fm1 : std_logic_vector (4 downto 0) := ( others => '0' ); signal ff256 : std_logic_vector (3 downto 0); signal freq2_5_1, f2_5, freq15, f15, f50k, freq50k, fm256, fm :std_logic := '0'; signal rs_s1, rs_s : std_logic_vector (41 downto 0):= (others => '0'); BEGIN -- -- << TAKT >> == 15 MHz --сначала делаем меандр до частоты 2,5 MHz, из него формируем уже частоту f50k (50 kHz) frequency2_5MHz: process (TAKT) variable f1: integer range 0 to koef :=0; begin if Clr = '1' then f1 := 0; freq2_5_1<='0'; ELSIF true THEN IF rising_edge(TAKT) THEN IF f1 = 0 THEN f1:=koef; freq2_5_1<='1'; ELSIF true THEN f1:=f1-1; freq2_5_1<='0'; END IF; END IF; END IF; END PROCESS; freq2_5MHz: process (TAKT) begin if clr='1' then f2_5<='0'; elsif true then if rising_edge (TAKT) then if freq2_5_1='1' then if f2_5='0' then f2_5<='1'; elsif true then f2_5<='0'; end if; end if; end if; end if; end process; -- делаем частоту f50k frequency50kHz: process (f2_5) variable f50k: integer range 0 to 25:=0; begin if Clr = '1' then f50k := 0; freq50k<='0'; ELSIF true THEN IF rising_edge(f2_5) THEN IF f50k = 0 THEN f50k:=25; freq50k<='1'; ELSIF true THEN f50k:=f50k-1; freq50k<='0'; END IF; END IF; END IF; END PROCESS; freq50kHz: process (f2_5) begin if clr='1' then f50k<='0'; elsif true then if rising_edge (f2_5) then if freq50k='1' then if f50k='0' then f50k<='1'; elsif true then f50k<='0'; end if; end if; end if; end if; end process; Fout <= f50k;-- сигнал подаем на выходной порт frequency1Hz: process (f50k, fm1) -- формируем частоту по тому же принципу, что и f50k, но добавляем case видимо как-то неправильно(( variable f15: integer range 0 to 641:=0; variable f15_1: integer range 0 to 641:=0; begin if Clr = '1' then f15_1:=0; f15:=0; freq15<='0'; ELSIF true THEN if rising_edge(f50k) THEN if f15_1 = 0 then case fm1 is when "00000" => f15_1 := 16; when "00010" => f15_1 := 119; when "00011" => f15_1 := 104; when "00100" => f15_1 := 92; when "00101" => f15_1 := 83; when "00110" => f15_1 := 75; when "10110" => f15_1 := 64; when "00111" => f15_1 := 641; when others => null; end case; end if; if f15=0 then f15 := f15_1; freq15<='1'; else f15:=f15-1; freq15<='0'; end if; end if; end if; END PROCESS; freq15Hz: process (f50k) --меандр begin if clr='1' then f15<='0'; elsif true then if rising_edge (f50k) then if freq15='1' then if f15='0' then f15<='1'; elsif true then f15<='0'; end if; end if; end if; end if; end process; fm <= f15; --перезаписываем сигнал Dfm <= fm; --на выходной порт -----------дальше для загрузки fm1 mr1_1 : PROCESS ( strob ) BEGIN IF rising_edge(strob) THEN fm1<=rs_s1( 4 downto 0 ); END IF; END PROCESS; fmod_out<=fm1; msdvig : PROCESS ( sdvig ) BEGIN IF rising_edge(sdvig) THEN rs_s(41 downto 1)<=rs_s(40 downto 0); rs_s(0)<=data_serial; end if; end process; process (takt,clr,rs_s1) begin if clr = '1' then rs_s1 <=( others => '0' ); elsif (takt'event and takt = '1') then rs_s1(41 downto 0) <= rs_s(41 downto 0); end if; end process; END beh; не ленитесь делать код читаемым. Что касается самой проблемы, то возможно её решение в процессе mr1_1 BEGIN IF rising_edge(strob) THEN fm1<=rs_s1( 4 downto 0 ); END IF; END PROCESS; fm1 загружается не синхронно относительно тактовой частоты f50k. Попробуйте так: mr1_1 : PROCESS (f50k) BEGIN IF rising_edge(f50k) THEN if strob = '1' then fm1<=rs_s1( 4 downto 0 ); end if; END IF; END PROCESS; при этом сигнал strob импульсный длительностью в 1 такт клока f50k
  13. Если честно не совсем понял где сигнал fm управляется в коде. Ннадо бы привести весь код программы(с читаемым форматированием). Похоже что код написан так, что в некоторый момент выполняется условие перевода выхода fs в значение 1 и 0 одновременно.
×
×
  • Создать...