Задать вопрос
@atereffigies

ПЛИС. Какой вариант дизайна правильный?

Вопрос касается тактирования, который проще описать простым примером.

Вот, например, есть счётчик "cnt".
Есть сигнал, который разрешает счёт "en".
Есть тактовая частота "clk".

Как, в данном случае, правильно формировать сигнал "en" и почему?
Когда я только начинал заниматься ПЛИС, то я делал что-то вроде этого:

// Сигнал разрешения (защёлкивается по заднему фронту)
always@(negedge clk)
    en <= (какая-то логика);

// Самый обычный счётчик;
always@(posedge clk)
    if (en)
        cnt <= cnt + 1;


Я обосновывал такой подход тем, что к моменту заднего фронта "clk" вся логика, работающая по переднему фронту уже гарантированно установится и триггер защёлкнет нужный мне результат.
Я не принимал никогда во внимание задержки сигналов, т.к. скорости проекта были всегда небольшие -- 8 МГц максимум. И такой подход успешно работал.
Но я начал смотреть разные примеры, смотреть в литературе, но нигде не нашел такого подхода.
Везде логика работала по одному фронту. Копнув дальше, я начал полагать, что этот общепринятый подход основан на задержках распространения сигнала и нет никакой нужды плодить логику, работающую по противоположному фронту.
Я начал перепиливать свой старый проект по "правильному" и столкнулся с тем, что многие вещи тупо не работают как надо.
В симуляторе перед каждым присвоением я ставил задержку, симулируя реальное присвоение:
cnt <= #D cnt + 1; // D -- задаётся параметром;
и ModelSim всегда выдавал адекватный результат. Но в железе возникают ошибки. Иной раз там, где их просто быть не должно.

Как же всё-таки нужно делать?

Усугубляется всё тем, что делаю я на отечественной ПЛИС -- 5576ХС1Т, и вот тут либо я совсем дурак, либо чего-то я не знаю об этой плисине.
  • Вопрос задан
  • 352 просмотра
Подписаться 1 Средний Комментировать
Решения вопроса 1
@Lampus
Правильно - делать полностью синхронный дизайн. То есть все триггеры должны щёлкать по одному фронту одного клока.
Если триггеры щёлкают по разным фронтам, то тут возникает проблема с duty cycle клока. В реальности он получается не идеальные 50%. В теории, STA должен всё это ловить. У вас SDC файл есть?
Ещё надо смотреть что щёлкает триггер en. Там на входе все сигналы синхронные? Триггер en точно в метастабильность уйти не может?
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы