|
Условный Timing Control на Verilog, Синтезируемый |
|
|
|
Jan 25 2018, 10:53
|
Участник

Группа: Участник
Сообщений: 16
Регистрация: 30-11-17
Пользователь №: 100 439

|
Цитата(DmitryR @ Jan 24 2018, 14:14)  Решил я оптимизировать один простой контроллер, чтобы был кратким (как выстрел, ЛОЛ) и полностью конфигурируемым. В частности чтобы можно было ему задавать фронт, по которому работать. Ну и пишу:
clocking get_edge @((posedge clk iff a) or (negedge clk iff !a));
И сразу же выясняется, что ни clocking, ни даже iff синтезатором (Квартус) не поддерживаются. У кого-нибудь есть идеи, как это сделать элегантно с помощью синтезируемых конструкций? Я понимаю, как это сделать с помощью условной компиляции, но это мне кажется как-то... Не совсем современно, что ли. Сам не пробовал, ну а вдруг Объявите `define EDGE_CLK posedge ну или `define EDGE_CLK negedge и используйте always@(`EDGE_CLK my_clk) begin end
Сообщение отредактировал Dantist2k17 - Jan 25 2018, 10:55
|
|
|
|
|
Jan 25 2018, 12:38
|
Профессионал
    
Группа: Свой
Сообщений: 1 214
Регистрация: 23-12-04
Пользователь №: 1 643

|
Приветствую! Цитата(DmitryR @ Jan 25 2018, 15:10)  Это несомненно возможно, только мне не это надо. Надо, чтобы это зависело от parameter. А в верилоге условная компиляци работает только от define (ifdef/ifndef), параметр как аргумент эти директивы принимать не могут. Вы так и не ответили чем же тогда Вас не устраивает Код parameter clk_sel=0; wire real_clk = clk_sel ? clk : !clk; Так как после синтеза (для FPGA) в любом случае для клоков под negedge будет добавлен инвертор. А вот будет ли он (инвертор) : встроенным в примитив триггера, или как примитив для целой ALM или LCELL макро ячейки или даже как отдельный gobal buffer к инвертному выходу PLL или проосто инвертер на LUT или ... зависит от многих факторов, а не от того как это описанно в RTL - !clk или negedge. Удачи! Rob.
|
|
|
|
|
Jan 25 2018, 17:35
|
Гуру
     
Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454

|
define - это когда их используют как параметры. Тут все как с С, и проблемы те же. Им и прощай. А дефайн для ветвления - ок и он все еще с нами Цитата `define EDGE_CLK posedge именно такое решение я и видел. Я бы предпочел генерайт, именно в силу ограничений дефайна. Боюсь реально необходимость настраиваемого фронта для модуля - ненужная вещь, которая множит ошибки. Если же вы думаете про технику улучшения времянок когда не успевая принять по переднему фронту, переходят на задний - так это порочная практика, ее надо пресекать. Да, да...
|
|
|
|
|
Jan 26 2018, 06:56
|
Местный
  
Группа: Свой
Сообщений: 278
Регистрация: 18-01-05
Из: Санкт-Петербург
Пользователь №: 2 031

|
Цитата хочу настраивать его константой времени компиляции. Код generate if(a)begin ... end else begin ... end endgenerate
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|