Следует избегать переназначения часов из-за причины задержки дельта-цикла, которую вы описываете.
Это не повлияет на результат синтеза, но это может вызвать проблемы при моделировании, например, если несколько вложенных модулей переназначают часы, в результате чего часы могут задерживаться многочисленными дельта-задержками, но связанные данные могут не иметь подобной дельта-задержки, в результате чего дизайн не будет имитироваться как ожидаемый синхронный дизайн.
Изображение ниже, показывают, что происходит, где clk
обновления cnt
, clk
также используется для захвата cnt
к cap_clk
и clk
затем переназначить как:
clk_delta_1 <= clk;
и clk_delta_1
затем используется для захвата cnt
для cap_delta_1
, В результате cap_clk
и cap_delta_1
не фиксируют одинаковые значения при моделировании.
Однако в синтезированной конструкции clk_delta_1 <= clk;
будет простой провод, так cap_delta_1
захватит на основе clk
, поэтому моделирование и результат синтеза не будет одинаковым для дизайна в этом случае, который это причина, по которой следует избегать переназначения часов.
Если по какой-то причине требуется переименование сигнала, то псевдоним может быть использована, таким образом делая новое имя для clk
без задержки дельта, как:
alias clk_delta_0 : std_logic is clk;
Как видно из рисунка, то cnt
, снятый на clk_delta_0
, до cap_delta_0
будет иметь те же значения, что и cap_clk
, так как нет дельта-задержки между clk
и clk_delta_0
. Однако, если это возможно, следует избегать такого переименования, поскольку это затрудняет чтение кода.
Спасибо за подробный ответ! –