2016-01-24 28 views
3

我用VHDL創建了一個通用的多路複用器(以輸入數量和每個輸入的位數)。我測試了它,它工作正常,但我得到一個寬度不匹配警告: 寬度不匹配。 <輸出>具有8位的寬度,但分配的表達式是64位寬。 這是我的通用MUX的代碼。任何人都可以解釋我爲什麼得到這個警告?我的代碼有什麼問題?我的教授希望我在不使用流程的情況下執行此操作。由於通用多路複用器警告

library IEEE; 

use IEEE.STD_LOGIC_1164.ALL; 
use work.package_log.all; 
use IEEE.NUMERIC_STD.ALL; 

entity mux_generic is 
generic(N : natural :=8; 
     M : natural := 8); 
      -- N: number of inputs 
      -- M: bit per input/output 
Port (input : in STD_LOGIC_VECTOR (N*M-1 downto 0); 
      sel: in STD_LOGIC_VECTOR (log2ceil(N)-1 downto 0); 
     output : out STD_LOGIC_VECTOR (M-1 downto 0)); 
end mux_generic; 

architecture DataFlow of mux_generic is 

begin 

output <= input(M*(to_integer(unsigned(sel))+1) - 1 downto M*(to_integer(unsigned(sel)))); 

end DataFlow; 

功能log2ceil是這樣定義的:

library IEEE; 
use IEEE.STD_LOGIC_1164.all; 

package package_log is 

    function log2ceil(n : natural) return natural; 

end package_log; 

package body package_log is 

function log2ceil (N : natural) return natural is 
     variable i, j : natural; 
    begin 
     i := 0; 
     j := 1; 
     while (j < N) loop 
      i := i+1; 
      j := 2*j; 
     end loop; 
     return i; 
    end function log2ceil; 

end package_log; 
+1

這是一個綜合或模擬警告?爲什麼沒有錯誤?寬度不匹配應導致失敗。 – Paebbels

+0

什麼工具報告錯誤,例如Altera Quartus Prime或其他? –

+0

大家的眼睛都是一個忙,並且把'自然範圍x'類型的'sel'聲明爲'y';對於合適的x,y ......那些不必要的轉換是痛苦的看看! –

回答

1

請升級到最新的的版本ISE 14.7,如果你還沒有這樣做的遠。然後爲您的Spartan-3E FPGA啓用新的分析器:

  • 右鍵單擊Synthesize - > Process Properties。
  • 將屬性顯示級別更改爲「高級」。
  • 對於屬性「其他XST命令行選項」輸入-use_new_parser yes

現在警告消失了。出現一個新的警告,只是注意到,新的解析器不是默認的解析器。但是,我還沒有遇到過這個問題。

順便說一句,您的多路複用器描述還沒有效率。看看my other post,瞭解不同的實現及其對資源使用和時序分析的影響。

+0

想知道爲什麼「新解析器」沒有成爲默認行爲?可能是因爲它「破壞」了舊事物的解釋方式?太糟糕了,某些東西可以被顯着改善,但他們決定將它隱藏在隱蔽的非默認選項之後...... – Josh

+0

謝謝,我對VHDL不熟練,我希望我能理解你在優化MUX中所做的事情碼。無論如何,我很高興這不是一個代碼問題,即使我仍然不明白爲什麼使用新的解析器刪除警告。 – Mazzola