📄 aes_enc.vhdl
字号:
--------------------------------------------------------------------------------
-- Organization: www.opendsp.pl
-- Engineer: Jerzy Gbur
--
-- Create Date: 2006-05-15 20:05:12
-- Design Name: AES_128_192_256
-- Module Name: aes
-- Project Name:
-- Target Device:
-- Tool versions:
-- Description:
-- State Table index
-- ---------------------
-- | 0 | 4 | 8 | 12 |
-- ---------------------
-- | 1 | 5 | 9 | 13 |
-- ---------------------
-- | 2 | 6 | 10 | 14 |
-- ---------------------
-- | 3 | 7 | 11 | 15 |
-- ---------------------
-- Dependencies:
--
-- Revision:
-- Revision 0.01 - File Created
-- Additional Comments:
--
--------------------------------------------------------------------------------
-- http://www.csrc.nist.gov/pki/CSOR/algorithms.html
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
library WORK;
use WORK.aes_pkg.ALL;
entity aes_enc is
generic
(
KEY_SIZE : in integer range 0 to 2 := 0 -- 0-128; 1-192; 2-256
);
port
(
DATA_I : in std_logic_vector(7 downto 0);
VALID_DATA_I : in std_logic;
KEY_I : in std_logic_vector(7 downto 0);
VALID_KEY_I : in std_logic;
RESET_I : in std_logic;
CLK_I : in std_logic;
CE_I : in std_logic;
KEY_READY_O : out std_logic;
VALID_O : out std_logic;
DATA_O : out std_logic_vector(7 downto 0)
);
end aes_enc;
architecture Behavioral of aes_enc is
signal rom_FRV_SBOX : type_SBOX;
signal v_CNT4 : std_logic_vector(1 downto 0);
signal STATE_TABLE1 : type_STATE_TABLE;
signal t_STATE_RAM0 : type_STATE_RAM;
signal v_KEY_COLUMN : std_logic_vector(31 downto 0);
signal v_DATA_COLUMN : std_logic_vector(31 downto 0);
signal FF_VALID_DATA : std_logic;
signal v_KEY_NUMB : std_logic_vector(5 downto 0);
signal v_C : std_logic_vector(15 downto 0);
signal i_MAX_ROUND : integer range 0 to 14;
signal i_ROUND : integer range 0 to 14;
signal SRAM_WREN0 : std_logic;
signal GET_KEY : std_logic;
signal FF_GET_KEY : std_logic;
signal CALCULATION : std_logic;
signal LAST_ROUND : std_logic;
signal i_RAM_ADDR_RD0 : integer range 0 to 3;
signal i_RAM_ADDR_WR0 : integer range 0 to 3;
signal v_RAM_OUT0 : std_logic_vector(31 downto 0);
signal v_RAM_IN0 : std_logic_vector(31 downto 0);
signal v_CALCULATION_CNTR : std_logic_vector(7 downto 0);
begin
i_MAX_ROUND <= 8 when KEY_SIZE = 0 else
10 when KEY_SIZE = 1 else
12 when KEY_SIZE = 2 else
8;
--****************************************************************************--
--* Key production *--
--****************************************************************************--
KEXP0:
key_expansion
GENERIC MAP
(
KEY_SIZE => KEY_SIZE
)
PORT MAP (
KEY_I => KEY_I,
VALID_KEY_I => VALID_KEY_I,
CLK_I => CLK_I,
RESET_I => RESET_I,
CE_I => CE_I,
DONE_O => KEY_READY_O,
GET_KEY_I => GET_KEY,
KEY_NUMB_I => v_KEY_NUMB,
KEY_EXP_O => v_KEY_COLUMN
);
--****************************************************************************--
--* Incomming data *--
--****************************************************************************--
P0001:
process(CLK_I)
begin
if rising_edge(CLK_I) then
if VALID_DATA_I = '1' then
if v_CNT4 = "00" then
v_DATA_COLUMN(7 downto 0) <= DATA_I;
elsif v_CNT4 = "01" then
v_DATA_COLUMN(15 downto 8) <= DATA_I;
elsif v_CNT4 = "10" then
v_DATA_COLUMN(23 downto 16) <= DATA_I;
elsif v_CNT4 = "11" then
v_DATA_COLUMN(31 downto 24) <= DATA_I;
end if;
end if;
end if;
end process;
P0002:
process (CLK_I)
begin
if rising_edge(CLK_I) then
if CE_I = '1' then
if VALID_DATA_I = '1' then
v_CNT4 <= v_CNT4 + 1;
else
v_CNT4 <= "00";
end if;
end if;
end if;
end process;
--****************************************************************************--
--* Get Key *--
--****************************************************************************--
P0003:
process(CLK_I)
begin
if rising_edge(CLK_I) then
if VALID_DATA_I = '1' and v_CNT4 = "10" then
GET_KEY <= '1';
elsif v_CALCULATION_CNTR = x"04" or v_CALCULATION_CNTR = x"05" or v_CALCULATION_CNTR = x"06" or v_CALCULATION_CNTR = x"07" then
GET_KEY <= '1';
else
GET_KEY <= '0';
end if;
end if;
end process;
--****************************************************************************--
--* Address for 32bit words of KEY *--
--****************************************************************************--
P0004:
process(CLK_I)
begin
if rising_edge(CLK_I) then
if RESET_I = '1' then
v_KEY_NUMB <= (others => '0');
elsif CE_I = '1' then
if VALID_DATA_I = '1' and FF_VALID_DATA = '0' then
v_KEY_NUMB <= (others => '0');
elsif GET_KEY = '1' then
v_KEY_NUMB <= v_KEY_NUMB + 1;
end if;
end if;
end if;
end process;
--****************************************************************************--
--* Rom - forward TABLE *--
--****************************************************************************--
rom_FRV_SBOX <= c_SBOX_FRV;
--****************************************************************************--
--* State RAM *--
--****************************************************************************--
ST_RAM0:
process(CLK_I)
begin
if rising_edge(CLK_I) then
-- WRITTING ADDERSS
if RESET_I = '1' then
i_RAM_ADDR_WR0 <= 0;
i_RAM_ADDR_RD0 <= 0;
elsif CE_I = '1' then
if VALID_DATA_I = '1' and FF_VALID_DATA = '0' then
i_RAM_ADDR_WR0 <= 0;
elsif SRAM_WREN0 = '1' then
if i_RAM_ADDR_WR0 = 3 then
i_RAM_ADDR_WR0 <= 0;
else
i_RAM_ADDR_WR0 <= i_RAM_ADDR_WR0 + 1;
end if;
end if;
end if;
-- RAM
if CE_I = '1' then
if SRAM_WREN0 = '1' then
t_STATE_RAM0(i_RAM_ADDR_WR0) <= v_RAM_IN0;
end if;
v_RAM_OUT0 <= t_STATE_RAM0(i_RAM_ADDR_RD0);
end if;
if CE_I = '1' then
FF_GET_KEY <= GET_KEY;
SRAM_WREN0 <= FF_GET_KEY;
end if;
-- READING ADDRESS
if CE_I = '1' then
if v_CALCULATION_CNTR = x"01" or v_CALCULATION_CNTR = x"02" or v_CALCULATION_CNTR = x"03" then
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -