If statement VHDL编码错误“检查时钟后的Else子句不受支持”

If statement VHDL编码错误“检查时钟后的Else子句不受支持”,if-statement,vhdl,vivado,alu,If Statement,Vhdl,Vivado,Alu,该代码的功能是给定一个操作码,它将在时钟上升沿执行一项任务。我是一名二年级本科生,因此任何帮助/意见都将不胜感激 library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.NUMERIC_STD.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity ALU is Port ( X,Y :IN BIT_VECTOR(2 downto 0); OPcode :IN BIT_VECTOR(2

该代码的功能是给定一个操作码,它将在时钟上升沿执行一项任务。我是一名二年级本科生,因此任何帮助/意见都将不胜感激

library IEEE; 
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity ALU is   Port (
   X,Y     :IN BIT_VECTOR(2 downto 0);
   OPcode  :IN BIT_VECTOR(2 downto 0);
   Z       :OUT BIT_VECTOR(5 downto 0);
   CLK     :IN BIT;
   TempValX:INOUT BIT_VECTOR(5 downto 0)); 
end ALU;
architecture Circuit of ALU is signal g: BIT_VECTOR(3 downto 0);
signal C: BIT_VECTOR(3 downto 0);
signal p, u, r : bit_vector(2 downto 0);
signal s: Bit_vector(5 downto 0);
Component ThreeBitFA is
       PORT (X,Y   :IN BIT_VECTOR(2 downto 0);
               C   :INOUT BIT_VECTOR(3 downto 0));
   end component; begin adder:ThreeBitFA port map(
           X => X,
           Y => Y,
           C => C);
Process(X,Y,CLK,OPcode)
begin
     IF OPcode = "000" THEN ----------------ADD OPcode
       IF (CLK'EVENT AND CLK = '1') THEN
           tempvalx <= "00" & C;
                     Z <= tempvalx;
       end if;
     ELSIF OPcode = "001" THEN ----------------MULT OPcode
       IF (CLK'EVENT AND CLK = '1') THEN
          IF Y(0) = '1' THEN P <= X; ELSE P <= "000"; END IF;
          IF Y(1) = '1' THEN u <= X; ELSE u <= "000"; END IF;
          IF Y(2) = '1' THEN R <= X; ELSE R <= "000"; END IF;
       z(0) <= P(0); 
       z(1) <= P(1) XOR u(0); s(0) <= P(1) AND u(0);
       z(2) <= P(2) XOR u(1) XOR R(0) XOR s(0); s(1) <= s(0) AND P(2); s(2) <= u(1) AND R(0);
       z(3) <= u(2) XOR R(1) XOR s(1) XOR s(2); s(3) <= s(2) AND s(1); s(4) <= u(2) AND R(1);
       z(4) <= R(2) XOR s(3) XOR s(4); s(5) <= s(3) AND s(4); 
       z(5) <= s(5);
       end if;

     ELSIF (OPcode = "010") THEN ------------AND OPcode
       IF (CLK'EVENT AND CLK = '1') THEN
           Z <= "000" & (X AND Y);
       end IF;
     ELSIF (OPcode = "011") THEN ------------OR  Opcode
       IF (CLK'EVENT AND CLK = '1') THEN
           Z <= "000" & (X OR Y);
       end IF;
     ELSIF (OPcode = "100") THEN ------------XOR Opcode
       IF (CLK'EVENT AND CLK = '1') THEN
           Z <= "000" & (X XOR Y);
       end IF;
     ELSIF (OPcode = "101") THEN ------------NOT Opcode
       IF (CLK'EVENT AND CLK = '1') THEN
           Z <= "000" & (NOT X);
       end IF;
     ELSIF (OPcode = "110") THEN -----------Rshift OPcode
       IF (CLK'EVENT AND CLK = '1') THEN
           TempValX <= "000" & X;
           Z <= '0' & TempValX(5 downto 1);
     ELSIF (OPcode = "111") THEN -----------Lshift OPcode
       IF (CLK'EVENT AND CLK = '1') THEN
            TempValX <= "000" & X;
           Z <= TempValX(4 downto 0) & '0';
       end IF;   
     ELSE
          Null;
     END IF;  
   END IF; END Process; end Circuit;

有两件事很突出

如果您只需要在时钟上升沿执行任务,那么您只需要在流程敏感度列表中显示“CLK”

进程中if-else的优先顺序是错误的。所有操作码解码逻辑都应在上升沿时钟检查内


你的问题是什么?程序是否未按预期工作?当我合成程序时,它会给我错误“检查时钟不受支持后的Else子句”。我正试着做一个示意图来交上来。但该选项是灰色的,我假设它需要正确运行合成以制作原理图。请阅读有关如何使用rising_edge的编码模式,或者在您使用老式书写clk'event的情况下,何时以及如何使用。这个密码完全被破坏了。。。不要使用未签名的软件包标准逻辑。请正确缩进代码,以便我们阅读。您使用了许多与std_逻辑相关的软件包,但您的代码使用的是bit/bit_vector类型……我们的实验室讲师希望我们在std_逻辑上使用bit_vector。谢谢你的输入!您不需要任何当前的use子句。如果;,就有一个错误的结局。另请参见Xilinx社区论坛。设计规范可能存在其他问题。标准IEEE Std 1076-2008与您的第一点10.2等待声明相矛盾。10.2规则适用于具有敏感度列表的流程结束时的隐式等待语句。请注意,操作码位于带有时钟边缘条件的if语句之外。第二点与IEEE Std 1076.6-2004 RTL Synthesis相矛盾,第6.1.3节对边缘敏感存储元件进行建模见异步条件。另请参见示例3。在6.1.3.1中,从具有灵敏度列表和一个时钟的过程中进行边缘敏感存储。Xilinx错误消息表明Xilinx可以解析此类构造。