使用并发代码和顺序代码的VHDL混淆

使用并发代码和顺序代码的VHDL混淆,vhdl,Vhdl,我正试图用VHDL中的并发代码编写一个8位全加器,但在语法中出现了一个错误。首先,我这样做: LIBRARY ieee; USE ieee.std_logic_1164.ALL; ENTITY concfulladder IS PORT( A: IN std_logic_vector (7 DOWNTO 0); B: IN std_logic_vector (7 DOWNTO 0);

我正试图用VHDL中的并发代码编写一个8位全加器,但在语法中出现了一个错误。首先,我这样做:

    LIBRARY ieee;
    USE ieee.std_logic_1164.ALL;

    ENTITY concfulladder IS

        PORT(     A: IN std_logic_vector (7 DOWNTO 0);
                  B: IN std_logic_vector (7 DOWNTO 0);
                Cin: IN std_logic_vector (7 DOWNTO 0);
                Sum: OUT std_logic_vector(7 DOWNTO 0);
               Cout: OUT std_logic_vector(7 DOWNTO 0));
         
    END concfulladder;

    ARCHITECTURE cfulladder OF concfulladder IS


    BEGIN

      sum(0) <= '0' WHEN (A(0) XOR B(0) XOR CIN(0)) = '0' ELSE
                '1';
      cout(0) <= '0' WHEN ((A(0) AND B(0)) OR (Cin(0) AND A(0)) OR (Cin(0) AND B(0))) = '0' ELSE
                 '1';
      sum(1) <= '0' WHEN (A(1) XOR B(1) XOR CIN(1)) = '0' ELSE
                 '1';
      cout(1) <= '0' WHEN ((A(1) AND B(1)) OR (Cin(1) AND A(1)) OR (Cin(1) AND B(1))) = '0' ELSE
                 '1';
       sum(2) <= '0' WHEN (A(2) XOR B(2) XOR CIN(2)) = '0' ELSE
                 '1';
      cout(2) <= '0' WHEN ((A(2) AND B(2)) OR (Cin(2) AND A(2)) OR (Cin(2) AND B(2))) = '0' ELSE
                 '1';
       sum(3) <= '0' WHEN (A(3) XOR B(3) XOR CIN(3)) = '0' ELSE
                 '1';
      cout(3) <= '0' WHEN ((A(3) AND B(3)) OR (Cin(3) AND A(3)) OR (Cin(3) AND B(3))) = '0' ELSE
                 '1';
       sum(4) <= '0' WHEN (A(4) XOR B(4) XOR CIN(4)) = '0' ELSE
                 '1';
      cout(4) <= '0' WHEN ((A(4) AND B(4)) OR (Cin(4) AND A(4)) OR (Cin(4) AND B(4))) = '0' ELSE
                 '1';
       sum(5) <= '0' WHEN (A(5) XOR B(5) XOR CIN(5 )) = '0' ELSE
                 '1';
      cout(5) <= '0' WHEN ((A(5) AND B(5)) OR (Cin(5) AND A(5)) OR (Cin(5) AND B(5))) = '0' ELSE
                 '1';
       sum(6) <= '0' WHEN (A(6) XOR B(6) XOR CIN(6)) = '0' ELSE
                 '1';
      cout(6) <= '0' WHEN ((A(6) AND B(6)) OR (Cin(6) AND A(6)) OR (Cin(6) AND B(6))) = '0' ELSE
                 '1';
       sum(7) <= '0' WHEN (A(7) XOR B(7) XOR CIN(7)) = '0' ELSE
                 '1';
      cout(7) <= '0' WHEN ((A(7) AND B(7)) OR (Cin(7) AND A(7)) OR (Cin(7) AND B(7))) = '0' ELSE
                 '1';
             
  END cfulladder;
ieee库;
使用ieee.std_logic_1164.ALL;
实体加法器是
端口(A:标准逻辑向量(7到0);
B:标准逻辑向量(7到0);
Cin:标准逻辑向量(7到0);
求和:输出标准逻辑向量(7到0);
Cout:OUT标准逻辑向量(7到0);
端加器;
ConfullAdder的体系结构cfulladder是
开始

仅当使用VHDL 2008或更高版本时,才允许在进程内部使用sum(0)
when..else
。对于以前的版本,您需要在进程外部使用
when..else
语句。

when..else
仅在使用VHDL 2008或更高版本时才允许在进程内部使用。对于以前的版本,您需要在进程外部使用
when..else
语句。

此处不需要条件赋值。相反,请尝试:

PROCESS (all) IS
BEGIN

    FOR I IN 0 TO 7 LOOP
        Sum(I) <= A(I) XOR B(I) XOR CIN(I);
                     
        Cout(I) <= (A(I) AND B(I)) OR (Cin(I) AND A(I)) OR (Cin(I) AND B(I));
    END LOOP;
END PROCESS;
过程(全部)是
开始
对于0到7循环中的I

Sum(I)这里不需要条件赋值。相反,请尝试:

PROCESS (all) IS
BEGIN

    FOR I IN 0 TO 7 LOOP
        Sum(I) <= A(I) XOR B(I) XOR CIN(I);
                     
        Cout(I) <= (A(I) AND B(I)) OR (Cin(I) AND A(I)) OR (Cin(I) AND B(I));
    END LOOP;
END PROCESS;
过程(全部)是
开始
对于0到7循环中的I

总和(I)不正确。参见11.6并发信号分配语句,BNF目标*条件_波形*在10.5.3条件信号分配中定义。11.6并发信号分配语句“并发信号分配语句表示为信号分配值的等效过程语句。”见11.3过程语句。过程语句部分包含一系列零或多个连续语句,这里是一个条件信号分配语句(10.5.3)。@user1155120您认为哪部分不正确?现在允许在进程中使用VHDL-2008中的条件赋值,或者在进程中不允许使用VHDL-2008之前的条件赋值?这是不正确的:
when..else
仅允许在使用VHDL 2008时在进程内部使用。并发信号分配语句(11.6)可以是并发条件信号分配,其中中间目标条件波形在10.5.3中定义,并包含保留字when和else。在顺序和并发信号分配中都允许使用条件波形。并发语句不会出现在进程语句中。@user1155120第10条是顺序语句。第10.5.3条详细说明了条件信号分配(过程中的顺序信号分配)。因此,在VHDL-2008中,“when-else”变成了条件赋值,并且确实允许在进程中使用,这是正确的——除非你只是在胡说八道,但在这一点上你让社区感到困惑。您还可以享受10.6.3条件变量赋值。@jim这里有一个示例演示仅应删除“仅”,简单地将其移动将对已批准的当前版本产生歧义。标准语法是允许的,而语义限制是限制性的。它消除了重复的歧义,这是不正确的。参见11.6并发信号分配语句,BNF目标*条件_波形*在10.5.3条件信号分配中定义。11.6并发信号分配语句“并发信号分配语句表示为信号分配值的等效过程语句。”见11.3过程语句。过程语句部分包含一系列零或多个连续语句,这里是一个条件信号分配语句(10.5.3)。@user1155120您认为哪部分不正确?现在允许在进程中使用VHDL-2008中的条件赋值,或者在进程中不允许使用VHDL-2008之前的条件赋值?这是不正确的:
when..else
仅允许在使用VHDL 2008时在进程内部使用。并发信号分配语句(11.6)可以是并发条件信号分配,其中中间目标条件波形在10.5.3中定义,并包含保留字when和else。在顺序和并发信号分配中都允许使用条件波形。并发语句不会出现在进程语句中。@user1155120第10条是顺序语句。第10.5.3条详细说明了条件信号分配(过程中的顺序信号分配)。因此,在VHDL-2008中,“when-else”变成了条件赋值,并且确实允许在进程中使用,这是正确的——除非你只是在胡说八道,但在这一点上你让社区感到困惑。您还可以享受10.6.3条件变量赋值。@jim这里有一个示例演示仅应删除“仅”,简单地将其移动将对已批准的当前版本产生歧义。标准语法是允许的,而语义限制是限制性的。在-2008之前的VHDL标准修订版中,条件信号赋值只是一个并发语句。您可以选择使用-2008、使用等效的if语句或在赋值中描述数据流,例如,
Sum(I)也可以使用for generate语句。请参阅在通用大小的加法器中哪个也很有用。这里,generate语句对于每个迭代都有一个等价的block语句,每个语句都包含并发的信号分配语句。从您使用过程敏感度列表中的保留字
all
来看,您似乎在使用-2008。顺序条件信号分配语句可能无法在特定工具环境中实现。同样,您可能没有将-2008标志传递给工具分析器(编译器)。对于架构中发现的并发语句,将成功分析(例如ghdl-a--std=08 concfulladder.vhdl,最新的ghdl提交1.0-dev v0.37.0-773-gd85a)
Sum <= A XOR B XOR CIN;
Cout <= (A AND B) OR (Cin AND A) OR (Cin AND B);
Decode1 <= '1' when BlockSelect = '1' and Addr = X"A5" else '0';
Decode1 <= BlockSelect and Addr ?= X"A5";