2014-12-15 3 views
1

Возьмут следующий код, например:Буферизации входного параметра для процесса заявления

s_Clock_Data <= pi_Clock_Data; 

Shifter : 
process(s_Clock_Data) 
begin 
    if falling_edge(s_Clock_Data) then 
     s_Shifter <= s_Shifter(s_Shifter'high - 1 downto 0) & pi_Data; 
    end if; 
end process; 

Где pi_Clock_Data и pi_Data портовых входы модуля.

Есть ли определенная причина, по которой pi_Clock_Data требуется сначала назначить s_Clock_Data до того, как процесс будет запущен? Поскольку pi_Data также является входом в fpga, кажется, что при этом данные синхронизации могут отставать от дельта-цикла по отношению к pi_Data.

Не могли бы мы иметь процесс (pi_Clock_Data) вместо этого?

ответ

2

Следует избегать переназначения часов из-за причины задержки дельта-цикла, которую вы описываете.

Это не повлияет на результат синтеза, но это может вызвать проблемы при моделировании, например, если несколько вложенных модулей переназначают часы, в результате чего часы могут задерживаться многочисленными дельта-задержками, но связанные данные могут не иметь подобной дельта-задержки, в результате чего дизайн не будет имитироваться как ожидаемый синхронный дизайн.

Изображение ниже, показывают, что происходит, где clk обновления cnt, clk также используется для захвата cnt к cap_clk и clk затем переназначить как:

clk_delta_1 <= clk; 

и clk_delta_1 затем используется для захвата cnt для cap_delta_1 , В результате cap_clk и cap_delta_1 не фиксируют одинаковые значения при моделировании.

enter image description here

Однако в синтезированной конструкции 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. Однако, если это возможно, следует избегать такого переименования, поскольку это затрудняет чтение кода.

+1

Спасибо за подробный ответ! –

Смежные вопросы