Xilinx上AES的关键扩展模块:错误:信号上的多重接触

时间:2015-02-06 08:57:53

标签: vhdl xilinx-ise

这是用Xilinx 9.2上的VHDL编写的代码。 NK = 4 NR = 10; VALUE = 43; K_IN是用户以

形式出现的密钥
type STATEX is array(0 to 3, 0 to 3) of std_logic_vector (7 downto 0);

K_OUT是

的输出
type KEYWORD is array (0 to 43) of std_logic_vector (31 downto 0);

subword是一个返回32位输入的Sbox值的组件。

我无法弄清楚K_IN和K_OUT多信号源在哪里发生。请帮我弄清楚并解决这个问题。谢谢。

LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
USE WORK.STATEVARIABLE.ALL;

ENTITY KEY_MODULE IS
    PORT (  
        SYS_CLK:    IN  STD_LOGIC;
        RST:        IN  STD_LOGIC;
        S:          IN  STD_LOGIC;
        K_IN:       IN  STATEX; ---- FOR 128 BITS KEY
        K_OUT:      OUT KEYWORD
    );

END KEY_MODULE;

ARCHITECTURE BEHAVIORAL OF KEY_MODULE IS
    SIGNAL SWORD_OUT:   STD_LOGIC_VECTOR(31 DOWNTO 0);
    SIGNAL TEMP:        STD_LOGIC_VECTOR(31 DOWNTO 0);
    SIGNAL TEMP_WORD:   KEYWORD;

    COMPONENT SUBWORD
        PORT (
            SYS_CLK:    IN  STD_LOGIC;
            RST:        IN  STD_LOGIC;
            S:          IN  STD_LOGIC;
            WORD:       IN  STD_LOGIC_VECTOR(31 DOWNTO 0);
            SWORD:      OUT STD_LOGIC_VECTOR(31 DOWNTO 0)
        );
    END COMPONENT;

    FUNCTION ROTWORD (A: STD_LOGIC_VECTOR(31 DOWNTO 0)) 
            RETURN STD_LOGIC_VECTOR IS
        VARIABLE OUTPUT: STD_LOGIC_VECTOR(31 DOWNTO 0);
    BEGIN
        OUTPUT := A(23 DOWNTO 16) & A(15 DOWNTO 8) & A(7 DOWNTO 0)& 
                  A(31 DOWNTO 24); 
        RETURN OUTPUT;
    END FUNCTION;

    FUNCTION RCON (I: INTEGER) RETURN STD_LOGIC_VECTOR IS
        VARIABLE OUTPUT: STD_LOGIC_VECTOR(31 DOWNTO 0);
        VARIABLE TEMP1: STD_LOGIC_VECTOR(7 DOWNTO 0);
        VARIABLE NUM: INTEGER;
    BEGIN
        NUM :=  2**(I-1)  REM 229 ;
        TEMP1 := CONV_STD_LOGIC_VECTOR(NUM,8);
        OUTPUT := TEMP1 & X"000000" ;
        RETURN OUTPUT;
    END FUNCTION;

BEGIN

G1: FOR J IN 0 TO NK-1 GENERATE
        TEMP_WORD(J) <= K_IN(0,J) & K_IN(1,J) & K_IN(2,J) & K_IN(3,J);
    END GENERATE G1;

G2: FOR J IN NK TO VALUE GENERATE
        TEMP <= TEMP_WORD(J-1);
G3:     IF J MOD NK = 0 GENERATE
UUT1 :      SUBWORD 
                PORT MAP (
                    SYS_CLK => SYS_CLK,
                    RST => RST,
                    S => S,
                    WORD => ROTWORD(TEMP),
                    SWORD => SWORD_OUT
                );
            TEMP <= SWORD_OUT XOR RCON(J/NK);
        END GENERATE G3;

G4:     IF (NK > 6 AND (J MOD NK) = 4)  GENERATE
UUT2 :      SUBWORD 
                PORT MAP (
                    SYS_CLK => SYS_CLK,
                    RST => RST,
                    S => S,
                    WORD => TEMP,
                    SWORD => SWORD_OUT
                );
            TEMP <= SWORD_OUT;
        END GENERATE G4;
        TEMP_WORD(J) <= TEMP_WORD(J-NK) XOR TEMP;
    END GENERATE G2;

    K_OUT <= TEMP_WORD;

END BEHAVIORAL;

输出错误:

  

