|
Помогите с констрейнами |
|
|
|
Dec 22 2011, 11:17
|

Профессионал
    
Группа: Свой
Сообщений: 1 261
Регистрация: 14-05-09
Из: Челябинск
Пользователь №: 49 045

|
чем дальше в лес, тем больше дров. как написать блок, который бы работал от 2-х асинхронных клоков? Код module MyMod(clk100, clk50, wr, out); input clk100, clk50, wr; output reg [7:0]out;
reg [7:0]count; reg [7:0]data;
/*в блоке от 100 МГц проводим какой-то анализ и результат запоминаем в data */ always @( posedge clk100) begin count <= count+1; if(count == 0) data <= data+1; end
/* по клоку от 50МГц читаем результат */ always @( posedge clk50) begin if(wr) out <= data; else out <= 8'hzz; end
endmodule клоки асинхронные. если оставить код так, как он есть, то есть вероятность, что чтение данных из data произойдет в тот момент, когда они там меняются. Как от 2-х клоков "правильно" блоки писать, чтоб не было метастабильности?
Сообщение отредактировал juvf - Dec 22 2011, 11:19
|
|
|
|
|
Jul 17 2014, 12:54
|
Участник

Группа: Участник
Сообщений: 34
Регистрация: 25-04-05
Пользователь №: 4 466

|
Добрый день. Чтобы не плодить темы, пишу сюда. Задача простая, но вот не знаю каким констрейном ее решать. Нужно вывести из циклона клок и его же, но инвертированным:
Mem_ClkP <= Clk; Mem_ClkN <= not Clk;
Так вот как описать, что до внешней памяти они должны добежать не сильно разбежавшись от изначальной фазы в 180 градусов? Для конкретики : Сlk = 200 MHz, допустимая разбежка 0.5 ns. Есть задумка рассматривать первого как generated_clock, а второго как данные, чтобы потом задать setup и hold для обоих фронтов, но не уверен я в своих силах. К тому же сомневаюсь, что это верный путь.
Спасибо.
|
|
|
|
|
Jul 17 2014, 13:04
|

я только учусь...
     
Группа: Модераторы
Сообщений: 3 447
Регистрация: 29-01-07
Из: Украина
Пользователь №: 24 839

|
Цитата(otv116 @ Jul 17 2014, 15:54)  Добрый день. Чтобы не плодить темы, пишу сюда. Задача простая, но вот не знаю каким констрейном ее решать. Нужно вывести из циклона клок и его же, но инвертированным:
Mem_ClkP <= Clk; Mem_ClkN <= not Clk;
Так вот как описать, что до внешней памяти они должны добежать не сильно разбежавшись от изначальной фазы в 180 градусов? Для конкретики : Сlk = 200 MHz, допустимая разбежка 0.5 ns. Есть задумка рассматривать первого как generated_clock, а второго как данные, чтобы потом задать setup и hold для обоих фронтов, но не уверен я в своих силах. К тому же сомневаюсь, что это верный путь.
Спасибо. нет желания для этих целей использовать PLL или DCM ?
--------------------
If it doesn't work in simulation, it won't work on the board.
"Ты живешь в своих поступках, а не в теле. Ты — это твои действия, и нет другого тебя" Антуан де Сент-Экзюпери повесть "Маленький принц"
|
|
|
|
|
Jul 17 2014, 19:23
|
Участник

Группа: Участник
Сообщений: 34
Регистрация: 25-04-05
Пользователь №: 4 466

|
Понимаете, тут вопрос не столько в том, как выкинуть эти сигналы наружу, сколько в том, чтобы получше разобраться с констрейнами. Это для примера у меня циклон. А был бы acex, например, то никаких pll не было бы возможности заюзать.
Хочу немного подтянуть знания в области обконстрейнивания проекта.
|
|
|
|
|
Feb 10 2015, 12:39
|
Участник

Группа: Участник
Сообщений: 34
Регистрация: 25-04-05
Пользователь №: 4 466

|
Помогите, пожалуйста, обконстрейнить следующую схему (см. аттач):
DataOut - 10 наносекундный положительный импульс, WE - отрицательный, шириной 7.5 ns. Внешний девайс латчит сигнал с ноги ПЛИС DataOut по фронту сигнала с ноги WE (как обычная SRAM). Параметры внешнего устройства: tsu = 4.9 ns, th = 0.1 ns. В проекте я на Pll сделал сдвинутую тактовую серию. WE делаю как "nand2" тригеров, один из которых латчит разрешающий сигнал основным клоком, а второй - сдвинутым. Пока что мой sdc выглядит так: create_clock -name {ClkIn} -period 10.000 -waveform { 0.000 5.00 } [get_ports {ClkIn}] derive_pll_clocks create_generated_clock -name ClkWE -source [get_nets {inst|altpll_component|_clk0}] -duty_cycle 75 -offset 2 set_output_delay -clock [get_clocks {ClkWE}] -max 4.9 [get_ports {DataOut}] set_output_delay -clock [get_clocks {ClkWE}] -min -0.1 [get_ports {DataOut}] Но это не то, что я хотел бы получить. Не знаю, как timeQuest-у сказать, что WE генерится из двух клоков и что его скважность определяется их сдвигом, задаваемым в настройках Pll. Тоже и про его сдвиг относительно основного. Просто если сейчас я делаю Report Timing, то он рисует latch и launch клоки так, как я прописал в create_generated_clock, а не как на самом деле. Спасибо. Может надо создать виртуальный клок, а DataOut и WE рассматривать как данные, задавая set_output_delay для обоих относительно виртуального...
|
|
|
|
|
Feb 17 2015, 07:11
|
Участник

Группа: Участник
Сообщений: 34
Регистрация: 25-04-05
Пользователь №: 4 466

|
Попробовал с виртуальным клоком. Создал его, потом для DataOut задал set_output_delay. Тут все понятно. С сигналом WE тупик. Я то ему задал set_output_delay относительно виртуального клока, но TimеQuest рассчитывает слаки для этого сигнала дважды: первый раз исходя из того, что WE дрыгается по фронту первого выхода pll, а второй раз - по фронту второго выхода pll. В принципе, это почти то, что мне и надо - для нарастающего фронта WE я бы задал константы, соответствующие tsu и hd относительно виртуального, а для спадающего подобрал бы, чтобы выдерживалась допустимая ширина WE. Но вот как можно задать два набора set_output_delay для WE относительно виртуального клока, чтобы каждый из наборов учитывал только один из выходов Pll?
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|