我应该如何调试VHDL错误10476 - 输入不同意见

时间:2014-05-07 09:03:43

标签: vhdl

我不明白我应该做什么。

这是我的代码:

use ieee.std_logic_1164.all;
use ieee.numeric_std.all ;
use ieee.std_logic_signed .all ;

entity M is 
port(
        clk     : in  std_logic ;
        rst     : in  std_logic ;
        data    : in  std_logic_vector(1 downto 0);
        CD      : in std_logic_vector(3 downto 0);
        s       : out std_logic_vector (1 downto 0));

end entity ;

architecture beh of M is

signal com :std_logic_vector(3 downto 0);

begin 

code :process(clk,rst)

begin

    if (rst='1') then
      (others=>'0')<=data;
       --data<='0' !!! ;
       (others=>'0')<=CD;
       --"0000"<=CD ;
       s   <=(others=>'0');
     else
        for i in 0 to 3 loop 

          if (clk'event and clk='1')then 

               --for i in 0 to 3 loop 

                  com(i)<= not(CD(i)xor(data) ) ;
                  --s<=not(CD(i) xor (data));

           end if ;  
        end loop ;

    end if ;
    end process ;
    s<=com(i) ;
    end architecture ;

这是我的问题:

  

错误(10476):M.vhd(39)处的VHDL错误:标识符“data”的类型   不同意其用作“std_ulogic”类型

3 个答案:

答案 0 :(得分:0)

一些问题。首先,您的赋值运算符<=应始终位于所分配信号的右侧。对于这些行:

(others=>'0')<=data;
(others=>'0')<=CD;

将其更改为:

data <= (others=>'0');
CD <= (others=>'0')

同样如N8TRO建议的那样,你不能在矢量输入上使用xor。您需要单独访问每一位数据。

正如BrianDrummond所指出的,分配符号是:=<=

的更合适的名称

答案 1 :(得分:0)

com(i)<= not(CD(i)xor(data) ) 

data是2位宽 - 您希望编译器与data的单个位进行XOR CD(i)吗?

正如评论中所指出的,VHDL2008以两种方式支持XORing向量:

  • 作为一元操作员(这不是OP中要求的),
  • 使用单个位对一个向量进行异或,返回一个向量。

这两者都与顶部的代码完全匹配......

答案 2 :(得分:0)

您的代码存在多个问题。请看Martin和Russell对更关键的答案。另外:

  1. 您应该按照注释的方式颠倒for循环的顺序和流程中的if (clk'event ...语句。即:

    if rst = '1' then
      ...
    elsif clk'event and clk = '1' then
      for i in 0 to 3 loop
        ...
      end loop;
    end if;
    

    它可能会以另一种方式起作用,但它是非标准的。

  2. 无论哪种方式,i都不在您尝试在流程外使用它的范围内(在s<=com(i);语句中)。如果您想将com直接分配给s,则可以写s <= com;。如其他答案所示,您的xor语句的向量宽度存在一些问题,因此我不确定您的意图是什么。

  3. 正如其他地方所提到的那样,您看到的错误告诉您,您正在尝试将data(2位向量)与运算符(xor)一起使用,该运算符需要一位(例如,std_ulogic)。我已经在这个问题的其他地方提出了一个问题,准确地指出什么是合法的,哪些是不合法的,尤其是VHDL-2008(免责声明,我大多只是挑剔),但即使你使用的是VHDL-2008 (该错误似乎表明您不是),操作的结果将是一个向量,并且您尝试将其分配给单个位(com(i))。如何修复此行取决于您对代码的意图。