2013-09-26 39 views
0

我正在嘗試構建和綜合VHDL中的ALU,但是一旦合成就會出現問題。 我希望我的ALU有一個操作碼,用於添加我的兩個N位輸入和一個可以通過輸入或前面計算的總和設置的進位。 我感興趣的代碼的部分如下:在VHDL ALU合成過程中進行輸出問題

process (a, b, op) -- a and b are n bits input en op is the op-code 
    case op is 
     when "011" => -- add a + b + c (with c as carry) 
      y <= ('0' & a) + ('0' & b) + c; -- y is the N-bit output 
... 
end process; 

process (clk) 
    if (clk'event and clk = '1') then 
     if (op = "011" and (to_integer(a)+to_integer(b)+to_integer(c)) > (2**N)) then --basically I'm testing if there is an overflow during the calculation 
      c <= '1'; 
     elsif (op = "011" and (to_integer(a)+to_integer(b)+to_integer(c)) < ((2**N)+1)) 
      c <= '0'; 
... 
end process; 

我不知道如果代碼將在這裏工作,因爲我並沒有確定的信號類型,但基本上它歸結到什麼我上面寫過。 這樣做的問題是,當我用適當的測試臺模擬我的VHDL時,它的工作原理應該如此,但是當我綜合此代碼並使用相同的測試臺模擬合成代碼時,它無法正常工作,因爲第一個過程即使a,b或op沒有變化,也會再次重複。因此,當總和的結果有進位時,使用這個新進位再次進行計算,即使a,b或op沒有改變,結果也會增加1!

後來我發現這篇文章說that the sensitivity list is "ignored" by the compiler他是如何認爲他比你更瞭解該程序並製作自己的敏感列表。如果這是真的,那麼我編譯器會在第一個進程的靈敏度列表中添加clk,以便在op =「011」時每個clk週期運行計算。

我現在的問題是:我能做些什麼來解決這個問題,這樣計算就可以運行一次並且進位在它之後被改變?

親切的問候

+2

停止寫入代碼。先畫一張照片。編碼你的照片。你打算連接進行嗎? –

+0

當你說'我希望我的ALU擁有一個用於添加我的兩個N位輸入的操作碼和一個可以通過輸入設置的進位或通過先前計算的總和時,您能澄清一下您的意思嗎? ''看來你在'carryin'和'carryout'之間感到困惑。通常這些是兩件獨立的事情。爲什麼要將加法器生成的進位('carryout')再次添加到輸入數字? – shrm

回答

0

正如其他人指出的那樣,您的代碼有幾個問題。我會嘗試提出一些改進,然後顯示一個可能的方式計算進位標誌:

  1. 在做套利之間的區別,並進行信號。爲您的信號使用交際名稱,例如carry_incarry_out。這將消除大部分的困惑。

  2. 爲您的ALU操作定義常量或枚舉類型。例如:

    subtype opcode_type is std_logic_vector(2 downto 0); 
    constant ADC: opcode_type := "011"; -- ADC: add with carry 
    
  3. 最後,如果你正在使用VHDL 2008年,您可以生成你隨身攜帶了使用聚合作爲分配對象:

    (carry_out, y) <= ('0' & a) + ('0' & b) + carry_in; 
    

你的代碼最終會尋找像這樣:

process (all) 
    case op is 
     when ADC => -- add a + b + c (with c as carry) 
      (carry_out, y) <= ('0' & a) + ('0' & b) + carry_in; 
    ... 
end process; 

process (clk) 
    if rising_edge(clk) then 
     carry_flag <= carry_out; 
    ... 
end process;