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

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> Констрейн для простого derived clock, Spartan 6, UCF, constraints
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 Текстовая версия Сейчас: 10th July 2025 - 18:11
Рейтинг@Mail.ru


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