+ -- division implementiert nach ~hwmod/doc/division.pdf
+ tmperg := (others => '0');
+ if op2 = to_signed(0,CBITS) then
+ -- TODO: err out signal
+ done_intern <= '1';
+ else
+ -- sign check
+ op1_var := op1;
+ op2_var := op2;
+ if op1(CBITS-1) = '1' then
+ op1_var := not (op1_var + 1);
+ end if;
+ if op2(CBITS-1) = '1' then
+ op2_var := not (op2_var + 1);
+ end if;
+
+ dividend_msb_var := find_msb(op1_var)-1;
+ laengediv_var := find_msb(op2_var)-1;
+
+ aktdiv_next <= op1_var srl (dividend_msb_var - laengediv_var + 1);
+
+ div_go_calc <= '1';
+ dividend_msb_next <= dividend_msb_var;
+ laengediv_next <= laengediv_var;
+ quo_next <= (others => '0');
+ op1_next <= op1_var;
+ op2_next <= op2_var;
+ sign_next <= op1(CBITS-1) xor op2(CBITS-1);
+ end if;
+ when SDIV_CALC =>
+ tmperg := (others => '0');
+
+ if (dividend_msb - laengediv + 1) > 0 then
+ aktdiv_var := aktdiv sll 1;
+ aktdiv_var(0) := op1_int(dividend_msb - laengediv);
+
+ quo_var := quo sll 1;
+ if aktdiv_var >= op2_int then
+ quo_var(0) := '1';
+ aktdiv_var := aktdiv_var - op2_int;
+ end if;
+
+ quo_next <= quo_var;
+ aktdiv_next <= aktdiv_var;
+ dividend_msb_next <= dividend_msb;
+ laengediv_next <= laengediv + 1;
+ op1_next <= op1_int;
+ op2_next <= op2_int;
+ sign_next <= sign;
+ else
+ if sign = '1' then
+ quo_next <= (not quo) + 1;
+ else
+ quo_next <= quo;
+ end if;
+ div_calc_done <= '1';
+ end if;
+ when SDIV_DONE =>
+ tmperg := quo;