library ieee ;
|
|
use ieee.std_logic_1164.all;
|
|
|
|
|
|
package uart_aes_sim is
|
|
|
|
generic (
|
|
period_ns : time
|
|
);
|
|
|
|
procedure uart_send ( data : in std_logic_vector(7 downto 0);
|
|
signal tx : out std_logic);
|
|
|
|
procedure uart_recv ( data : out std_logic_vector(7 downto 0);
|
|
signal rx : in std_logic);
|
|
|
|
procedure aes_setup ( key : in std_logic_vector(0 to 127);
|
|
nonce : in std_logic_vector(0 to 95);
|
|
signal tx : out std_logic);
|
|
|
|
procedure aes_write ( data : in std_logic_vector(0 to 127);
|
|
signal tx : out std_logic);
|
|
|
|
procedure aes_read ( data : out std_logic_vector(0 to 127);
|
|
signal tx : out std_logic;
|
|
signal rx : in std_logic);
|
|
|
|
procedure aes_crypt (signal tx : out std_logic;
|
|
signal rx : in std_logic);
|
|
|
|
end package;
|
|
|
|
package body uart_aes_sim is
|
|
|
|
procedure uart_send ( data : in std_logic_vector(7 downto 0);
|
|
signal tx : out std_logic) is
|
|
begin
|
|
report "UART send: 0x" & to_hstring(data);
|
|
wait for period_ns;
|
|
tx <= '0';
|
|
wait for period_ns;
|
|
for i in 0 to 7 loop
|
|
tx <= data(i);
|
|
wait for period_ns;
|
|
end loop;
|
|
tx <= '1';
|
|
wait for 0 ns;
|
|
end procedure;
|
|
|
|
procedure uart_recv ( data : out std_logic_vector(7 downto 0);
|
|
signal rx : in std_logic) is
|
|
begin
|
|
wait until not rx;
|
|
wait for period_ns; -- Skip start bit
|
|
wait for period_ns/2;
|
|
for i in 0 to 7 loop
|
|
data(i) := rx;
|
|
wait for period_ns;
|
|
end loop;
|
|
report "UART recv: 0x" & to_hstring(data);
|
|
end procedure;
|
|
|
|
procedure aes_setup ( key : in std_logic_vector(0 to 127);
|
|
nonce : in std_logic_vector(0 to 95);
|
|
signal tx : out std_logic) is
|
|
begin
|
|
-- Reset control register
|
|
uart_send(x"01", tx);
|
|
uart_send(x"01", tx);
|
|
-- Write key register
|
|
for i in 0 to 15 loop
|
|
uart_send(x"11", tx);
|
|
uart_send(key(i*8 to i*8+7), tx);
|
|
end loop;
|
|
-- Write nonce register
|
|
for i in 0 to 11 loop
|
|
uart_send(x"21", tx);
|
|
uart_send(nonce(i*8 to i*8+7), tx);
|
|
end loop;
|
|
-- Set control registers CTR_START bit
|
|
uart_send(x"01", tx);
|
|
uart_send(x"02", tx);
|
|
end procedure;
|
|
|
|
procedure aes_write ( data : in std_logic_vector(0 to 127);
|
|
signal tx : out std_logic) is
|
|
begin
|
|
-- Write din register
|
|
for i in 0 to 15 loop
|
|
uart_send(x"31", tx);
|
|
uart_send(data(i*8 to i*8+7), tx);
|
|
end loop;
|
|
end procedure;
|
|
|
|
procedure aes_read ( data : out std_logic_vector(0 to 127);
|
|
signal tx : out std_logic;
|
|
signal rx : in std_logic) is
|
|
variable v_data : std_logic_vector(7 downto 0);
|
|
begin
|
|
-- Check for valid AES output data
|
|
loop
|
|
uart_send(x"00", tx);
|
|
uart_recv(v_data, rx);
|
|
exit when v_data(3);
|
|
end loop;
|
|
-- Read dout register
|
|
for i in 0 to 15 loop
|
|
uart_send(x"40", tx);
|
|
uart_recv(data(i*8 to i*8+7), rx);
|
|
end loop;
|
|
end procedure;
|
|
|
|
procedure aes_crypt (signal tx : out std_logic;
|
|
signal rx : in std_logic) is
|
|
variable v_data : std_logic_vector(7 downto 0);
|
|
begin
|
|
uart_send(x"00", tx);
|
|
uart_recv(v_data, rx);
|
|
v_data(2) := '1';
|
|
-- Set control registers CTR_START bit
|
|
uart_send(x"01", tx);
|
|
uart_send(v_data, tx);
|
|
end procedure;
|
|
|
|
end package body;
|