Vhdl 通用多路复用器警告

Vhdl 通用多路复用器警告,vhdl,fpga,Vhdl,Fpga,我用VHDL创建了一个通用多路复用器(根据输入的数量和每个输入的位数)。我测试了它,它工作正常,但我得到一个宽度不匹配警告: 宽度不匹配output>的宽度为8位,但分配的表达式的宽度为64位。 这是我的通用多路复用器的代码。有人能解释一下为什么我会收到这个警告吗?我的代码怎么了?我的教授希望我在不使用过程的情况下实现这一点。谢谢 library IEEE; use IEEE.STD_LOGIC_1164.ALL; use work.package_log.all; use IEEE.NUME

我用VHDL创建了一个通用多路复用器(根据输入的数量和每个输入的位数)。我测试了它,它工作正常,但我得到一个宽度不匹配警告: 宽度不匹配output>的宽度为8位,但分配的表达式的宽度为64位。 这是我的通用多路复用器的代码。有人能解释一下为什么我会收到这个警告吗?我的代码怎么了?我的教授希望我在不使用过程的情况下实现这一点。谢谢

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;
IEEE库;
使用IEEE.STD_LOGIC_1164.ALL;
使用work.package_log.all;
使用IEEE.NUMERIC_STD.ALL;
实体mux_是通用的
一般(N:自然:=8;
M:自然值:=8);
--N:输入数量
--M:每输入/输出位
端口(输入:标准逻辑向量中(N*M-1向下至0);
sel:标准逻辑向量(log2ceil(N)-1向下至0);
输出:输出标准逻辑向量(M-1向下至0);
结束mux_通用;
mux_的体系结构数据流是通用的
开始

输出如果到目前为止尚未更新,请更新到最新的ISE版本14.7。然后为Spartan-3E FPGA启用新的解析器:

  • 右键单击综合->流程属性
  • 将属性显示级别更改为“高级”
  • 对于属性“其他XST命令行选项”,输入
    -使用\u new\u parser yes
现在警告消失了。此时会出现一个新的警告,注意新的解析器不是默认的解析器。但是,我还没有遇到这个问题


顺便说一下,您的多路复用器描述还不够有效。看看不同的实现及其对资源使用和时序分析的影响。

这是一个综合警告还是模拟警告?为什么没有错误?宽度不匹配应导致失败。什么工具报告错误,例如Altera Quartus Prime或其他?请大家注意,并声明
sel
类型为
自然范围x到y适用于适当的x、y。。。这一连串不必要的转换看起来很痛苦!这是一个综合警告。警告:XST:1610。但我在我的Basys 2上尝试了比特流,效果很好。我想知道为什么我会收到这个警告消息,即使它在模拟和电路板上都能工作。想知道为什么“新解析器”没有成为默认行为?可能是因为它“打破”了人们对事物的旧理解?太糟糕了,有些东西可以显著改进,但他们决定将其隐藏在一个模糊的非默认选项后面…谢谢,我对VHDL不是很熟练,我希望我能理解您在优化的MUX代码中做了什么。无论如何,我很高兴这不是一个代码问题,即使我仍然不明白为什么使用新的解析器会删除警告。
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;