Есть проект, в котором выполняется одновременно умножение и суммирование за один такт двух многоразрядных регистров. На частоте 50 МГц констрейны выполнялись, теперь встала необходимость повысить частоту до 75 МГц. Вся схема на более высокой частоте работает, но вот конкретно это место не проходит.
Есть три вопроса:
1) В принципе, дальнейшая работа с результатом этого действия была специально мной отложена на три такта. Могу я ожидать что за эти три такта (с запасом) значение установится без каких-либо сбоев?
2) Можно ли это как-то "узаконить" в глазах анализатора таймингов? Что вот это место может обрабатываться три такта и не обязательно влезать в один такт 75 МГц.
3) Я могу поместить это действие в отдельный модуль, который будет работать на пониженной частоте в два или даже в 4 раза:
Код
reg [1:0] mclock_div;
initial mclock_div = 0;
always @(posedge main_clock)
mclock_div <= mclock_div + 1;
wire mclock = !mclock_div[1];
Тут main_clock это 75 Мгц, а mclock это вдвое меньшая частота, фронт которой совпадает с фронтом main_clock - верно?
Xilinx_constraints_guide.pdf содержит раздел Specifying Derived Clocks, но там не очень ясные примеры. Я могу предположить что это задается так:
Код
TIMESPEC "mclock" = PERIOD "main_clock" TS_main_clock / 2 PHASE + 0 ns;
Правильно ли я понимаю что /2 будет означать что частота понижена вдвое, и что не возникает увеличения фазы. Или тут стоит задать не 0 ns - но какое?
P.S. Честно осуществил поиск по форуму перед созданием темы, такой простой случай почему-то не попался.
Код
Period for clock doubled and phase-shifted forward by 180 degrees (which is 90 degrees relative to TS01):
TIMESPEC ”TS04” = PERIOD "clk180" TS01 / 2 PHASE + 2.5 nS;
Можно подумать что /2 означать что период увеличен вдвое, а можно что он наоборот поделен на два и частота стала в 2 раза выше. Непонятное место в документации.