|
|
- 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;
|