library IEEE; use IEEE.std_logic_1164.all; use IEEE.std_logic_arith.all; use IEEE.std_logic_unsigned.all; use work.Montgomery_projective_parameters.all; entity Montgomery_projective_point_multiplication is port ( xP, yP, k: in std_logic_vector(M-1 downto 0); clk, reset, start: in std_logic; xQ, yQ: out std_logic_vector(M-1 downto 0); done: out std_logic ); end Montgomery_projective_point_multiplication; architecture circuit of Montgomery_projective_point_multiplication is component Montgomery_projective_data_path is port( xP, yP: in std_logic_vector(M-1 downto 0); clk, reset, start_mult, start_div,load, en_XA, en_XB, en_ZA, en_ZB, en_T1, en_T2: in std_logic; sel_a: in std_logic_vector(2 downto 0); sel_b, sel_c, sel_div, sel_square, sel_XA, sel_XB, sel_ZA: in std_logic_vector(1 downto 0); xQ, yQ: out std_logic_vector(M-1 downto 0); mult_done, div_done, infinity: out std_logic ); end component; signal start_mult, start_div, load, en_XA, en_XB, en_ZA, en_ZB, en_T1, en_T2, shift, infinity: std_logic; signal sel_a: std_logic_vector(2 downto 0); signal sel_b, sel_c, sel_div, sel_square, sel_XA, sel_XB, sel_ZA: std_logic_vector(1 downto 0); signal mult_done, div_done: std_logic; signal internal_k: std_logic_vector(M-1 downto 0); signal count: natural range 0 to M; type states is range 0 to 49; signal current_state: states; begin main_component: Montgomery_projective_data_path port map( xP => xP, yP => yP, clk => clk, reset => reset, start_mult => start_mult, start_div => start_div, load => load, en_XA => en_XA, en_XB => en_XB, en_ZA => en_ZA , en_ZB => en_ZB, en_T1=> en_T1, en_T2 => en_T2, sel_a => sel_A, sel_b => sel_B, sel_c => sel_C, sel_div => sel_div, sel_square => sel_square, sel_XA => sel_XA, sel_XB => sel_XB, sel_ZA => sel_ZA, xQ => xQ, yQ => yQ, mult_done => mult_done, div_done => div_done, infinity => infinity ); counter: process(reset, clk) begin if reset = '1' then count <= 0; elsif clk' event and clk = '1' then if load = '1' then count <= 0; elsif shift = '1' then count <= count+1; end if; end if; end process; shift_register: process(clk) begin if clk'event and clk = '1' then if load = '1' then internal_k <= k; elsif shift = '1' then internal_k <= internal_k(M-2 downto 0)&'0'; end if; end if; end process; control_unit: process(clk, reset, current_state) begin case current_state is when 0 to 1 => sel_A <= "000"; sel_B <= "00"; sel_c <= "00"; start_mult <= '0'; sel_div <= "00"; start_div <= '0'; sel_square <= "00"; load <= '0'; sel_XA <= "00"; en_XA <= '0'; sel_XB <= "00"; en_XB <= '0'; sel_ZA <= "00"; en_ZA <= '0'; en_ZB <= '0'; en_T1 <= '0'; en_T2 <= '0'; shift <= '0'; done <= '1'; when 2 => sel_A <= "000"; sel_B <= "00"; sel_c <= "00"; start_mult <= '0'; sel_div <= "00"; start_div <= '0'; sel_square <= "00"; load <= '1'; sel_XA <= "00"; en_XA <= '0'; sel_XB <= "00"; en_XB <= '0'; sel_ZA <= "00"; en_ZA <= '0'; en_ZB <= '0'; en_T1 <= '0'; en_T2 <= '0'; shift <= '0'; done <= '0'; when 3 => sel_A <= "000"; sel_B <= "00"; sel_c <= "11"; start_mult <= '1'; sel_div <= "00"; start_div <= '0'; sel_square <= "00"; load <= '0'; sel_XA <= "00"; en_XA <= '0'; sel_XB <= "00"; en_XB <= '0'; sel_ZA <= "00"; en_ZA <= '0'; en_ZB <= '0'; en_T1 <= '0'; en_T2 <= '0'; shift <= '0'; done <= '0'; when 4 => sel_A <= "000"; sel_B <= "00"; sel_c <= "11"; start_mult <= '0'; sel_div <= "00"; start_div <= '0'; sel_square <= "00"; load <= '0'; sel_XA <= "00"; en_XA <= '0'; sel_XB <= "00"; en_XB <= '0'; sel_ZA <= "00"; en_ZA <= '0'; en_ZB <= '0'; en_T1 <= '0'; en_T2 <= '0'; shift <= '0'; done <= '0'; when 5 => sel_A <= "000"; sel_B <= "00"; sel_c <= "11"; start_mult <= '0'; sel_div <= "00"; start_div <= '0'; sel_square <= "00"; load <= '0'; sel_XA <= "00"; en_XA <= '0'; sel_XB <= "00"; en_XB <= '0'; sel_ZA <= "00"; en_ZA <= '0'; en_ZB <= '0'; en_T1 <= '1'; en_T2 <= '0'; shift <= '0'; done <= '0'; when 6 => sel_A <= "001"; sel_B <= "01"; sel_c <= "11"; start_mult <= '1'; sel_div <= "00"; start_div <= '0'; sel_square <= "00"; load <= '0'; sel_XA <= "00"; en_XA <= '0'; sel_XB <= "00"; en_XB <= '0'; sel_ZA <= "00"; en_ZA <= '0'; en_ZB <= '0'; en_T1 <= '0'; en_T2 <= '0'; shift <= '0'; done <= '0'; when 7 => sel_A <= "001"; sel_B <= "01"; sel_c <= "11"; start_mult <= '0'; sel_div <= "00"; start_div <= '0'; sel_square <= "00"; load <= '0'; sel_XA <= "00"; en_XA <= '0'; sel_XB <= "00"; en_XB <= '0'; sel_ZA <= "00"; en_ZA <= '0'; en_ZB <= '0'; en_T1 <= '0'; en_T2 <= '0'; shift <= '0'; done <= '0'; when 8 => sel_A <= "001"; sel_B <= "01"; sel_c <= "11"; start_mult <= '0'; sel_div <= "00"; start_div <= '0'; sel_square <= "00"; load <= '0'; sel_XA <= "00"; en_XA <= '0'; sel_XB <= "00"; en_XB <= '0'; sel_ZA <= "00"; en_ZA <= '0'; en_ZB <= '0'; en_T1 <= '0'; en_T2 <= '1'; shift <= '0'; done <= '0'; when 9 => sel_A <= "001"; sel_B <= "01"; sel_c <= "11"; start_mult <= '0'; sel_div <= "00"; start_div <= '0'; sel_square <= "10"; load <= '0'; sel_XA <= "00"; en_XA <= '0'; sel_XB <= "00"; en_XB <= '0'; sel_ZA <= "00"; en_ZA <= '0'; en_ZB <= '1'; en_T1 <= '0'; en_T2 <= '0'; shift <= '0'; done <= '0'; when 10 => sel_A <= "010"; sel_B <= "00"; sel_c <= "11"; start_mult <= '1'; sel_div <= "00"; start_div <= '0'; sel_square <= "10"; load <= '0'; sel_XA <= "00"; en_XA <= '0'; sel_XB <= "00"; en_XB <= '0'; sel_ZA <= "00"; en_ZA <= '0'; en_ZB <= '0'; en_T1 <= '0'; en_T2 <= '0'; shift <= '0'; done <= '0'; when 11 => sel_A <= "010"; sel_B <= "00"; sel_c <= "11"; start_mult <= '0'; sel_div <= "00"; start_div <= '0'; sel_square <= "10"; load <= '0'; sel_XA <= "00"; en_XA <= '0'; sel_XB <= "00"; en_XB <= '0'; sel_ZA <= "00"; en_ZA <= '0'; en_ZB <= '0'; en_T1 <= '0'; en_T2 <= '0'; shift <= '0'; done <= '0'; when 12 => sel_A <= "010"; sel_B <= "00"; sel_c <= "11"; start_mult <= '0'; sel_div <= "00"; start_div <= '0'; sel_square <= "10"; load <= '0'; sel_XA <= "00"; en_XA <= '0'; sel_XB <= "00"; en_XB <= '1'; sel_ZA <= "00"; en_ZA <= '0'; en_ZB <= '0'; en_T1 <= '0'; en_T2 <= '0'; shift <= '0'; done <= '0'; when 13 => sel_A <= "011"; sel_B <= "10"; sel_c <= "00"; start_mult <= '1'; sel_div <= "00"; start_div <= '0'; sel_square <= "10"; load <= '0'; sel_XA <= "00"; en_XA <= '0'; sel_XB <= "00"; en_XB <= '0'; sel_ZA <= "00"; en_ZA <= '0'; en_ZB <= '0'; en_T1 <= '0'; en_T2 <= '0'; shift <= '0'; done <= '0'; when 14 => sel_A <= "011"; sel_B <= "10"; sel_c <= "00"; start_mult <= '0'; sel_div <= "00"; start_div <= '0'; sel_square <= "10"; load <= '0'; sel_XA <= "00"; en_XA <= '0'; sel_XB <= "00"; en_XB <= '0'; sel_ZA <= "00"; en_ZA <= '0'; en_ZB <= '0'; en_T1 <= '0'; en_T2 <= '0'; shift <= '0'; done <= '0'; when 15 => sel_A <= "011"; sel_B <= "10"; sel_c <= "00"; start_mult <= '0'; sel_div <= "00"; start_div <= '0'; sel_square <= "10"; load <= '0'; sel_XA <= "00"; en_XA <= '0'; sel_XB <= "00"; en_XB <= '1'; sel_ZA <= "00"; en_ZA <= '0'; en_ZB <= '0'; en_T1 <= '0'; en_T2 <= '0'; shift <= '0'; done <= '0'; when 16 => sel_A <= "000"; sel_B <= "01"; sel_c <= "11"; start_mult <= '1'; sel_div <= "00"; start_div <= '0'; sel_square <= "10"; load <= '0'; sel_XA <= "00"; en_XA <= '0'; sel_XB <= "00"; en_XB <= '0'; sel_ZA <= "00"; en_ZA <= '0'; en_ZB <= '0'; en_T1 <= '0'; en_T2 <= '0'; shift <= '0'; done <= '0'; when 17 => sel_A <= "000"; sel_B <= "01"; sel_c <= "11"; start_mult <= '0'; sel_div <= "00"; start_div <= '0'; sel_square <= "10"; load <= '0'; sel_XA <= "00"; en_XA <= '0'; sel_XB <= "00"; en_XB <= '0'; sel_ZA <= "00"; en_ZA <= '0'; en_ZB <= '0'; en_T1 <= '0'; en_T2 <= '0'; shift <= '0'; done <= '0'; when 18 => sel_A <= "000"; sel_B <= "01"; sel_c <= "11"; start_mult <= '0'; sel_div <= "00"; start_div <= '0'; sel_square <= "10"; load <= '0'; sel_XA <= "00"; en_XA <= '0'; sel_XB <= "00"; en_XB <= '0'; sel_ZA <= "00"; en_ZA <= '0'; en_ZB <= '0'; en_T1 <= '1'; en_T2 <= '0'; shift <= '0'; done <= '0'; when 19 => sel_A <= "000"; sel_B <= "01"; sel_c <= "11"; start_mult <= '0'; sel_div <= "00"; start_div <= '0'; sel_square <= "00"; load <= '0'; sel_XA <= "00"; en_XA <= '1'; sel_XB <= "00"; en_XB <= '0'; sel_ZA <= "00"; en_ZA <= '0'; en_ZB <= '0'; en_T1 <= '0'; en_T2 <= '0'; shift <= '0'; done <= '0'; when 20 => sel_A <= "000"; sel_B <= "01"; sel_c <= "11"; start_mult <= '0'; sel_div <= "00"; start_div <= '0'; sel_square <= "11"; load <= '0'; sel_XA <= "00"; en_XA <= '0'; sel_XB <= "00"; en_XB <= '0'; sel_ZA <= "00"; en_ZA <= '1'; en_ZB <= '0'; en_T1 <= '0'; en_T2 <= '0'; shift <= '0'; done <= '0'; --END OF FIRST PART when 21 => sel_A <= "001"; sel_B <= "01"; sel_c <= "11"; start_mult <= '0'; sel_div <= "00"; start_div <= '0'; sel_square <= "10"; load <= '0'; sel_XA <= "00"; en_XA <= '0'; sel_XB <= "00"; en_XB <= '0'; sel_ZA <= "00"; en_ZA <= '1'; en_ZB <= '0'; en_T1 <= '0'; en_T2 <= '0'; shift <= '0'; done <= '0'; when 22 => sel_A <= "010"; sel_B <= "01"; sel_c <= "11"; start_mult <= '1'; sel_div <= "00"; start_div <= '0'; sel_square <= "10"; load <= '0'; sel_XA <= "00"; en_XA <= '0'; sel_XB <= "00"; en_XB <= '0'; sel_ZA <= "00"; en_ZA <= '0'; en_ZB <= '0'; en_T1 <= '0'; en_T2 <= '0'; shift <= '0'; done <= '0'; when 23 => sel_A <= "010"; sel_B <= "01"; sel_c <= "11"; start_mult <= '0'; sel_div <= "00"; start_div <= '0'; sel_square <= "10"; load <= '0'; sel_XA <= "00"; en_XA <= '0'; sel_XB <= "00"; en_XB <= '0'; sel_ZA <= "00"; en_ZA <= '0'; en_ZB <= '0'; en_T1 <= '0'; en_T2 <= '0'; shift <= '0'; done <= '0'; when 24 => sel_A <= "010"; sel_B <= "01"; sel_c <= "11"; start_mult <= '0'; sel_div <= "00"; start_div <= '0'; sel_square <= "10"; load <= '0'; sel_XA <= "01"; en_XA <= '1'; sel_XB <= "00"; en_XB <= '0'; sel_ZA <= "00"; en_ZA <= '0'; en_ZB <= '0'; en_T1 <= '0'; en_T2 <= '0'; shift <= '0'; done <= '0'; when 25 => sel_A <= "011"; sel_B <= "10"; sel_c <= "01"; start_mult <= '1'; sel_div <= "00"; start_div <= '0'; sel_square <= "10"; load <= '0'; sel_XA <= "00"; en_XA <= '0'; sel_XB <= "00"; en_XB <= '0'; sel_ZA <= "00"; en_ZA <= '0'; en_ZB <= '0'; en_T1 <= '0'; en_T2 <= '0'; shift <= '0'; done <= '0'; when 26 => sel_A <= "011"; sel_B <= "10"; sel_c <= "01"; start_mult <= '0'; sel_div <= "00"; start_div <= '0'; sel_square <= "10"; load <= '0'; sel_XA <= "00"; en_XA <= '0'; sel_XB <= "00"; en_XB <= '0'; sel_ZA <= "00"; en_ZA <= '0'; en_ZB <= '0'; en_T1 <= '0'; en_T2 <= '0'; shift <= '0'; done <= '0'; when 27 => sel_A <= "011"; sel_B <= "10"; sel_c <= "01"; start_mult <= '0'; sel_div <= "00"; start_div <= '0'; sel_square <= "10"; load <= '0'; sel_XA <= "01"; en_XA <= '1'; sel_XB <= "00"; en_XB <= '0'; sel_ZA <= "00"; en_ZA <= '0'; en_ZB <= '0'; en_T1 <= '0'; en_T2 <= '0'; shift <= '0'; done <= '0'; when 28 => sel_A <= "001"; sel_B <= "00"; sel_c <= "11"; start_mult <= '1'; sel_div <= "00"; start_div <= '0'; sel_square <= "10"; load <= '0'; sel_XA <= "00"; en_XA <= '0'; sel_XB <= "00"; en_XB <= '0'; sel_ZA <= "00"; en_ZA <= '0'; en_ZB <= '0'; en_T1 <= '0'; en_T2 <= '0'; shift <= '0'; done <= '0'; when 29 => sel_A <= "001"; sel_B <= "00"; sel_c <= "11"; start_mult <= '0'; sel_div <= "00"; start_div <= '0'; sel_square <= "10"; load <= '0'; sel_XA <= "00"; en_XA <= '0'; sel_XB <= "00"; en_XB <= '0'; sel_ZA <= "00"; en_ZA <= '0'; en_ZB <= '0'; en_T1 <= '0'; en_T2 <= '0'; shift <= '0'; done <= '0'; when 30 => sel_A <= "001"; sel_B <= "00"; sel_c <= "11"; start_mult <= '0'; sel_div <= "00"; start_div <= '0'; sel_square <= "10"; load <= '0'; sel_XA <= "00"; en_XA <= '0'; sel_XB <= "00"; en_XB <= '0'; sel_ZA <= "00"; en_ZA <= '0'; en_ZB <= '0'; en_T1 <= '1'; en_T2 <= '0'; shift <= '0'; done <= '0'; when 31 => sel_A <= "001"; sel_B <= "00"; sel_c <= "11"; start_mult <= '0'; sel_div <= "00"; start_div <= '0'; sel_square <= "01"; load <= '0'; sel_XA <= "00"; en_XA <= '0'; sel_XB <= "01"; en_XB <= '1'; sel_ZA <= "00"; en_ZA <= '0'; en_ZB <= '0'; en_T1 <= '0'; en_T2 <= '0'; shift <= '0'; done <= '0'; when 32 => sel_A <= "001"; sel_B <= "00"; sel_c <= "11"; start_mult <= '0'; sel_div <= "00"; start_div <= '0'; sel_square <= "11"; load <= '0'; sel_XA <= "00"; en_XA <= '0'; sel_XB <= "00"; en_XB <= '0'; sel_ZA <= "00"; en_ZA <= '0'; en_ZB <= '1'; en_T1 <= '0'; en_T2 <= '0'; shift <= '0'; done <= '0'; --END OF SECOND PART when 33 => sel_A <= "001"; sel_B <= "00"; sel_c <= "11"; start_mult <= '0'; sel_div <= "00"; start_div <= '0'; sel_square <= "11"; load <= '0'; sel_XA <= "00"; en_XA <= '0'; sel_XB <= "00"; en_XB <= '0'; sel_ZA <= "00"; en_ZA <= '0'; en_ZB <= '0'; en_T1 <= '0'; en_T2 <= '0'; shift <= '1'; done <= '0'; when 34 => sel_A <= "001"; sel_B <= "00"; sel_c <= "11"; start_mult <= '0'; sel_div <= "00"; start_div <= '0'; sel_square <= "11"; load <= '0'; sel_XA <= "10"; en_XA <= '1'; sel_XB <= "00"; en_XB <= '0'; sel_ZA <= "01"; en_ZA <= '1'; en_ZB <= '0'; en_T1 <= '0'; en_T2 <= '0'; shift <= '0'; done <= '0'; when 35 => sel_A <= "001"; sel_B <= "00"; sel_c <= "11"; start_mult <= '0'; sel_div <= "00"; start_div <= '1'; sel_square <= "11"; load <= '0'; sel_XA <= "10"; en_XA <= '0'; sel_XB <= "00"; en_XB <= '0'; sel_ZA <= "01"; en_ZA <= '0'; en_ZB <= '0'; en_T1 <= '0'; en_T2 <= '0'; shift <= '0'; done <= '0'; when 36 => sel_A <= "001"; sel_B <= "00"; sel_c <= "11"; start_mult <= '0'; sel_div <= "00"; start_div <= '0'; sel_square <= "11"; load <= '0'; sel_XA <= "10"; en_XA <= '0'; sel_XB <= "00"; en_XB <= '0'; sel_ZA <= "01"; en_ZA <= '0'; en_ZB <= '0'; en_T1 <= '0'; en_T2 <= '0'; shift <= '0'; done <= '0'; when 37 => sel_A <= "001"; sel_B <= "00"; sel_c <= "11"; start_mult <= '0'; sel_div <= "00"; start_div <= '0'; sel_square <= "11"; load <= '0'; sel_XA <= "11"; en_XA <= '1'; sel_XB <= "00"; en_XB <= '0'; sel_ZA <= "01"; en_ZA <= '0'; en_ZB <= '0'; en_T1 <= '0'; en_T2 <= '0'; shift <= '0'; done <= '0'; when 38 => sel_A <= "001"; sel_B <= "00"; sel_c <= "11"; start_mult <= '0'; sel_div <= "01"; start_div <= '1'; sel_square <= "11"; load <= '0'; sel_XA <= "10"; en_XA <= '0'; sel_XB <= "00"; en_XB <= '0'; sel_ZA <= "01"; en_ZA <= '0'; en_ZB <= '0'; en_T1 <= '0'; en_T2 <= '0'; shift <= '0'; done <= '0'; when 39 => sel_A <= "001"; sel_B <= "00"; sel_c <= "11"; start_mult <= '0'; sel_div <= "01"; start_div <= '0'; sel_square <= "11"; load <= '0'; sel_XA <= "10"; en_XA <= '0'; sel_XB <= "00"; en_XB <= '0'; sel_ZA <= "01"; en_ZA <= '0'; en_ZB <= '0'; en_T1 <= '0'; en_T2 <= '0'; shift <= '0'; done <= '0'; when 40 => sel_A <= "001"; sel_B <= "00"; sel_c <= "11"; start_mult <= '0'; sel_div <= "01"; start_div <= '0'; sel_square <= "11"; load <= '0'; sel_XA <= "11"; en_XA <= '0'; sel_XB <= "10"; en_XB <= '1'; sel_ZA <= "01"; en_ZA <= '0'; en_ZB <= '0'; en_T1 <= '0'; en_T2 <= '0'; shift <= '0'; done <= '0'; when 41 => sel_A <= "100"; sel_B <= "11"; sel_c <= "10"; start_mult <= '1'; sel_div <= "01"; start_div <= '0'; sel_square <= "11"; load <= '0'; sel_XA <= "10"; en_XA <= '0'; sel_XB <= "00"; en_XB <= '0'; sel_ZA <= "01"; en_ZA <= '0'; en_ZB <= '0'; en_T1 <= '0'; en_T2 <= '0'; shift <= '0'; done <= '0'; when 42 => sel_A <= "100"; sel_B <= "11"; sel_c <= "10"; start_mult <= '0'; sel_div <= "01"; start_div <= '0'; sel_square <= "11"; load <= '0'; sel_XA <= "10"; en_XA <= '0'; sel_XB <= "00"; en_XB <= '0'; sel_ZA <= "01"; en_ZA <= '0'; en_ZB <= '0'; en_T1 <= '0'; en_T2 <= '0'; shift <= '0'; done <= '0'; when 43 => sel_A <= "100"; sel_B <= "11"; sel_c <= "10"; start_mult <= '0'; sel_div <= "01"; start_div <= '0'; sel_square <= "11"; load <= '0'; sel_XA <= "10"; en_XA <= '0'; sel_XB <= "00"; en_XB <= '0'; sel_ZA <= "10"; en_ZA <= '1'; en_ZB <= '0'; en_T1 <= '0'; en_T2 <= '0'; shift <= '0'; done <= '0'; when 44 => sel_A <= "100"; sel_B <= "01"; sel_c <= "11"; start_mult <= '1'; sel_div <= "01"; start_div <= '0'; sel_square <= "11"; load <= '0'; sel_XA <= "10"; en_XA <= '0'; sel_XB <= "00"; en_XB <= '0'; sel_ZA <= "01"; en_ZA <= '0'; en_ZB <= '0'; en_T1 <= '0'; en_T2 <= '0'; shift <= '0'; done <= '0'; when 45 => sel_A <= "100"; sel_B <= "01"; sel_c <= "11"; start_mult <= '0'; sel_div <= "01"; start_div <= '0'; sel_square <= "11"; load <= '0'; sel_XA <= "10"; en_XA <= '0'; sel_XB <= "00"; en_XB <= '0'; sel_ZA <= "01"; en_ZA <= '0'; en_ZB <= '0'; en_T1 <= '0'; en_T2 <= '0'; shift <= '0'; done <= '0'; when 46 => sel_A <= "100"; sel_B <= "01"; sel_c <= "11"; start_mult <= '0'; sel_div <= "01"; start_div <= '0'; sel_square <= "11"; load <= '0'; sel_XA <= "10"; en_XA <= '0'; sel_XB <= "00"; en_XB <= '0'; sel_ZA <= "10"; en_ZA <= '1'; en_ZB <= '0'; en_T1 <= '0'; en_T2 <= '0'; shift <= '0'; done <= '0'; when 47 => sel_A <= "100"; sel_B <= "01"; sel_c <= "10"; start_mult <= '0'; sel_div <= "10"; start_div <= '1'; sel_square <= "11"; load <= '0'; sel_XA <= "10"; en_XA <= '0'; sel_XB <= "00"; en_XB <= '0'; sel_ZA <= "01"; en_ZA <= '0'; en_ZB <= '0'; en_T1 <= '0'; en_T2 <= '0'; shift <= '0'; done <= '0'; when 48 => sel_A <= "100"; sel_B <= "01"; sel_c <= "10"; start_mult <= '0'; sel_div <= "10"; start_div <= '0'; sel_square <= "11"; load <= '0'; sel_XA <= "10"; en_XA <= '0'; sel_XB <= "00"; en_XB <= '0'; sel_ZA <= "01"; en_ZA <= '0'; en_ZB <= '0'; en_T1 <= '0'; en_T2 <= '0'; shift <= '0'; done <= '0'; when others => sel_A <= "100"; sel_B <= "01"; sel_c <= "10"; start_mult <= '0'; sel_div <= "10"; start_div <= '0'; sel_square <= "11"; load <= '0'; sel_XA <= "10"; en_XA <= '0'; sel_XB <= "00"; en_XB <= '0'; sel_ZA <= "11"; en_ZA <= '1'; en_ZB <= '0'; en_T1 <= '0'; en_T2 <= '0'; shift <= '0'; done <= '0'; end case; if reset = '1' then current_state <= 0; elsif clk'event and clk = '1' then case current_state is when 0 => if start = '0' then current_state <= 1; end if; when 1 => if start = '1' then current_state <= 2; end if; when 2 => current_state <= 3; when 3 => current_state <= 4; when 4 => if mult_done = '1' then current_state <= 5; end if; when 5 => current_state <= 6; when 6 => current_state <= 7; when 7 => if mult_done = '1' then current_state <= 8; end if; when 8 => if internal_k(M-1) = '0' then current_state <= 9; else current_state <= 21; end if; when 9 => current_state <= 10; when 10 => current_state <= 11; when 11 => if mult_done = '1' then current_state <= 12; end if; when 12 => current_state <= 13; when 13 => current_state <= 14; when 14 => if mult_done = '1' then current_state <= 15; end if; when 15 => current_state <= 16; when 16 => current_state <= 17; when 17 => if mult_done = '1' then current_state <= 18; end if; when 18 => current_state <= 19; when 19 => current_state <= 20; when 20 => if count < M-1 then current_state <= 33; elsif infinity = '1' then current_state <= 34; else current_state <= 35; end if; when 21 => current_state <= 22; when 22 => current_state <= 23; when 23 => if mult_done = '1' then current_state <= 24; end if; when 24 => current_state <= 25; when 25 => current_state <= 26; when 26 => if mult_done = '1' then current_state <= 27; end if; when 27 => current_state <= 28; when 28 => current_state <= 29; when 29 => if mult_done = '1' then current_state <= 30; end if; when 30 => current_state <= 31; when 31 => current_state <= 32; when 32 => if count < M-1 then current_state <= 33; elsif infinity = '1' then current_state <= 34; else current_state <= 35; end if; when 33 => current_state <= 3; when 34 => current_state <= 0; when 35 => current_state <= 36; when 36 => if div_done = '1' then current_state <= 37; end if; when 37 => current_state <= 38; when 38 => current_state <= 39; when 39 => if div_done = '1' then current_state <= 40; end if; when 40 => current_state <= 41; when 41 => current_state <= 42; when 42 => if mult_done = '1' then current_state <= 43; end if; when 43 => current_state <= 44; when 44 => current_state <= 45; when 45 => if mult_done = '1' then current_state <= 46; end if; when 46 => current_state <= 47; when 47 => current_state <= 48; when 48 => if div_done = '1' then current_state <= 49; end if; when others => current_state <= 0; end case; end if; end process; end circuit;