2016-01-24 26 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