реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Констрейн для простого derived clock, Spartan 6, UCF, constraints
AVR
сообщение Jan 15 2017, 13:41
Сообщение #1


фанат Linux'а
*****

Группа: Свой
Сообщений: 1 353
Регистрация: 23-10-05
Из: SPB.RU
Пользователь №: 10 008



Есть проект, в котором выполняется одновременно умножение и суммирование за один такт двух многоразрядных регистров. На частоте 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 раза выше. Непонятное место в документации.


--------------------
Go to the top of the page
 
+Quote Post
andrew_b
сообщение Jan 15 2017, 16:55
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 975
Регистрация: 30-12-04
Из: Воронеж
Пользователь №: 1 757



Цитата(AVR @ Jan 15 2017, 16:41) *
2) Можно ли это как-то "узаконить" в глазах анализатора таймингов? Что вот это место может обрабатываться три такта и не обязательно влезать в один такт 75 МГц.
Мультицикл же.
Go to the top of the page
 
+Quote Post
AVR
сообщение Jan 15 2017, 17:03
Сообщение #3


фанат Linux'а
*****

Группа: Свой
Сообщений: 1 353
Регистрация: 23-10-05
Из: SPB.RU
Пользователь №: 10 008



Цитата(andrew_b @ Jan 15 2017, 19:55) *
Мультицикл же.
Прошу прощения, не понял. Является ли допустимым такое действие? И есть ли в САПР способ это "узаконить"? Или то что я сделал все равно не поможет получать корректные результаты без метастабильностей?


--------------------
Go to the top of the page
 
+Quote Post
makc
сообщение Jan 15 2017, 17:21
Сообщение #4


Гуру
******

Группа: Админы
Сообщений: 3 621
Регистрация: 18-10-04
Из: Москва
Пользователь №: 904



Читайте про FROM:TO (Multi-Cycle) Constraints.


--------------------
BR, Makc
В недуге рождены, вскормлены тленом, подлежим распаду. (с) У.Фолкнер.
Go to the top of the page
 
+Quote Post
OM-S
сообщение Jan 15 2017, 17:56
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 19
Регистрация: 12-05-05
Из: г. Москва
Пользователь №: 4 944



Про мультицикл уже ответили.
Когда я разбирался, мне очень помогли статьи здесь http://embedders.org/content/timequest-dly...bnyi-multicycle
Go to the top of the page
 
+Quote Post
AVR
сообщение Jan 15 2017, 18:21
Сообщение #6


фанат Linux'а
*****

Группа: Свой
Сообщений: 1 353
Регистрация: 23-10-05
Из: SPB.RU
Пользователь №: 10 008



Цитата(OM-S @ Jan 15 2017, 20:56) *
Про мультицикл уже ответили.
Да, спасибо. Правда у меня не Altera, но не суть. Главное меня пнули в нужном направлении, дальше я сам попробую разобраться и отпишусь тут как я это прописал у себя в проекте sm.gif


--------------------
Go to the top of the page
 
+Quote Post
DuHast
сообщение Jan 15 2017, 19:42
Сообщение #7


Местный
***

Группа: Свой
Сообщений: 314
Регистрация: 13-07-06
Из: Москва
Пользователь №: 18 797



Цитата(AVR @ Jan 15 2017, 21:21) *
Да, спасибо. Правда у меня не Altera, но не суть.


Цитата(AVR @ Jan 15 2017, 21:21) *
Spartan 6, UCF.


wacko.gif
Go to the top of the page
 
+Quote Post
Shivers
сообщение Jan 15 2017, 20:05
Сообщение #8


Знающий
****

Группа: Свой
Сообщений: 680
Регистрация: 11-02-08
Из: Msk
Пользователь №: 34 950



Самое главное с малтисайклом, это что по сетапу указывается на 1 такт больше чем по холду. Если по сетапу малтисайкл 3, то по холду 2. Если по сетапу 5,то по холду 4. Если по сетапу 2, то по холду 1. и т.д.
Go to the top of the page
 
