2013-11-14 18 views
0

我在Logisim上實現了一個單週期處理器,主要有5個子電路(所有複雜設計用於主電路)。這5個子電路在主電路中彼此之間將存在錯綜複雜的聯繫。在第三個子電路中,我使用的是RAM,它基本上表示我訪問的寄存器文件。該寄存器文件也可以在其他各個階段被訪問/編輯。我想知道是否有任何方法,例如當其中一個階段改變RAM(寄存器文件)中的一個值時,它會在所有子電路(和主電路)中改變。我希望我的寄存器文件充當通用RAM,以便它是整個電路中的單個實體。創建全局可訪問的子電路/信號(Logisim)

我試過使用子電路的符號並提供各種輸入和輸出,但是如果輸入改變了該子電路中的RAM,它在其他子電路中不會改變。

+0

Logisim教程狀態「Logisim將保持出現在電路中的所有子電路的不同狀態信息。例如,如果電路包含一個觸發器,並且該電路多次用作一個子電路,那麼當模擬較大的電路時,每個子電路的觸發器都將擁有自己的值。「我想知道是否有任何解決方法。如果所有觸發器都可以具有相同的值。 –

+0

拉出電路並將其添加到頂層設計。明確地將所有用戶連接起來。我無法理解細節,但這是你必須做的事情的本質。 –

+0

那麼沒有其他辦法了?如果我把它拉出來,我的頂級設計電路將會變得更加擁擠,所以我想要另一種方式。無論如何感謝... –

回答

2

VHDL中有一項功能提供了類似於您所要求的功能。但在我們進入之前,您應該聽取Brian的意見,並讓您的註冊文件成爲您設計中的適當實體。這將迫使你想清楚這些部件是如何相互作用的,你必須在某個時候做到這一點。

我正在談論的功能是全局信號。它們可以在包裝中聲明並用於各種實體之間。公平地說,我認爲這不是一個好主意。如您所料,這可能不會讓您的設計更清晰;它會使它更神祕。無論如何,你可以自由嘗試,然後告訴我們你的結論。

這裏有一個小例子來展示我的意思。它不應該做任何有用的事情,但它的ModelSim運行正常,並在的Quartus 12.1合成OK:

package register_file_pkg is 
    type register_file_type is array (0 to 31) of integer range 0 to 255; 
    signal register_file: register_file_type; 
    alias pc is register_file(31); 
end; 
-------------------------------------------------------------------------------- 
use work.register_file_pkg.all; 

entity alu is 
    port (
     clock: in bit; 
     zero_flag: out boolean; 
     last_pc_flag: out boolean 
    ); 
end; 

architecture rtl of alu is 
begin 
    zero_flag <= (register_file(0) = 0); 
    last_pc_flag <= (pc = 255); 

    process (clock) begin 
     if clock'event and clock = '1' then 
      register_file(0) <= pc/4; 
     end if; 
    end process; 
end; 
-------------------------------------------------------------------------------- 
library ieee; 
use ieee.numeric_bit.all; 
use work.register_file_pkg.all; 

entity cpu is 
    port (
     clock: in bit; 
     address_bus: out integer; 
     zero_flag: out boolean; 
     last_pc_flag: out boolean 
    ); 
end; 

architecture rtl of cpu is 
begin 
    address_bus <= pc; 

    process (clock) begin 
     if clock'event and clock = '1' then 
      pc <= pc + 1; 
     end if; 
    end process; 

    cpu_alu: entity work.alu 
     port map(
      clock => clock, 
      zero_flag => zero_flag, 
      last_pc_flag => last_pc_flag 
     ); 
end; 
+0

謝謝Rick:我忘記了共享變量和全局信號(全球信號是VHDL-2008的東西?),所以我立即糾正。至於這是否是一個好主意......我支持我的最後一條評論:-) –

+0

本文http://www.eda.org/VIUF_proc/Fall96/MCKINNEY96A.PDF描述正是以這種方式使用全局信號。作者不建議在爲合成而設計的代碼中使用它們!從那以後,綜合工具無疑有所改進,但我仍然同意他的觀點! –

+0

我使用Brian的建議製作了我的項目,並放棄了通用信號。無論哪種方式,我都無法在Logisim中生成它們,因爲我選擇在那裏(而不是VHDL)中執行我的項目。另外我需要通用寄存器而不是信號。我會在接下來的任務中使用這種方法。 –

相關問題