Page 231 - Hardware Implementation of Finite-Field Arithmetic
P. 231

m
                             Operations over  GF (2 )—Polynomial Bases      211

                                                                      m
               Algorithm 7.23—Modified Almost Inverse Algorithm for inversion in GF(2 )
               for i in 0 .. m loop
                 v(i) := f(i); u(i) := a(i); b(i) := 0;
                 c(i) := 0; auxm(i) := 0; inv(i) := 0;
               end loop;
               b(0) := 1;
               degree_v := degreem(v);
               degree_u := degreem(u);
               aux := 0; ext := 0;
               while ext = 0 loop
                 while u(0) /= 1 loop
                   u := lshiftm(u);
                   degree_u := degree_u - 1;
                   if b(0) /= 1 then b := lshiftm(b);
                   else auxm := b; b := lshiftm(m2xvvm(b,f));
                   end if;
                 end loop;
                 ext := unitym(u);
                 if ext = 1 then inv := b; end if;
                 if degree_u < degree_v then
                   auxm := v; v := u; u := auxm;
                   aux := degree_u; degree_u := degree_v; degree_v := aux;
                   auxm := c; c := b; b := auxm;
                 end if;
                 u := m2xvvm(u,v);
                 degree_u := degreem(u);
                 b := m2xvvm(b,c);
               end loop;
                  An executable  Ada file MAIA_inversion.adb, including Algorithm
               7.23, is available at www.arithmetic-circuits.org. The corresponding
               VHDL model  MAIA_inversion.vhd has been generated. The entity
               declaration is
               entity maia_inversion is
               port (
                 A: in std_logic_vector (M-1 downto 0);
                 clk, reset, start: in std_logic;
                 Z: out std_logic_vector (M-1 downto 0);
                 done: out std_logic
               );
               end maia_inversion;
                  The VHDL architecture corresponding to the  MAIA_inversion
               follows:
               vb_comp: process(b,c,u,v,degree_u)
                 variable d: natural;
               begin
                 if U(0) = ‘0’ then
                    new_u <= ‘0’ & u(M downto 1);new_degree_u <= degree_u
                    - 1;
   226   227   228   229   230   231   232   233   234   235   236