📄 blowfish.vhdl
字号:
if key_r_empty = '0' then next_state <= S_KEY; elsif i_data_r_empty = '0' and o_data_w_full = '0' then next_state <= S_CIPHER; end if; end if; when S_CIPHER => P_enc <= i_data_r_enc; if cipher_en_o = '1' then i_data_r_en <= '1'; o_data_w_en <= '1'; next_state <= S_IDLE; elsif cipher_busy = '0' then cipher_en_i <= '1'; end if; when S_KEY => next_state <= S_KEY_PARRAY_INIT; next_count <= (others => '0'); when S_KEY_PARRAY_INIT => p_w_en <= '1'; pcount := to_integer(count(4 downto 0)); next_count <= count + 1; case pcount is when 0 => p_w_data_i <= x"243f6a88" xor key_r_data(447 downto 416); when 1 => p_w_data_i <= x"85a308d3" xor key_r_data(415 downto 384); when 2 => p_w_data_i <= x"13198a2e" xor key_r_data(383 downto 352); when 3 => p_w_data_i <= x"03707344" xor key_r_data(351 downto 320); when 4 => p_w_data_i <= x"a4093822" xor key_r_data(319 downto 288); when 5 => p_w_data_i <= x"299f31d0" xor key_r_data(287 downto 256); when 6 => p_w_data_i <= x"082efa98" xor key_r_data(255 downto 224); when 7 => p_w_data_i <= x"ec4e6c89" xor key_r_data(223 downto 192); when 8 => p_w_data_i <= x"452821e6" xor key_r_data(191 downto 160); when 9 => p_w_data_i <= x"38d01377" xor key_r_data(159 downto 128); when 10 => p_w_data_i <= x"be5466cf" xor key_r_data(127 downto 96); when 11 => p_w_data_i <= x"34e90c6c" xor key_r_data(95 downto 64); when 12 => p_w_data_i <= x"c0ac29b7" xor key_r_data(63 downto 32); when 13 => p_w_data_i <= x"c97c50dd" xor key_r_data(31 downto 0); when 14 => p_w_data_i <= x"3f84d5b5" xor key_r_data(447 downto 416); when 15 => p_w_data_i <= x"b5470917" xor key_r_data(415 downto 384); when 16 => p_w_data_i <= x"9216d5d9" xor key_r_data(383 downto 352); when others => p_w_data_i <= x"8979fb1b" xor key_r_data(351 downto 320); cipher_p_init <= '1'; next_state <= S_KEY_SBOX_INIT; next_count <= (others => '0'); end case; when S_KEY_SBOX_INIT => S1_w_en <= not count(9) and not count(8); S2_w_en <= not count(9) and count(8); S3_w_en <= count(9) and not count(8); S4_w_en <= count(9) and count(8); if count = 1023 then next_state <= S_KEY_PARRAY_CIPHER; end if; next_count <= count + 1; when S_KEY_PARRAY_CIPHER => if cipher_busy = '0' then cipher_en_i <= '1'; if count = 0 then cipher_data_i <= (others => '0'); else cipher_data_i <= cipher_data_o; end if; next_state <= S_KEY_PARRAY_WRITE_HIGH; end if; when S_KEY_PARRAY_WRITE_HIGH => if cipher_en_o = '1' then p_w_en <= '1'; p_w_data_i <= cipher_data_o(63 downto 32); next_state <= S_KEY_PARRAY_WRITE_LOW; next_count <= count + 1; end if; when S_KEY_PARRAY_WRITE_LOW => p_w_en <= '1'; p_w_data_i <= cipher_data_o(31 downto 0); next_state <= S_KEY_PARRAY_CIPHER; next_count <= count + 1; cipher_p_init <= '1'; if count = 17 then next_state <= S_KEY_SBOX_CIPHER; next_count <= (others => '0'); end if; when S_KEY_SBOX_CIPHER => if cipher_busy = '0' then cipher_en_i <= '1'; cipher_data_i <= cipher_data_o; next_state <= S_KEY_SBOX_WRITE_HIGH; end if; when S_KEY_SBOX_WRITE_HIGH => if cipher_en_o = '1' then S1_w_en <= not count(9) and not count(8); S2_w_en <= not count(9) and count(8); S3_w_en <= count(9) and not count(8); S4_w_en <= count(9) and count(8); S1_w_data_i <= cipher_data_o(63 downto 32); S2_w_data_i <= cipher_data_o(63 downto 32); S3_w_data_i <= cipher_data_o(63 downto 32); S4_w_data_i <= cipher_data_o(63 downto 32); next_state <= S_KEY_SBOX_WRITE_LOW; next_count <= count + 1; end if; when S_KEY_SBOX_WRITE_LOW => S1_w_en <= not count(9) and not count(8); S2_w_en <= not count(9) and count(8); S3_w_en <= count(9) and not count(8); S4_w_en <= count(9) and count(8); S1_w_data_i <= cipher_data_o(31 downto 0); S2_w_data_i <= cipher_data_o(31 downto 0); S3_w_data_i <= cipher_data_o(31 downto 0); S4_w_data_i <= cipher_data_o(31 downto 0); next_state <= S_KEY_SBOX_CIPHER; next_count <= count + 1; if count = 1023 then key_r_en <= '1'; P_enc <= i_data_r_enc; next_state <= S_IDLE; end if; when others => next_state <= S_IDLE; end case; end process; proc_state : process (CLK_I) is begin if rising_edge(CLK_I) then state <= next_state; count <= next_count; prev_P_enc <= P_enc; if RST_I = '1' then state <= S_IDLE; end if; end if; end process; end block; u_BlowfishPiROM : entity work.BlowfishPiROM port map ( CLK_I => CLK_I, ADDR_I => Pi_addr, DATA_O => Pi_data ); u_BlowfishPArray : entity work.BlowfishPArray port map ( CLK_I => CLK_I, ENC_I => P_enc, R_EN_I => P_r_en, R_ADDR_I => P_r_addr, R_DATA_O => P_r_data, W_EN_I => p_w_en, W_ADDR_I => p_w_addr, W_DATA_I => p_w_data_i ); u_BlowfishSBox1 : entity work.BlowfishSBox port map ( CLK_I => CLK_I, R_EN_I => S1_r_en, R_ADDR_I => S1_r_addr, R_DATA_O => S1_r_data, W_EN_I => S1_w_en, W_ADDR_I => S1_w_addr, W_DATA_I => S1_w_data_i ); u_BlowfishSBox2 : entity work.BlowfishSBox port map ( CLK_I => CLK_I, R_EN_I => S2_r_en, R_ADDR_I => S2_r_addr, R_DATA_O => S2_r_data, W_EN_I => S2_w_en, W_ADDR_I => S2_w_addr, W_DATA_I => S2_w_data_i ); u_BlowfishSBox3 : entity work.BlowfishSBox port map ( CLK_I => CLK_I, R_EN_I => S3_r_en, R_ADDR_I => S3_r_addr, R_DATA_O => S3_r_data, W_EN_I => S3_w_en, W_ADDR_I => S3_w_addr, W_DATA_I => S3_w_data_i ); u_BlowfishSBox4 : entity work.BlowfishSBox port map ( CLK_I => CLK_I, R_EN_I => S4_r_en, R_ADDR_I => S4_r_addr, R_DATA_O => S4_r_data, W_EN_I => S4_w_en, W_ADDR_I => S4_w_addr, W_DATA_I => S4_w_data_i ); u_BlowfishCipher : entity work.BlowfishCipher port map ( RST_I => RST_I, CLK_I => CLK_I, EN_I => cipher_en_i, DATA_I => cipher_data_i, BUSY_O => cipher_busy, EN_O => cipher_en_o, DATA_O => cipher_data_o, P_INIT_I => cipher_p_init, P_EN_O => P_r_en, P_ADDR_O => P_r_addr, P_DATA_I => P_r_data, S1_EN_O => S1_r_en, S1_ADDR_O => S1_r_addr, S1_DATA_I => S1_r_data, S2_EN_O => S2_r_en, S2_ADDR_O => S2_r_addr, S2_DATA_I => S2_r_data, S3_EN_O => S3_r_en, S3_ADDR_O => S3_r_addr, S3_DATA_I => S3_r_data, S4_EN_O => S4_r_en, S4_ADDR_O => S4_r_addr, S4_DATA_I => S4_r_data );end architecture rtl;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -