2016-12-02 35 views
0

我試圖寫具有輸入(開始)和三個輸出的計數器被斷言(TSY,TSR,TLG)1 clk_period後4,6和16分別爲clk_period。以下代碼適用於單個開始斷言。怪異延遲輸出行爲兩次

library ieee ; 
    use ieee.std_logic_1164.all ; 
    use ieee.numeric_std.all ; 

entity proj_test is 
    port (
    clk, start : in bit; 
    tsy, tsr, tlg : out bit 
) ; 
end entity ; -- proj_test 

architecture behav of proj_test is 

constant clk_period : time := 100 ns; 

begin 

process (start) 
begin 
    if (start='1') then 
     tsy <= '1' after 4*clk_period, '0' after 5*clk_period; 
     tsr <= '1' after 6*clk_period, '0' after 7*clk_period; 
     tlg <= '1' after 16*clk_period, '0' after 17*clk_period; 
    end if; 
end process; 

end architecture ; -- behav 

Output for a single start

start脈衝是400個納秒間隔,如通過下面的代碼從動:

library ieee ; 
    use ieee.std_logic_1164.all ; 
    use ieee.numeric_std.all ; 

entity proj_test_test is 
end entity proj_test_test; 

architecture behav of proj_test_test is 
    constant clk_period : time := 100 ns; 
    signal clk, start : bit; 
    signal tsy, tsr, tlg : bit; 
begin 

    P : entity work.proj_test port map (clk, start, tsy, tsr, tlg); 

    start <= '0', 
      '1' after 2*clk_period, 
      '0' after 3*clk_period, 
      '1' after 6*clk_period, 
      '0' after 7*clk_period, 
      '1' after 42*clk_period; 

end architecture behav; 

或以下模擬器命令:

force -freeze sim:/proj_test/clk 0 0, 1 {50 ns} -r 100 
force -freeze sim:/proj_test/start 1 0, 0 100, 1 400, 0 500 

然而,當我斷言輸入start第二時間,tsy跨越多個時鐘週期。

Output for an added start

我試圖理解爲什麼。我的猜測是第二個過程調用「刷新」第一個過程的任務。另外,有沒有更好的方法來編寫這個櫃檯的行爲?

+0

您是否正在編寫可合成的代碼? –

+0

@scary_jeff不,它是用於測試平臺的。 – usfmohy

+0

請發佈[MCVE](http://stackoverflow.com/help/mcve)。奇怪的行爲看起來在這個代碼之外。 –

回答

2

甲VHDL模擬器維持一個事件隊列。這是模擬器的「待辦事項」列表。執行VHDL的任何線與一個信號分配的作用是修改事件隊列。通常情況下,事件會添加到事件隊列中,但通常也可以刪除事件。活動會以模特慣性延遲被刪除;在VHDL中,延遲默認是慣性的。

爲了慣性延遲模型中,當一個事件被添加到事件 隊列,被調度在相同的時間發生或 較早除去任何情況下,除非該事件的效果是一樣的作爲添加新事件的 效果。

當您的代碼正在執行時,事件將通過後續的信號分配從事件隊列中移除。我們需要詳細分析事件隊列。

所以,在時間0 ns,事件隊列爲空。這條線在時間0執行

start <= '0', 
     '1' after 2*clk_period, 
     '0' after 3*clk_period, 
     '1' after 6*clk_period, 
     '0' after 7*clk_period, 
     '1' after 42*clk_period; 

將6個事件放到事件隊列中。事件隊列現在看起來是這樣的:

TIME  DELTA SIGNAL VALUE 
    0 ns 1  start  '0' 
200 ns 0  start  '1' 
300 ns 0  start  '0' 
600 ns 0  start  '1' 
700 ns 0  start  '0' 
4200 ns 0  start  '1' 

在時間200納秒,start被驅動到'1'等以下三行得到執行:

tsy <= '1' after 4*clk_period, '0' after 5*clk_period; 
tsr <= '1' after 6*clk_period, '0' after 7*clk_period; 
tlg <= '1' after 16*clk_period, '0' after 17*clk_period; 

裏面放6個事件到事件隊列。事件隊列現在看起來是這樣的:

TIME  DELTA SIGNAL VALUE 
600 ns 0  start  '1' 
600 ns 0  tsy  '1' 
700 ns 0  start  '0' 
700 ns 0  tsy  '0' 
800 ns 0  tsr  '1' 
900 ns 0  tsr  '0' 
1800 ns 0  tlg  '1' 
1900 ns 0  tlg  '0' 
4200 ns 0  start  '1' 

然後在600納秒start被驅動到'1'

TIME  DELTA SIGNAL VALUE 
300 ns 0  start  '0' 
600 ns 0  start  '1' 
600 ns 0  tsy  '1' 
700 ns 0  start  '0' 
700 ns 0  tsy  '0' 
800 ns 0  tsr  '1' 
900 ns 0  tsr  '0' 
1800 ns 0  tlg  '1' 
1900 ns 0  tlg  '0' 
4200 ns 0  start  '1' 
在300納秒 start被驅動到 '0'等事件隊列現在看起來是這樣

然後(和tsy被驅動到'1'太)等事件隊列現在看起來是這樣的:

TIME  DELTA SIGNAL VALUE 
700 ns 0  start  '0' 
700 ns 0  tsy  '0' 
800 ns 0  tsr  '1' 
900 ns 0  tsr  '0' 
1800 ns 0  tlg  '1' 
1900 ns 0  tlg  '0' 
4200 ns 0  start  '1' 

及以下三條線再次得到執行:

tsy <= '1' after 4*clk_period, '0' after 5*clk_period; 
tsr <= '1' after 6*clk_period, '0' after 7*clk_period; 
tlg <= '1' after 16*clk_period, '0' after 17*clk_period; 

裏面放6個事件的事件隊列:

TIME  DELTA SIGNAL VALUE 
1000 ns 0  tsy  '1' 
1100 ns 0  tsy  '0' 
1200 ns 0  tsr  '1' 
1300 ns 0  tsr  '0' 
2200 ns 0  tlg  '1' 
2300 ns 0  tlg  '0' 

如果你按照我上面給了規則,你看到事件隊列外觀像這樣:

TIME  DELTA SIGNAL VALUE 
700 ns 0  start  '0' 
1000 ns 0  tsy  '1' 
1100 ns 0  tsy  '0' 
1200 ns 0  tsr  '1' 
1300 ns 0  tsr  '0' 
2200 ns 0  tlg  '1' 
2300 ns 0  tlg  '0' 
4200 ns 0  start  '1' 

因爲這五個事件被刪除:

TIME  DELTA SIGNAL VALUE 
700 ns 0  tsy  '0' 
800 ns 0  tsr  '1' 
900 ns 0  tsr  '0' 
1800 ns 0  tlg  '1' 
1900 ns 0  tlg  '0' 

如果你看的痕跡,你看,這些事件正是發生:

  • tsy下降沿被刪除(因此寬脈衝);
  • tsr上的前兩個事件被刪除(因此只有一個脈衝);
  • tlg上的前兩個事件被刪除(因此只有一個脈衝)。
+0

謝謝你的時間,這是一個非常豐富的答案。 – usfmohy