错误VHDL Quartus:无法确定运算符“”=“”的定义 - 找到0个可能的定义

时间:2014-06-30 19:44:43

标签: vhdl

我写这个vhdl代码,但我有这个问题:

  

错误(10327):CircuitoCombinatorio.vhd(16)的VHDL错误:无法确定运营商的定义"" ="" - 找到0个可能的定义。

行错误是:if(areset =" 1")then。

Library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
Entity CircuitoComparatore is
    port(a:in std_logic_vector(2 downto 0);
         clk,areset:in std_logic;
          u: out std_logic );
end CircuitoComparatore;

architecture ACircuitoComparatore of CircuitoComparatore is
    signal c,d: std_logic_vector(2 downto 0);
    begin
    c<=a+"011";
    reg:process(areset,clk)
        begin
        if(areset="1") then
            d<="000";
        elsif(ck'event and ck="1") then
            d<=c;
        end if;
    end process reg;
   CMP:process(a,d)
   begin
   if(a>d) then
        u<="001";
    else 
        u<="000";
    end if;
    end process CMP;
end ACircuitoComparatore;   

4 个答案:

答案 0 :(得分:3)

aresetstd_logic,因此必须与'1'进行比较,而不是"1";同样如下所示,您可能希望将ck更改为clk

以下u也需要修复,std_logic,但使用"001"分配了多个位。

答案 1 :(得分:0)

不变地分析您的设计规范:

ghdl -a --ieee=synopsys -fexplicit acircuit.vhdl acircuit.vhdl:16:18: no function declarations for operator "=" acircuit.vhdl:18:15: no declaration for "ck" acircuit.vhdl:25:12: can't match string literal "001" with type enumeration subtype "std_logic" acircuit.vhdl:27:12: can't match string literal "000" with type enumeration subtype "std_logic" ghdl: compilation error

更正后:

 1  Library ieee;
 2  use ieee.std_logic_1164.all;
 3  use ieee.std_logic_unsigned.all;
 4  Entity CircuitoComparatore is
 5      port(a:in std_logic_vector(2 downto 0);
 6           clk,areset:in std_logic;
 7            u: out std_logic );
 8  end CircuitoComparatore;
 9  
10  architecture ACircuitoComparatore of CircuitoComparatore is
11      signal c,d: std_logic_vector(2 downto 0);
12      begin
13      c<=a+"011";
14      reg:process(areset,clk)
15          begin
16          if(areset='1') then       -- was (areset="1")
17              d<="000";
18          elsif(clk'event and clk='1') then -- was (ck'event and ck="1")
19              d<=c;
20          end if;
21      end process reg;
22     CMP:process(a,d)
23     begin
24     if(a>d) then
25          u<='1';                   -- was u<="001";
26      else 
27          u<='0';                   -- was u<="001";
28      end if;
29      end process CMP;
30  end ACircuitoComparatore;   

您的设计规范分析。

第16行出现第一个错误,因为没有声明的相等运算符可以在std_logic和string之间进行比较。 areset声明为std_logic,它使用字符文字的枚举值。字符串值与基于字符串的类型相关联,例如std_logic_vector,例如第17行`d&lt; =“000”。

第18行犯同样错误的同等性测试ck="1",而ck也应该是声明的时钟clk

当应该分配枚举值(字符类型)时,第25行和第27行都将字符串值赋给std_logic类型。

您还可以注意到if语句中的条件是 boolean _ 表达式(返回布尔值),并且表达式只需要在匹配左右括号中包含以控制关联和评估顺序。 VHDL具有固定的优先级,具有相同优先级的多个运算符。两个if语句中的条件都不需要括号。 “允许”在不需要它们的地方使用括号是在表达式的LRM部分中找到的EBNF语法中需要它们的副作用。在不需要的地方添加它们会产生在内部和表达式中创建表达式的效果,其中外部表达式中没有其他区别。在最好的情况下,它会减慢分析速度,最坏的情况是减慢仿真速度(如果没有通过详细说明进行优化,则是依赖于实现的问题)。换句话说,表达越大越复杂,您在分析或模拟时间方面的惩罚就会越多,并且影响在您的设计模型中是累积的。

答案 2 :(得分:0)

由于信号设置是单比特信号,你必须使用&#39; 1&#39;而不是&#34; 1&#34;。双引号用于总线(超过1位)。也请更换“ck”。用&#39; clk&#39;(这是一个错字)。 此外,您可以在代码中使用语句(rising_edge(clk))代替(clk&#39; event和clk =&#34; 1&#34;)。

答案 3 :(得分:0)

首先,在elsif(ck'event and ck="1") then行中你应该使用&#39; clk&#39;而不是&#39;&#39;括号应该像“1&#39;不是&#34; 1&#34;在if(areset="1") thenelsif(ck'event and ck="1") then行中。