2017-02-20 73 views
0

因此,通過我自己的研究,我明白如果我們在過程中分配信號,它將在過程後更新。現在,如果我們直接分配一個輸出值,那麼在進程之後它也會被更新或者沒有? 我附上兩個版本作爲一個簡單的例子來說明我的意思。在過程中分配信號與分配實際輸出之間的區別

版本1:

library IEEE; 
use IEEE.STD_LOGIC_1164.ALL; 

entity testing is 
port(
    clk : in std_logic; 
    a : in std_logic; 
    b : in std_logic; 
    c : out std_logic 
); 

end testing; 

architecture arch of testing is 

signal temp: std_logic; 

begin 

process(clk) 

begin 

    if(rising_edge(clk)) then 

     if(a = '1' and b = '1') then 

      temp <= '1' 

     end if; 

    end if; 

end process; 

c <= temp; 

end arch; 

現在另一個版本:

library IEEE; 
use IEEE.STD_LOGIC_1164.ALL; 

entity testing is 
port(
    clk : in std_logic; 
    a : in std_logic; 
    b : in std_logic; 
    c : out std_logic 
); 

end testing; 

architecture arch of Intermediate is 

begin 

process(clk) 

begin 

    if(rising_edge(clk)) then 

     if(a = '1' and b = '1') then 

      C <= '1'; 

     end if; 

    end if; 

end process; 

end arch; 

是否有一個時間差在這裏?在第二個版本中,C會比第一個版本高嗎?

回答

0

C將在第二個示例中與您的第一個示例相比稍早分配。此外,使用較少的資源,因爲在第二個示例中沒有中間寄存器(temp)。

在第一個例子中,將temp上時鐘的下降沿被分配,並且C是一個並行分配(即,一旦temp變化,C變化)。但是,實際上,由於信號傳播,在temp更改之後,此分配會發生一些「少量時間」。

在第二個示例中,您直接分配到C,這將發生在時鐘下降沿。

我知道你所提供的例子是人爲的,但你可以達到同樣具有:

process(clk) 
begin 
    if rising_edge(clk) then 
     c <= a and b; 
    end if; 
end process; 
0

仿真週期重新開始,直到等待暫停執行各每一道工序。當前時間的其他事件導致增量循環,否則模擬時間前進到下一個預定事件。仿真週期一直持續到事件停止或停止。

並行語句具有等效的詳細過程或塊和過程。詳細的設計層次結構是通過信號事件進行通信的過程的集合。

c可能會在第一個例子中出現一個增量週期,因爲連續的信號分配沒有中間延遲。 Delta循環不消耗simulation time,而是產生順序語句的併發性。

版本1有一個來自併發信號賦值語句的第二個進程,並使用一個附加信號,表示模型的更多執行時間和使用更多資源。版本1本身並不代表重要的負擔。在大量這樣的進程或大量事件中,模型執行時間和內存利用率的差異可以測量。

如果你通常會看到一個中介信號就是信號值除帶動端口本地計算。您不能讀取模式輸出接口信號的值。 (設計單位是獨立分析的,實際的有效值的位置在分析時是未知的,實際是關聯的在細化處,端口代表在港口協會中的形式)

參見IEEE Std 1076-2008, 11.併發語句10.5.2簡單的信號賦值語句; 10。2等待語句; 14.制定和執行;特別是14.5制定一份聲明部分和14.5.5其他並行聲明; 14.7模型的執行,特別是14.7.5模型執行; 6.5.2接口對象聲明; 6.5.7.3港口地圖方面; 14.3.5港口地圖方面。

1

首先,以下是不完全正確的,但它是正確的大多數RTL流程:

過程中的信號不更新,直到 完成

實際規則的過程後,是:

一個信號不會更新,直到下一個增量循環。

WRT一個進程,一個進程不允許增量循環通過,除非該進程在等待時暫停或退出並暫停在敏感列表中。大多數RTL過程都有靈敏度列表,或者頂部只有一個等待語句,因此,對於RTL代碼,我們會得出「不太真實」的結論。

WRT你分配到C:

c <= temp; 

還有在分配δ週期。如果有幫助,語言通過以下變換定義併發任務的執行:

process (temp) is 
begin 
    c <= temp; 
end process ; 

這將幫助你明白髮生了什麼WRT您簡單的RTL規則。

相關問題