+Quote Post
Bad0512
сообщение Jan 16 2017, 00:55
Сообщение #9


Знающий
****

Группа: Свой
Сообщений: 802
Регистрация: 11-05-07
Из: Томск
Пользователь №: 27 650



Цитата(AVR @ Jan 15 2017, 20:41) *
Есть проект, в котором выполняется одновременно умножение и суммирование за один такт двух многоразрядных регистров. На частоте 50 МГц констрейны выполнялись, теперь встала необходимость повысить частоту до 75 МГц. Вся схема на более высокой частоте работает, но вот конкретно это место не проходит.

А нельзя эти действия(умножение и сложение) разбить на 2 такта удвоенной частоты? То есть 150МГц. Умножители в 6 спартане спокойно молотят на частоте 300МГц (см.DS162 p.43), но при условии использования всех внутренних регистров. В случае если разрядность входных данных больше, чем 18 * 25 можно разбить на 4 отдельных умножения.
Ну и как уже говорили выше, можно поюзать мультициклы, но ИМХО это менее изящное решение.

Go to the top of the page
 
+Quote Post
andrew_b
сообщение Jan 16 2017, 05:22
Сообщение #10


Профессионал
*****

Группа: Свой
Сообщений: 1 975
Регистрация: 30-12-04
Из: Воронеж
Пользователь №: 1 757



Цитата(Shivers @ Jan 15 2017, 23:05) *
Самое главное с малтисайклом, это что по сетапу указывается на 1 такт больше чем по холду. Если по сетапу малтисайкл 3, то по холду 2. Если по сетапу 5,то по холду 4. Если по сетапу 2, то по холду 1. и т.д.
Нету в UCF никаких сетапов и холдов у мультицикла. Там всё проще делается.
Go to the top of the page
 
+Quote Post
Shivers
сообщение Jan 16 2017, 06:24
Сообщение #11


Знающий
****

Группа: Свой
Сообщений: 680
Регистрация: 11-02-08
Из: Msk
Пользователь №: 34 950



Цитата(andrew_b @ Jan 16 2017, 08:22) *
Нету в UCF никаких сетапов и холдов у мультицикла. Там всё проще делается.

Там выше ссылка на гайд по таймквесту - малтисайкл указан и по сетапу и по холду, это эти ключи и в стандарте SDC. Я лишь указал на важность того, чтобы правильно указывать число тактов, поскольку сам не раз налетал на эти грабли.
Go to the top of the page
 
+Quote Post
andrew_b
сообщение Jan 16 2017, 06:47
Сообщение #12


Профессионал
*****

Группа: Свой
Сообщений: 1 975
Регистрация: 30-12-04
Из: Воронеж
Пользователь №: 1 757



Цитата(Shivers @ Jan 16 2017, 09:24) *
Там выше ссылка на гайд по таймквесту
Блин, ну вы хоть читайте тему прежде чем писать в неё. Какой таймквест? Тут Xilinx UCF? Знаете, что это такое?
Go to the top of the page
 
+Quote Post
AVR
сообщение Jan 28 2017, 15:51
Сообщение #13


фанат Linux'а
*****

Группа: Свой
Сообщений: 1 353
Регистрация: 23-10-05
Из: SPB.RU
Пользователь №: 10 008



Цитата(makc @ Jan 15 2017, 20:21) *
Читайте про FROM:TO (Multi-Cycle) Constraints.

В документе ug612.pdf есть раздел по этой теме, и есть вот такой пример:
Код
INST */gen_dqs*.u_iob_dqs/u_iddr_dq_ce TNM = TNM_DQ_CE_IDDR;
INST */gen_dq*.u_iob_dq/gen_stg2_*.u_iddr_dq TNM = TNM_DQS_FLOPS;
TIMESPEC TS_DQ_CE = FROM TNM_DQ_CE_IDDR TO TNM_DQS_FLOPS TS_SYS_CLK * 2;
Я так понимаю, это означать что эти пути могут быть в два раза медленнее чем основная логика (TS_SYS_CLK).

