1891ВМ12Я 0 15 января, 2017 Опубликовано 15 января, 2017 · Жалоба Есть проект, в котором выполняется одновременно умножение и суммирование за один такт двух многоразрядных регистров. На частоте 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 раза выше. Непонятное место в документации. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrew_b 15 15 января, 2017 Опубликовано 15 января, 2017 · Жалоба 2) Можно ли это как-то "узаконить" в глазах анализатора таймингов? Что вот это место может обрабатываться три такта и не обязательно влезать в один такт 75 МГц.Мультицикл же. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
1891ВМ12Я 0 15 января, 2017 Опубликовано 15 января, 2017 · Жалоба Мультицикл же.Прошу прощения, не понял. Является ли допустимым такое действие? И есть ли в САПР способ это "узаконить"? Или то что я сделал все равно не поможет получать корректные результаты без метастабильностей? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
makc 201 15 января, 2017 Опубликовано 15 января, 2017 · Жалоба Читайте про FROM:TO (Multi-Cycle) Constraints. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
OM-S 0 15 января, 2017 Опубликовано 15 января, 2017 · Жалоба Про мультицикл уже ответили. Когда я разбирался, мне очень помогли статьи здесь http://embedders.org/content/timequest-dly...bnyi-multicycle Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
1891ВМ12Я 0 15 января, 2017 Опубликовано 15 января, 2017 · Жалоба Про мультицикл уже ответили.Да, спасибо. Правда у меня не Altera, но не суть. Главное меня пнули в нужном направлении, дальше я сам попробую разобраться и отпишусь тут как я это прописал у себя в проекте :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DuHast 0 15 января, 2017 Опубликовано 15 января, 2017 · Жалоба Да, спасибо. Правда у меня не Altera, но не суть. Spartan 6, UCF. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Shivers 0 15 января, 2017 Опубликовано 15 января, 2017 · Жалоба Самое главное с малтисайклом, это что по сетапу указывается на 1 такт больше чем по холду. Если по сетапу малтисайкл 3, то по холду 2. Если по сетапу 5,то по холду 4. Если по сетапу 2, то по холду 1. и т.д. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Bad0512 2 16 января, 2017 Опубликовано 16 января, 2017 · Жалоба Есть проект, в котором выполняется одновременно умножение и суммирование за один такт двух многоразрядных регистров. На частоте 50 МГц констрейны выполнялись, теперь встала необходимость повысить частоту до 75 МГц. Вся схема на более высокой частоте работает, но вот конкретно это место не проходит. А нельзя эти действия(умножение и сложение) разбить на 2 такта удвоенной частоты? То есть 150МГц. Умножители в 6 спартане спокойно молотят на частоте 300МГц (см.DS162 p.43), но при условии использования всех внутренних регистров. В случае если разрядность входных данных больше, чем 18 * 25 можно разбить на 4 отдельных умножения. Ну и как уже говорили выше, можно поюзать мультициклы, но ИМХО это менее изящное решение. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrew_b 15 16 января, 2017 Опубликовано 16 января, 2017 · Жалоба Самое главное с малтисайклом, это что по сетапу указывается на 1 такт больше чем по холду. Если по сетапу малтисайкл 3, то по холду 2. Если по сетапу 5,то по холду 4. Если по сетапу 2, то по холду 1. и т.д.Нету в UCF никаких сетапов и холдов у мультицикла. Там всё проще делается. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Shivers 0 16 января, 2017 Опубликовано 16 января, 2017 · Жалоба Нету в UCF никаких сетапов и холдов у мультицикла. Там всё проще делается. Там выше ссылка на гайд по таймквесту - малтисайкл указан и по сетапу и по холду, это эти ключи и в стандарте SDC. Я лишь указал на важность того, чтобы правильно указывать число тактов, поскольку сам не раз налетал на эти грабли. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrew_b 15 16 января, 2017 Опубликовано 16 января, 2017 · Жалоба Там выше ссылка на гайд по таймквестуБлин, ну вы хоть читайте тему прежде чем писать в неё. Какой таймквест? Тут Xilinx UCF? Знаете, что это такое? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
1891ВМ12Я 0 28 января, 2017 Опубликовано 28 января, 2017 · Жалоба Читайте про 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; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrew_b 15 28 января, 2017 Опубликовано 28 января, 2017 · Жалоба Предположительно, констрейн я должен писать так: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; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
1891ВМ12Я 0 28 января, 2017 Опубликовано 28 января, 2017 · Жалоба Если вы задаёте 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... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться