【问题标题】:How should I debug VHDL error 10476 - type disagreement我应该如何调试 VHDL 错误 10476 - 类型不一致
【发布时间】:2014-05-07 09:03:42
【问题描述】:

我不明白我应该怎么做。

这是我的代码:

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 错误:标识符“数据”的类型确实 不同意将其用作“std_ulogic”类型

【问题讨论】:

  • 如何异或 1 位和 2 位? data 是一个 2 位宽的向量。
  • 这里的问题并不是严格意义上的xoring 2 bits with 1 bit(VHDL-2008 支持)——它将结果分配给 1 位切片。诚然,两者都可能不是预期的......
  • @user3611379:您对 xor 语句的意图是什么?正如 N8TRO 所暗示的那样,您正在尝试对一个 2 位向量进行异或运算(我上面的评论旨在指出,如果您使用 VHDL-2008,这是严格合法的,而不是它是正确的 根据您的意图)。您要执行的操作是什么?

标签: vhdl


【解决方案1】:

几个问题。首先,您的赋值运算符&lt;= 应始终位于所分配信号的右侧。所以对于这些行:

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

改成:

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

也正如 N8TRO 所建议的,您不能在向量输入上使用异或。您需要单独访问每一位数据。

正如 BrianDrummond 所指出的,赋值符号是 :=&lt;= 的更合适的名称

【讨论】:

  • VHDL 中没有赋值运算符! VHDL(和Ada)中的“运算符”具有与数学含义密切相关的特定含义;并且分配具有超出该含义的特征。重要区别:因此,您不能在表达式中嵌入赋值;赋值是一个语句。 “分配符号”对于:=&lt;= 来说是一个更好的术语
  • 显然该网页的作者也是如此...令人惊讶的是,您看到从将赋值视为运算符的语言中逐渐出现对“赋值运算符”的引用,但它(IMO)值得维护语言的准确性和清晰度。
  • 准确地说,您可以在向量上使用xor。在 VHDL-2008 之前,您不能 xor 一点用向量(本机),但这些重载已添加到标准中。
  • @fru1tbat,确实,它在 VHDL-2008 中受支持,但我会非常小心地使用 VHDL-2008 中的任何内容,而不绝对确保您正在使用的供应商......咳嗽 xilinx。 ..咳咳……居然可以合成。
【解决方案2】:
com(i)<= not(CD(i)xor(data) ) 

data 是 2 位宽 - 您是否希望编译器将 data 与单个位 CD(i) 进行异或运算?

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

  • 作为一元运算符(这不是 OP 中要求的),
  • 将向量与单个位进行异或运算,返回向量。

两者都不完全符合顶部的代码......

【讨论】:

  • 正如我在这里其他地方评论的那样,VHDL-2008 支持,不是吗?赋值的目标似乎是实际问题,而不是操作数。
  • 在 2008 年,您可以使用向量对单个位进行异或,这将返回一个向量,或者您可以将一个向量“归约异或”(一元),这将返回一个位。不确定原始代码的意图是什么 - 只是想确保您的答案没有被误解。
  • @fru1tbat:“你可以对一个向量进行异或运算,它会返回一个向量”——我错过了那个位,谢谢!另一个编辑...
【解决方案3】:

您的代码存在多个问题。有关更关键的问题,请参阅 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&lt;=com(i); 中)。如果您的意思是将com 直接分配给s,您可以直接写s &lt;= com;。如其他答案所示,您的矢量宽度与您的 xor 语句有关,因此我不确定您的意图是什么。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-28
    相关资源
    最近更新 更多