Мой код таков (begin end - просто лишнее между удалено):
Код
34: begin
    temp <= (sum2 * r_cos);
end
37: begin
    temp <= temp - (sum1 * r_sin);
end
40: begin
где
Код
reg signed [64:0] temp;
reg signed [33:0] sum1, sum2;
reg signed [22:0] r_sin;
reg signed [22:0] r_cos;

Сначала хотелось бы понять как это описать для первого действия temp <= (sum2 * r_cos). Предположительно, констрейн я должен писать так:
Код
NET "adc_clkout" TNM_NET = clkout_pin;
TIMESPEC TS_clkout_pin = PERIOD clkout_pin 75000 kHz;

INST /temp TNM = TNM_TEMP;
INST <???> TNM = TNM_SUM2_COS;
TIMESPEC TS_MC1 = FROM TNM_SUM2_COS TO TNM_TEMP TS_clkout_pin * 3;

Вопрос: как описать TNM_SUM2_COS, который бы характеризовал это действие: sum2 * r_cos???
Я пока думаю что могу описать это как wire [65:0] sum2_cos = sum2 * r_cos; и тогда в констрейн я укажу:
Код
INST /sum2_cos TNM = TNM_SUM2_COS;


--------------------
Go to the top of the page
 
+Quote Post
andrew_b
сообщение Jan 28 2017, 17:37
Сообщение #14


Профессионал
*****

Группа: Свой
Сообщений: 1 975
Регистрация: 30-12-04
Из: Воронеж
Пользователь №: 1 757



Цитата(AVR @ Jan 28 2017, 18:51) *
Предположительно, констрейн я должен писать так:
Код
NET "adc_clkout" TNM_NET = clkout_pin;
   TIMESPEC TS_clkout_pin = PERIOD clkout_pin 75000 kHz;
  
   INST /temp TNM = TNM_TEMP;
   INST <???> TNM = TNM_SUM2_COS;
   TIMESPEC TS_MC1 = FROM TNM_SUM2_COS TO TNM_TEMP TS_clkout_pin * 3;
Если вы задаёте PERIOD в герцах, то надо писать TS_clkout_pin/3. Если в наносекундах, то умножать.
Одно из преимуществ ucf перед sdc -- это более простое описание мультицикла. Если у нас есть такой код (пишу на VHDL, не обессудьте):
Код
process (clkout_pin)
begin
     if (rising_edge (clkout_pin)) then
         if (ce_a = '1') then
            A <= function1;
         endif;

         if (ce_b) then
            B <= function2;
         endif;
     end if;
end process;

то мультицикл от A до B пишется так:
Код
   TIMESPEC TS_clkout_pin = PERIOD clkout_pin 75000 kHz;
    
NET ce_a TNM = ce_a;
NET ce_b TNM = ce_b;
TIMESPEC TS_AB = FROM ce_a TO ce_b TS_clkout_pin/3;
Go to the top of the page
 
+Quote Post
AVR
сообщение Jan 28 2017, 17:48
Сообщение #15


фанат Linux'а
*****

Группа: Свой
Сообщений: 1 353
Регистрация: 23-10-05
Из: SPB.RU
Пользователь №: 10 008



Цитата(andrew_b @ Jan 28 2017, 20:37) *
Если вы задаёте PERIOD в герцах, то надо писать TS_clkout_pin/3. Если в наносекундах, то умножать.
Одно из преимуществ ucf перед sdc -- это более простое описание мультицикла. Если у нас есть такой код (пишу на VHDL, не обессудьте):
Код
process (clkout_pin)
begin
     if (rising_edge (clkout_pin)) then
         if (ce_a = '1') then
            A <= function1;
         endif;

         if (ce_b) then
            B <= function2;
         endif;
     end if;
end process;

