簡體   English   中英

在VHDL ALU合成過程中出現輸出問題

[英]Carry output issue during VHDL ALU synthesis

我正在嘗試在VHDL中構建和合成ALU,但是一旦合成,就會遇到問題。 我希望我的ALU有一個操作碼,用於將兩個N位輸入相加,並且可以由一個輸入或由先前計算出的總和設置一個進位。 我感興趣的部分代碼如下:

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!

后來我發現這篇文章說,編譯器認為“敏感列表”比編譯器“忽略”如何認為他比您更了解該程序,並創建了自己的敏感列表。 如果是這樣,我邀請編譯器在第一個進程的敏感度列表中添加clk,以便在op =“ 011”時在每個clk周期運行計算。

現在我的問題是:我該怎么辦才能使計算一次運行並在進位后更改進位?

親切的問候

正如其他人指出的那樣,您的代碼存在一些問題。 我將嘗試提出一些改進,然后展示一種計算進位標志的可能方法:

  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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM