这是用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;
答案 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的开头和结尾:创建一个组合循环。