-1

这是在 Xilinx 9.2 ise 上用 VHDL 编写的代码。NK = 4 NR = 10;值=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 - 信号 <K_OUT<10><31>> 上的单元 <KEY_MODULE> 中的多源错误:Xst:528 - 信号 <K_OUT<10><30>> 上的单元 <KEY_MODULE> 中的多源错误:Xst:528 - 信号 <K_OUT<10><29>>
上的单元 <KEY_MODULE> 中的多源错误:Xst:528 - 信号 <K_OUT<10><28>> 上的单元 <KEY_MODULE> 中的多源ERROR:Xst:528 - 信号 <K_OUT<10><27>> 上的单元 <KEY_MODULE> 中的多源 ERROR:Xst:528 - 信号 <K_OUT<10><26>> 上的单元 <KEY_MODULE> 中的多源
错误:Xst:528 - 信号 <K_OUT<10><25>> 上的单元 <KEY_MODULE> 中的多源错误:Xst:528 - 信号 <K_OUT<10><24>> 上的单元 <KEY_MODULE> 中的多源错误:Xst:528 - 单元 <KEY_MODULE> 中的多源信号 <K_IN<3><1><7>>
错误:Xst:528 - 信号 <K_IN<3><1><6>> 单元 <KEY_MODULE> 中的多源错误:Xst:528 - 信号 <K_IN<3>< 单元 <KEY_MODULE> 中的多源1><5>> 错误:Xst:528 - 单元 <KEY_MODULE> 信号 <K_IN<3><1><4>>
错误:Xst:528 - 单元 <KEY_MODULE> 信号多源<K_IN<3><1><3>> ERROR:Xst:528 - 单元 <KEY_MODULE> 中的多源信号 <K_IN<3><1><2>> ERROR:Xst:528 - 多源输入信号 <K_IN<3><1><1>> 上
的单元 <KEY_MODULE> 错误:Xst:528 - 信号 <K_IN<3><1><0>> 上单元 <KEY_MODULE> 中的多源错误:Xst: 528 - 单元中的多源 <KEY_MODULE>信号 <K_IN<3><2><7>> 错误:Xst:528 - 单元 <KEY_MODULE> 中的多源信号 <K_IN<3><2><6>>
错误:Xst:528 - 信号 <K_IN<3><2><5>> 单元 <KEY_MODULE> 中的多源错误:Xst:528 - 信号 <K_IN<3>< 单元 <KEY_MODULE> 中的多源2><4>> 错误:Xst:528 - 单元 <KEY_MODULE> 信号 <K_IN<3><2><3>>
错误:Xst:528 - 单元 <KEY_MODULE> 信号多源<K_IN<3><2><2>> ERROR:Xst:528 - 单元 <KEY_MODULE> 中的多源信号 <K_IN<3><2><1>> ERROR:Xst:528 - 多源输入信号 <K_IN<3><2><0>> 上
的单元 <KEY_MODULE> 错误:Xst:528 - 信号 <K_IN<3><3><7>> 上的单元 <KEY_MODULE> 中的多源错误:Xst: 528 - 单元中的多源 <KEY_MODULE>信号 <K_IN<3><3><6>> 错误:Xst:528 - 单元 <KEY_MODULE> 中的多源信号 <K_IN<3><3><5>>
错误:Xst:528 - 信号 <K_IN<3><3><4>> 单元 <KEY_MODULE> 中的多源错误:Xst:528 - 信号 <K_IN<3>< 单元 <KEY_MODULE> 中的多源3><3>> 错误:Xst:528 - 单元 <KEY_MODULE> 信号 <K_IN<3><3><2>>
错误:Xst:528 - 单元 <KEY_MODULE> 信号多源<K_IN<3><3><1>> 错误:Xst:528 - 单元 <KEY_MODULE> 中的多源信号 <K_IN<3><3><0>>

4

1 回答 1

0

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

编辑 :

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

此外,您有 TEMP <= TEMP_WORD(J-1); 和 TEMP_WORD(J) <= TEMP_WORD(J-NK) XOR TEMP;在 G2 的开头和结尾:创建一个组合循环。

于 2015-02-06T10:12:32.420 回答