错误:Xst:528 - 单位中的多源&lt; KEY_MODULE&gt;在信号上   &LT; K_OUT&LT; 10 -10&LT 31取代;&GT;错误:Xst:528 - 单位中的多源   &LT; KEY_MODULE&GT;信号&lt; K_OUT&lt; 10&gt;&lt; 30&gt;&gt;错误:Xst:528 -   单元中的多源&lt; KEY_MODULE&gt;信号&lt; K_OUT&lt; 10&gt;&lt; 29&gt;&gt;   错误:Xst:528 - 单位中的多源&lt; KEY_MODULE&gt;在信号上   &LT; K_OUT&LT; 10 -10&LT; 28&GT;&GT;错误:Xst:528 - 单位中的多源   &LT; KEY_MODULE&GT;信号&lt; K_OUT&lt; 10&gt;&lt; 10&gt;&gt;错误:Xst:528 -   单元中的多源&lt; KEY_MODULE&gt;信号&lt; K_OUT&lt; 10&gt;&gt;&gt;   错误:Xst:528 - 单位中的多源&lt; KEY_MODULE&gt;在信号上   &LT; K_OUT&LT; 10 -10&α25 GT;&GT;错误:Xst:528 - 单位中的多源   &LT; KEY_MODULE&GT;信号&lt; K_OUT&lt; 10&gt;&gt;&gt;错误:Xst:528 -   单元中的多源&lt; KEY_MODULE&gt;信号&lt; K_IN&lt; 3&gt;&lt; 1&gt;&lt; 7&gt;&gt;&gt;   错误:Xst:528 - 单位中的多源&lt; KEY_MODULE&gt;在信号上   &LT; K_IN&LT 3的密度;&LT 1为卤素;&LT 6个;&GT;错误:Xst:528 - 单位中的多源   &LT; KEY_MODULE&GT;信号&lt; K_IN&lt; 3&gt;&lt; 1&gt;&lt; 5&gt;&gt;错误:Xst:528 -   单元中的多源&lt; KEY_MODULE&gt;信号&lt; K_IN&lt; 3&gt;&lt; 1&gt;&gt;&gt;&gt;   错误:Xst:528 - 单位中的多源&lt; KEY_MODULE&gt;在信号上   &LT; K_IN&LT 3的密度;&LT 1为卤素;&LT 3的密度;&GT;错误:Xst:528 - 单位中的多源   &LT; KEY_MODULE&GT;信号&lt; K_IN&lt; 3&gt;&lt; 1&gt;&gt;错误:Xst:528 -   单元中的多源&lt; KEY_MODULE&gt;信号&lt; K_IN&lt; 3&gt;&lt; 1&gt;&lt; 1&gt;&gt;   错误:Xst:528 - 单位中的多源&lt; KEY_MODULE&gt;在信号上   &LT; K_IN&LT 3的密度;&LT 1为卤素;&℃,GT;&GT;错误:Xst:528 - 单位中的多源   &LT; KEY_MODULE&GT;信号&lt; K_IN&lt; 3&gt;&lt; 2&gt;&lt;&gt;&lt; 3&gt;错误:Xst:528 -   单元中的多源&lt; KEY_MODULE&gt;信号&lt; K_IN&lt; 3&gt;&lt; 2&gt;&gt;&gt;&gt;   错误:Xst:528 - 单位中的多源&lt; KEY_MODULE&gt;在信号上   &LT; K_IN&LT 3的密度;&LT 2 - ;&LT 5个;&GT;错误:Xst:528 - 单位中的多源   &LT; KEY_MODULE&GT;信号&lt; K_IN&lt; 3&gt;&lt; 2&gt;&gt;错误:Xst:528 -   单元中的多源&lt; KEY_MODULE&gt;信号&lt; K_IN&lt; 3&gt;&lt; 3&gt;&gt;&gt;&gt;   错误:Xst:528 - 单位中的多源&lt; KEY_MODULE&gt;在信号上   &LT; K_IN&LT 3的密度;&LT 2 - ;&LT 2 - ;&GT;错误:Xst:528 - 单位中的多源   &LT; KEY_MODULE&GT;信号&lt; K_IN&lt; 3&gt;&lt; 2&gt;&gt;错误:Xst:528 -   单元中的多源&lt; KEY_MODULE&gt;信号&lt; K_IN&lt; 3&gt;&lt; 2&gt;&gt;&gt;&gt;   错误:Xst:528 - 单位中的多源&lt; KEY_MODULE&gt;在信号上   &LT; K_IN&LT 3的密度;&LT 3的密度;&LT 7个;&GT;错误:Xst:528 - 单位中的多源   &LT; KEY_MODULE&GT;信号&lt; K_IN&lt; 3&gt;&lt; 3&gt;&lt; 3&gt;&lt; 3&gt;错误:Xst:528 -   单元中的多源&lt; KEY_MODULE&gt;信号&lt; K_IN&lt; 3&gt;&lt; 3&gt;&lt; 5&gt;&gt;&gt;   错误:Xst:528 - 单位中的多源&lt; KEY_MODULE&gt;在信号上   &LT; K_IN&LT 3的密度;&LT 3的密度;&4; GT;&GT;错误:Xst:528 - 单位中的多源   &LT; KEY_MODULE&GT;信号&lt; K_IN&lt; 3&gt;&lt; 3&gt;&lt; 3&gt;错误:Xst:528 -   单元中的多源&lt; KEY_MODULE&gt;信号&lt; K_IN&lt; 3&gt;&lt; 3&gt;&gt;&gt;&gt;   错误:Xst:528 - 单位中的多源&lt; KEY_MODULE&gt;在信号上   &LT; K_IN&LT 3的密度;&LT 3的密度;&LT 1为卤素;&GT;错误:Xst:528 - 单位中的多源   &LT; KEY_MODULE&GT;信号&lt; K_IN&lt; 3&gt;&lt; 3&gt;&lt; 0&gt;&gt;

1 个答案:

答案 0 :(得分:0)

我会尝试在一个进程下封装所有赋值给TEMP_WORD(即K_OUT)或生成块(例如:Gmain下的G1和G2)。尽管索引似乎不重叠,但编译器可能仍然不接受。

编辑:

更仔细地阅读您的代码,您的问题来自TEMP信号的多次分配,然后分配给TEMP_WORD - &gt; K_OUT

不过,你有 TEMP&lt; = TEMP_WORD(J-1);和TEMP_WORD(J)&lt; = TEMP_WORD(J-NK)XOR TEMP;在G2的开头和结尾:创建一个组合循环。