то мультицикл от A до B пишется так:
Код
   TIMESPEC TS_clkout_pin = PERIOD clkout_pin 75000 kHz;
    
NET ce_a TNM = ce_a;
NET ce_b TNM = ce_b;
TIMESPEC TS_AB = FROM ce_a TO ce_b TS_clkout_pin/3;

Про период в герцах спасибо, это важно.
Пример пока не очень понял. Какая связь в примере между ce_a и ce_b? Они же независимы, параллельны.
Про NET ce_a TNM = ce_a тоже вопрос, получается что регистр или линию просто объявляют через NET а не через INST? Не ясно как это к моему примеру пришить, подскажите пожалуйста если можете, как задать что function1 или function2 может выполняться три такта?

Или суть в том что Ваш пример задает то, что между процессами в ветках, активизирующихся ce_a и ce_b может быть три такта? Что тогда в моем случае будет объявляться в NET??? Ведь у меня там по сути равенство регистра state значениям 34 и 37...


--------------------
Go to the top of the page
 
+Quote Post
andrew_b
сообщение Jan 29 2017, 06:08
Сообщение #16


Профессионал
*****

Группа: Свой
Сообщений: 1 975
Регистрация: 30-12-04
Из: Воронеж
Пользователь №: 1 757



Попробую немного по-другому.
У вас есть два регистра. То, что хранится в первом, вы как-то обрабатываете и результат защёлкиваете во второй. Но на эту обработку надо больше чем один такт клока. Самое простое решение -- это использование clock enable. В первом регистре данные защёлкиваются по одному cе, во втором -- по другому. Вы формируете эти ce так, что второй ce задержан относительно первого на нужное число тактов. Формируете любым способом: сдвиговым регистром, счётчиком, FSM, главное обеспечить нужное расстояние между ce.
Код
process (clkout_pin)
begin
     if (rising_edge (clkout_pin)) then
         if (ce_a = '1') then
            A <= X;
         endif;

         if (ce_b = '1') then
            B <= A * A;
         endif;

         ce_i <= ce_a;
         ce_b <= ce_i;
     end if;
end process;

Поскольку один регистр полностью контролируется ce_a, а второй ce_b, то мультицикл описывается как время от ce_a до ce_b. ucf получается таким, как я написал в предыдущем посте.

Вы можете переписать ваш код так?
Код
34: begin
    temp1 <= sum1 * r_sin;
    temp2 <= sum2 * r_cos;
end
37: begin
    temp <= temp2 - temp1;
end
40: begin
Если да, то тут вы формируете только cе для temp1, temp2 и temp3, а их самих выносите в отдельный always с примененим этих ce.
Go to the top of the page
 
+Quote Post
AVR
сообщение Jan 29 2017, 16:43
Сообщение #17


фанат Linux'а
*****

Группа: Свой
Сообщений: 1 353
Регистрация: 23-10-05
Из: SPB.RU
Пользователь №: 10 008



Цитата(andrew_b @ Jan 29 2017, 09:08) *
Поскольку один регистр полностью контролируется ce_a, а второй ce_b, то мультицикл описывается как время от ce_a до ce_b. ucf получается таким, как я написал в предыдущем посте.

Этот пример понятнее. Я сделал так:
Код
reg c_mx1;
reg c_mx2;
reg c_mx3;
initial begin
    c_mx1 = 0;
    c_mx2 = 0;
    c_mx3 = 0;
end

always @(posedge adc_clkout) begin
    case(state)
    0: begin
        c_mx1 <= 0;
        c_mx2 <= 0;
        c_mx3 <= 0;
    end
...
    33: c_mx1 <= 1;
    34: if(c_mx1) temp <= (sum2 * r_cos);
    36: c_mx2 <= 1;
    37: if(c_mx2) temp <= temp - (sum1 * r_sin);
    39: c_mx3 <= 1;
    40: if(c_mx3) begin ...
