2016-03-21 25 views
3

Simülatördeki farklı Q_VLD1 ve Q_VLD2 sinyal gecikmelerinin sebebi nedir? Result of simulation. Simülatörün beklenen davranışı var mı, değil mi?Basit VHDL devresinin beklenmeyen davranışı

Xilinx Isim kullanıyorum. bunun için kod ve testbençe vardır: Yalnızca, aşağıdaki şekildeki gibi görünebilir simülasyon zamana dayalı, assign_test modülünde dahili sinyallerin bakarsak Yani

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

Sevgili downvoter, bir yorumda bulunma sebebi olan bir yorum yaptıysanız harika olurdu, bu yüzden soru geliştirilebilir. –

cevap

5

(d_vld_dly* önce Q_VLD* atamak edilir). bu rakamın VHDL concept of delta delay göstermez çünkü

enter image description here

Ama rakam, yanıltıcı. Dalga biçimi, delta gecikmelerini göstermek için genişletilirse (bu durumda ModelSim kullanılarak), aşağıdakine benzer.

enter image description here

Yani bu yeni değer bir sonraki yükselen saat kenarında dek saate görmedim sayede assign_test yılında D_VLD_i <= D_VLD; aslında D_VLD_i bir delta gecikme geciktirir ortaya koymaktadır.

Bu sorunun nedeni, test tezgahı fakat bağımsız bir şekilde, aynı simülasyon zamanda, saat sonra, veriler bir delta gecikmesini saat bir neden olarak giriş verilerini oluşturmak olmamasıdır ve saat gibi aynı delta gecikme.

wait for CLK_period*10; 

için:

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

sonra verecek olan saat beklemek durumunda

test tezgahı saatinin bir nedeni gibi verileri üretmek için güncellenebilir, değiştirilir aşağıdaki gibi bir dalga formu:

( )

Buna dayanarak, iyi bir test tezgahı tasarımı için bir kural, sentezlenen modüllerdeki veri üretme ile aynı şekilde uyaran üretmek, böylece test tezgahından gelen uyaranlar, genel olarak modüller arasındaki verilere benzemekte, beklenen ve güvenilir olabilmektedir. test tezgahı davranışı.