You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

125 lines
3.5 KiB

  1. library ieee ;
  2. use ieee.std_logic_1164.all;
  3. package uart_aes_sim is
  4. generic (
  5. period_ns : time
  6. );
  7. procedure uart_send ( data : in std_logic_vector(7 downto 0);
  8. signal tx : out std_logic);
  9. procedure uart_recv ( data : out std_logic_vector(7 downto 0);
  10. signal rx : in std_logic);
  11. procedure aes_setup ( key : in std_logic_vector(0 to 127);
  12. nonce : in std_logic_vector(0 to 95);
  13. signal tx : out std_logic);
  14. procedure aes_write ( data : in std_logic_vector(0 to 127);
  15. signal tx : out std_logic);
  16. procedure aes_read ( data : out std_logic_vector(0 to 127);
  17. signal tx : out std_logic;
  18. signal rx : in std_logic);
  19. procedure aes_crypt (signal tx : out std_logic;
  20. signal rx : in std_logic);
  21. end package;
  22. package body uart_aes_sim is
  23. procedure uart_send ( data : in std_logic_vector(7 downto 0);
  24. signal tx : out std_logic) is
  25. begin
  26. report "UART send: 0x" & to_hstring(data);
  27. wait for period_ns;
  28. tx <= '0';
  29. wait for period_ns;
  30. for i in 0 to 7 loop
  31. tx <= data(i);
  32. wait for period_ns;
  33. end loop;
  34. tx <= '1';
  35. wait for 0 ns;
  36. end procedure;
  37. procedure uart_recv ( data : out std_logic_vector(7 downto 0);
  38. signal rx : in std_logic) is
  39. begin
  40. wait until not rx;
  41. wait for period_ns; -- Skip start bit
  42. wait for period_ns/2;
  43. for i in 0 to 7 loop
  44. data(i) := rx;
  45. wait for period_ns;
  46. end loop;
  47. report "UART recv: 0x" & to_hstring(data);
  48. end procedure;
  49. procedure aes_setup ( key : in std_logic_vector(0 to 127);
  50. nonce : in std_logic_vector(0 to 95);
  51. signal tx : out std_logic) is
  52. begin
  53. -- Reset control register
  54. uart_send(x"01", tx);
  55. uart_send(x"01", tx);
  56. -- Write key register
  57. for i in 0 to 15 loop
  58. uart_send(x"11", tx);
  59. uart_send(key(i*8 to i*8+7), tx);
  60. end loop;
  61. -- Write nonce register
  62. for i in 0 to 11 loop
  63. uart_send(x"21", tx);
  64. uart_send(nonce(i*8 to i*8+7), tx);
  65. end loop;
  66. -- Set control registers CTR_START bit
  67. uart_send(x"01", tx);
  68. uart_send(x"02", tx);
  69. end procedure;
  70. procedure aes_write ( data : in std_logic_vector(0 to 127);
  71. signal tx : out std_logic) is
  72. begin
  73. -- Write din register
  74. for i in 0 to 15 loop
  75. uart_send(x"31", tx);
  76. uart_send(data(i*8 to i*8+7), tx);
  77. end loop;
  78. end procedure;
  79. procedure aes_read ( data : out std_logic_vector(0 to 127);
  80. signal tx : out std_logic;
  81. signal rx : in std_logic) is
  82. variable v_data : std_logic_vector(7 downto 0);
  83. begin
  84. -- Check for valid AES output data
  85. loop
  86. uart_send(x"00", tx);
  87. uart_recv(v_data, rx);
  88. exit when v_data(3);
  89. end loop;
  90. -- Read dout register
  91. for i in 0 to 15 loop
  92. uart_send(x"40", tx);
  93. uart_recv(data(i*8 to i*8+7), rx);
  94. end loop;
  95. end procedure;
  96. procedure aes_crypt (signal tx : out std_logic;
  97. signal rx : in std_logic) is
  98. variable v_data : std_logic_vector(7 downto 0);
  99. begin
  100. uart_send(x"00", tx);
  101. uart_recv(v_data, rx);
  102. v_data(2) := '1';
  103. -- Set control registers CTR_START bit
  104. uart_send(x"01", tx);
  105. uart_send(v_data, tx);
  106. end procedure;
  107. end package body;