end
Код
NET "adc_clkout" TNM_NET = clkout_pin;
TIMESPEC TS_clkout_pin = PERIOD clkout_pin 75000 kHz;
NET "adc_clkout" LOC = P50;

NET c_mx1 TNM = T_MX1;
NET c_mx2 TNM = T_MX2;
NET c_mx3 TNM = T_MX3;
TIMESPEC TS_MX12 = FROM T_MX1 TO T_MX2 TS_clkout_pin/3;
TIMESPEC TS_MX23 = FROM T_MX2 TO T_MX3 TS_clkout_pin/3;

В итоге пишет что TS_MX12 и TS_MX23 успешно проходят, а вот TS_clkout_pin по-прежнему не проходит, ругается конкретно на место "temp <= temp - (sum1 * r_sin)".


--------------------
Go to the top of the page
 
+Quote Post
andrew_b
сообщение Jan 30 2017, 11:19
Сообщение #18


Профессионал
*****

Группа: Свой
Сообщений: 1 975
Регистрация: 30-12-04
Из: Воронеж
Пользователь №: 1 757



Цитата(AVR @ Jan 29 2017, 19:43) *
Код
reg c_mx1;
     always @(posedge adc_clkout) begin
         case(state)
         0: begin
             c_mx1 <= 0;
             c_mx2 <= 0;
             c_mx3 <= 0;
         end
     ...
         33: c_mx1 <= 1;
         34: if(c_mx1) temp <= (sum2 * r_cos);
         36: c_mx2 <= 1;
         37: if(c_mx2) temp <= temp - (sum1 * r_sin);
         39: c_mx3 <= 1;
         40: if(c_mx3) begin ...
     end

TS_clkout_pin по-прежнему не проходит, ругается конкретно на место "temp <= temp - (sum1 * r_sin)".

Так вы можете переделать так, как я писал постом выше?
Go to the top of the page
 
+Quote Post
AVR
сообщение Jan 30 2017, 11:26
Сообщение #19


фанат Linux'а
*****

Группа: Свой
Сообщений: 1 353
Регистрация: 23-10-05
Из: SPB.RU
Пользователь №: 10 008



Цитата(andrew_b @ Jan 30 2017, 14:19) *
Так вы можете переделать так, как я писал постом выше?

Могу, постараюсь так сделать, хотя если честно, не очень понимаю, разве то что я сделал - оно не эквивалентно Вашей схеме?


--------------------
Go to the top of the page
 
+Quote Post
lastpoint
сообщение Jan 31 2017, 10:17
Сообщение #20


Участник
*

Группа: Участник
Сообщений: 50
Регистрация: 1-08-12
Из: Смоленск
Пользователь №: 72 975



А что мешает реализовать умножение и вычитание через IPcore "Multiplier"? При создании можно выставить задержку получения результата в тактах. По опыту применения такой подход даёт стабильную работу на частотах, когда простое умножение (через символ *) уже не работает
Go to the top of the page
 
+Quote Post
AVR
сообщение Jan 31 2017, 12:04
Сообщение #21


фанат Linux'а
*****

Группа: Свой
Сообщений: 1 353
Регистрация: 23-10-05
Из: SPB.RU
Пользователь №: 10 008



Цитата(lastpoint @ Jan 31 2017, 13:17) *
А что мешает реализовать умножение и вычитание через IPcore "Multiplier"? При создании можно выставить задержку получения результата в тактах. По опыту применения такой подход даёт стабильную работу на частотах, когда простое умножение (через символ *) уже не работает
Спасибо, мысль интересная, если там действительно можно выставить задержку. Это ведь автоматически приводит к учету этой задержки в анализаторе таймингов, верно?

Но всё же, хотелось бы разобраться с таймингами через мультицикл, так, на будущее.
Для этого я пожалуй потом создам отдельный проектик и попробую последовать рекомендациям andrew_b


--------------------
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 29th July 2025 - 13:52
Рейтинг@Mail.ru


Страница сгенерированна за 0.01589 секунд с 7
ELECTRONIX ©2004-2016