2016-03-21 3 views
3

Какая причина различных задержек сигналов Q_VLD1 и Q_VLD2 в симуляторе? Result of simulation. Ожидается ли поведение симулятора или нет?Неожиданное поведение простой схемы VHDL

Я использую Xilinx Isim. Существует код и испытательный стенд для него:

entity assign_test is 
    port(CLK : in STD_LOGIC; 
     D_VLD : in STD_LOGIC; 
     Q_VLD1 : out STD_LOGIC; 
     Q_VLD2 : out STD_LOGIC 
    ); 
end assign_test; 

architecture Behavioral of assign_test is 
    signal D_VLD_i : std_logic; 
    signal d_vld_dly1 : std_logic; 
    signal d_vld_dly2 : std_logic; 
begin 
    D_VLD_i <= D_VLD; 

    process (clk) is 
    begin 
     if rising_edge(clk) then 
      d_vld_dly1 <= D_VLD; 
      d_vld_dly2 <= D_VLD_i; 
     end if; 
    end process ; 

    Q_VLD1 <= d_vld_dly1; 
    Q_VLD2 <= d_vld_dly2; 
end Behavioral; 


ENTITY tb_assign_test IS 
END tb_assign_test; 
ARCHITECTURE behavior OF tb_assign_test IS 

    COMPONENT assign_test 
    PORT(
     CLK : IN std_logic; 
     D_VLD : IN std_logic; 
     Q_VLD1 : OUT std_logic; 
     Q_VLD2 : OUT std_logic 
     ); 
    END COMPONENT; 

    --Inputs 
    signal CLK : std_logic := '0'; 
    signal D_VLD : std_logic := '0'; 
    --Outputs 
    signal Q_VLD1 : std_logic; 
    signal Q_VLD2 : std_logic; 
    constant CLK_period : time := 10 ns; 

BEGIN 
    uut: assign_test PORT MAP (
      CLK => CLK, 
      D_VLD => D_VLD, 
      Q_VLD1 => Q_VLD1, 
      Q_VLD2 => Q_VLD2 
     ); 

    CLK_process :process 
    begin 
     CLK <= '0'; 
     wait for CLK_period/2; 
     CLK <= '1'; 
     wait for CLK_period/2; 
    end process; 

    stim_proc: process 
    begin   
     wait for 100 ns; 
     wait for 5 ns;  
     wait for CLK_period*10; 
     D_VLD <= '1'; 
     wait for CLK_period*3; 
     D_VLD <= '0'; 
     wait; 
    end process; 
END; 
+1

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

ответ

5

Так что, если вы посмотрите на внутренние сигналы в assign_test модуля, на основе моделирования времени только, это может выглядеть, как на рисунке ниже (d_vld_dly* является, прежде чем назначить Q_VLD*).

enter image description here

Но эта цифра вводит в заблуждение, так как эта цифра не показывает VHDL concept of delta delay. Если форма волны расширяется, чтобы отображать дельта-задержки (с использованием ModelSim в этом случае), она выглядит ниже.

enter image description here

Так что это показывает, что D_VLD_i <= D_VLD; в assign_test фактически задерживает задержку D_VLD_i дельту, в результате чего новое значение не видно на часы до следующего нарастающего фронта тактового сигнала.

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

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

wait for CLK_period*10; 

к:

for i in 1 to 10 loop 
    wait until rising_edge(CLK); 
end loop; 

, который будет давать форма волны как:

enter image description here

Таким образом, на основании этого правила для хорошего тестирования стенда должны генерировать стимулы так же, как генерация данных в синтезированных модулях, поэтому стимулы с тестового стенда похожи на данные между модулями в целом, чтобы получить ожидаемые и надежные и поведение тестового стенда.

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