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

时间:2020-10-04 15:33:36

标签: 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);
                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;

所有这些都是正确的,我没有收到任何错误。但是,如果尝试使用for循环减少行数,则会出现错误:

PROCESS (all) IS

BEGIN

    FOR I IN 0 TO 7 LOOP

        Sum(I) <= '0' WHEN (A(I) XOR B(I) XOR CIN(I)) = '0' ELSE 
                     '1';
                     
        Cout(I) <= '0' WHEN ((A(I) AND B(I)) OR (Cin(I) AND A(I)) OR (Cin(I) AND B(I))) = '0' ELSE 
                      '1';

    END LOOP;

END PROCESS;

错误是:文字WHEN附近的错误;期待“;”。在Internet上搜索解决方案时,我发现我无法在同一程序中使用顺序代码和并发代码。这个问题有解决方案吗?

2 个答案:

答案 0 :(得分:1)

仅当使用VHDL 2008或更高版本时,才允许在进程内部使用

when..else。对于以前的版本,您需要在流程外部使用when..else语句。

答案 1 :(得分:1)

这里不需要条件分配。而是尝试:

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;

或者,所有的VHDL逻辑运算符都是按位的,因此您也应该能够将其写为(但请确保在仿真中进行验证):

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';

在VHDL-2008中,这种用法也将消失,因为我们可以使用?=来重新表达它,而无需使用条件”分配。

Decode1 <= BlockSelect and Addr ?= X"A5";

与任何VHDL-2008代码一样,您的综合供应商可能尚不支持它。如果他们没有(并且您已经在他们的工具中打开了VHDL-2008),请确保针对他们的实施提交错误报告。

相关问题