2016-03-17 127 views
0

我目前正在學習電氣工程學位,並設計了一個4位ALU作爲任務的一部分。8位至16位ALU轉換

我被問及如何輕鬆將其轉換爲8位ALU。我現在的答案是,我將把所有模塊(add,sub,bux或xor LS,RS等)更改爲8位模塊以及ALU模塊中FPGA板的開關編號。

這是最簡單的方法,還是我能夠設計ALU來調用每個4位門或兩次添加4位模塊的不同名稱?

我覺得好像我已經用盡了我的教科書和網絡,這是令人沮喪的信息必須在那裏!

我正在使用Quartus II進行編程。

+1

「有人問」表明這可能是一項任務。你已經描述了三種方式,它們都可以工作,而且我已經看到它們都被使用了。各有其優點和缺點,我建議你詳細說明這些。在你的任務或報告中。 –

+1

詢問轉換您的現有實施的具體問題。 *最簡單的方法*是主觀的,你的讀者沒有足夠的細節,答案是沒有事實依據的意見。 – user1155120

+0

最簡單的方法可能是使用泛型實現,但這取決於_easiest_的定義。或者,您是否真的需要幫助將它從4位ALU中組合出來?您的標題也與您的描述不符。 –

回答

0

實際答案取決於您的實際ALU和您選擇的方法。你說你試圖找到如何連接兩個4位ALU;這裏有一些幫助:

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

entity cpu_alu is 
    port(
    opA  : in std_logic_vector(15 downto 0); -- operand A 
    opB  : in std_logic_vector(15 downto 0); -- operand B 
    Op  : in std_logic_vector(2 downto 0); -- operator 
    cIn  : in std_logic;      -- carry in 
    invA : in std_logic;      -- invert A 
    result : out std_logic_vector(15 downto 0); -- result 
    cOut : out std_logic;      -- carry out 
    overflow: out std_logic;      -- overflow 
    zero : out std_logic 
); 
end entity cpu_alu; 

architecture rtl1 of cpu_alu is 

    signal A: std_logic_vector(7 downto 0); 

    signal INTERNAL_CARRY: std_logic; -- the carry chain 
    signal zeroMSB: std_logic;   -- because this ALU has a 'zero' output 
    signal zeroLSB: std_logic; 

    constant Top : integer := A'left; 

begin 

    MSB : entity work.cpu_alu8 
    port map (opA => opA(7 downto 0), 
       opB => opB(7 downto 0), 
       Op  => Op, 
       CIn => CIn, 
       invA => inVa, 
       result => result(7 downto 0), 
       cout => INTERNAL_CARRY, 
       overflow => open, 
       zero => zeroMSB); 

    MSL : entity work.cpu_alu8 
    port map (opA => opA(15 downto 8), 
       opB => opB(15 downto 8), 
       Op  => Op, 
       CIn => INTERNAL_CARRY, 
       invA => inVa, 
       result => result(15 downto 8), 
       cout => cOut, 
       overflow => overflow, 
       zero => zeroLSB); 

    zero <= zeroMSB and zeroLSB; 

end architecture rtl1; -- of cpu_alu 

這顯示了兩個8位ALU連接在一起,使一個16位ALU。我已經準備了一個16位的ALU,所以我將它轉換爲一個8位的ALU,並將它初始化兩次,以創建原始的16位ALU(所以我可以對它進行相同的測試以確保我已經完成了它正確*)。我相信你可以將它轉換爲2x 4位ALU。

8個LSB轉到第一個ALU; 8個MSB轉到第二個。關鍵的一點是,我如何將第一個ALU的進位輸出連接到第二個進位輸入。另請注意,我對LSB ALU的輸出overflow不感興趣。最後,我需要合併各自的zero輸出。

當然,我不知道你的ALU實際上做了什麼。這一個並沒有太大的作用。它唯一的數學運算是ADD。 (這是一個練習的答案,因此我不會發布所有的代碼)。

*這是你應該始終做的。你提到Quartus。 Quartus不模擬 - 它從綜合開始。在合成之前,您應該始終進行模擬:找到錯誤,查找源代碼並修復錯誤要快得多。

+0

*你說你試圖找到如何連接兩個4位ALU ...... *這個斷言看起來不被這個問題或它的編輯歷史支持。 – user1155120

+0

將您的代碼轉換爲兩個4位ALU的實例可能是可能的,但是記錄這些端口會很有幫助。例如,什麼是'invA'?最後一段取決於您是否將ModelSim Altera Edition視爲Quartus的一部分。 –

+0

@ user1155120 _I_沒有做過任何這些事情。問題的海報說他有。 –