- 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);
+ state_next <= SDONE;
+ -- anmerkung: xst (xilinx) kann folgende zeile nicht uebersetzen
+ -- > if op1 = to_signed(-2147483648, CBITS) then
+ -- darum folgende schreibweise ->
+ if op1 = x"80000000" then
+ if op2 = to_signed(10,CBITS) then
+ -- so ziemlich das boeseste was passieren kann
+ -- deswegen, weil divisor und dividend in positive
+ -- zahlen umgewandelt werden.
+ -- daher: hardcodiertes ergebnis fuer division durch 10 (fuer parser)
+ op3_next <= to_signed(-214748364,CBITS);
+ opM_next <= to_signed(8,CBITS);
+ else
+ -- sonst fehler..
+ state_next <= SERROR;
+ end if;
+ elsif (op1_var < op2_var) then
+ -- => man braucht nix grossartiges rechnen
+ op3_next <= to_signed(0,CBITS);
+ opM_next <= op1_var;
+ else
+ -- spannend! signale initialisieren fuer den naechsten schritt
+ state_next <= SDIV_SHIFT_TO_MSB;
+ laengediv_next <= (others => '0');
+ quo_next <= (others => '0');
+ op1_next <= op1_var;
+ op2_next <= op2_var;
+ sign_next <= op1(CBITS-1) xor op2(CBITS-1);
+ end if;
+ end if;
+ when SDIV_SHIFT_TO_MSB =>
+ -- shifte divisor so lange nach links, bis MSB = '1' ist
+ if op2_int(CBITS-1) = '1' then
+ state_next <= SDIV_CALC;
+ else
+ -- und mitzaehlen wie oft geshiftet wurde
+ laengediv_next <= laengediv_int + 1;
+ op2_next <= op2_int sll 1;