Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vhdl 为什么第56-61行出现错误?_Vhdl - Fatal编程技术网

Vhdl 为什么第56-61行出现错误?

Vhdl 为什么第56-61行出现错误?,vhdl,Vhdl,我试图在实验室为状态机设置一个问题,并且在尝试用Quartus编译时不断收到错误 我尝试过使用逗号和else语句,但似乎没有任何效果 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.All; ENTITY SM_VHDL IS -- Do not modify this entity statement! PORT(X : IN STD_LOGIC_VECTOR(1 DOWNTO 0); RESETN, CLOCK

我试图在实验室为状态机设置一个问题,并且在尝试用Quartus编译时不断收到错误

我尝试过使用逗号和else语句,但似乎没有任何效果

LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.All;

ENTITY SM_VHDL IS  -- Do not modify this entity statement!
  PORT(X       : IN STD_LOGIC_VECTOR(1 DOWNTO 0);
       RESETN,
       CLOCK   : IN  STD_LOGIC;
       Z       : OUT STD_LOGIC;
       Q       : OUT STD_LOGIC_VECTOR(1 DOWNTO 0)  );
END SM_VHDL;       -- Do not modify this entity statement!


ARCHITECTURE behavior of SM_VHDL IS
  TYPE STATE_TYPE IS (A, B, C);
  SIGNAL state : STATE_TYPE;

BEGIN
    PROCESS(CLOCK, RESETN)
      BEGIN
        IF RESETN = '0' THEN
          state <= A;
        ELSIF CLOCK'EVENT AND CLOCK = '1' THEN
          CASE state IS
            WHEN A =>
              CASE X IS
                WHEN "00"   =>
                                        state <= B;
                                WHEN "11"   =>
                                        state <= C;
                                WHEN OTHERS =>
                                        state <= A;
              END CASE;
            WHEN B =>
              CASE X IS
                WHEN "10"   =>
                                        state <= A;
                                WHEN "11"   =>
                                        state <= C;
                                WHEN OTHERS =>
                                        state <= B;
              END CASE;
            WHEN C =>
              CASE X IS
                WHEN "00"   =>
                                        state <= B;
                                WHEN "01"   =>
                                        state <= A;
                                WHEN OTHERS =>
                                        state <= C;
              END CASE;
          END CASE;
        END IF;
      END PROCESS;

    Z  <= '1' WHEN C;
                  '0' WHEN A;
                  '0' WHEN B;

    Q  <= "00" WHEN A;
                  "01" WHEN B;
                  "10" WHEN C;
                  "11" WHEN "-";

END behavior;
IEEE库;
使用IEEE.STD_LOGIC_1164.All;
实体SM_VHDL是--不要修改此实体语句!
端口(X:STD_逻辑_向量中(1到0);
重置,
时钟:标准逻辑;
Z:输出标准逻辑;
Q:输出标准逻辑向量(1到0);
结束SM_VHDL;——不要修改此实体语句!
SM_VHDL的体系结构行为是
类型状态_类型为(A、B、C);
信号状态:状态_型;
开始
进程(时钟,重置)
开始
如果RESETN='0',则

说明分配给
Z
Q
的语法对于多个问题是错误的:

  • 在分配之前,缺少状态选择的
  • 之间使用“;”当
    零件时,请改用
  • 不能在上次
    之后使用
    “-”
    (不在乎)当
    时,请使用
    其他
因此,更新代码:

WITH state SELECT Z <=
      '1' WHEN C,
      '0' WHEN A,
      '0' WHEN B;

WITH state SELECT Q <=
      "00" WHEN A,
      "01" WHEN B,
      "10" WHEN C,
      "11" WHEN OTHERS;

带状态选择Z时只能与布尔条件一起使用。A/B/C都是状态类型的文字。您需要通过在状态信号上创建比较来创建布尔结果:

Z <=      '1' when STATE = C
     else '0' when STATE = A    -- This state not actually needed as a single ELSE would cover it
     else '0';

Z when没有“others”选项,您需要使用else,并且在“when”中没有逗号分隔大小写,您再次使用else。@技巧:原始代码有语法错误,因此很难说是什么结构。我的建议是,根据VHDL-2008标准§9.3.3.1(第480页),添加带有状态选择…
,从而使分配成为同时选择的信号分配,可以选择
其他
。您发布的答案建议使用并发条件信号分配,这也是纠正代码的一种方法,这需要布尔表达式作为条件。请参阅对其他答案的评论,因为当
不总是需要布尔值时,为什么
。IEEE Std 1076-2008中有一个条件运算符(见9.2.9)可以在条件信号赋值语句中隐式应用。隐式运算符仅在条件无法提供布尔结果时应用。语法糖的一种形式。使用方法相当直观,适用于条件,而不适用于所选的信号分配选择,如Morten的回答所示,该回答详细阐述了一个过程,并给出了等效的案例陈述(10.5.4、10.9、14.5.5)。有条件的信号分配用于包含if语句的进程*10.5.3、10.8、14.5.5)。@user1155120+1引用9.2.9,但我想知道这是否是个好主意。在我看来,
上的隐式转换只是一种绕过强类型的惰性方式。这真的打破了语言吗?添加一种新的数据类型(
logic
??)更有意义,它可以解释为
bit
boolean
。IIRC,这是为了在PSL条件中允许
bit
。@EML调用隐式条件运算符在语义上是干净的。运算符仅应用于要求为布尔类型(语法上为条件)的主表达式,而不是。对于非预定义类型,重载解析用于确定实现条件运算符的函数的可见性。问题在于有一个隐式操作符,道德高地早已失去,有隐式等待语句、延迟模型、默认值和模式。还有更严重的愤怒。@user1155120语义清晰,是的,意思明确。但是请考虑<代码>如果MyLoButs现在是有效的VHDL,但是<代码> MyiBIT和MyAbOOL 不是,没有明确的重载<代码>和< /代码>。有些东西坏了,不管你是否喜欢打字(我不是)。类型实际上是什么已经没有明确的定义了。一个对象的类型意味着用任何理性的语言来描述它的解释和意义。在VHDL中,这种花招意味着它不再使用,因为类型现在由上下文决定。