summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cpu/alu.ml55
-rw-r--r--cpu/os.asm20
2 files changed, 31 insertions, 44 deletions
diff --git a/cpu/alu.ml b/cpu/alu.ml
index b76133f..87cfc10 100644
--- a/cpu/alu.ml
+++ b/cpu/alu.ml
@@ -185,12 +185,12 @@ let nmulu n a b start_signal =
-let rec ndivu n a b start_signal =
+let rec ndivu n a b start_signal =
let next_busy, set_next_busy = loop 1 in
let busy = start_signal ^| (reg 1 next_busy) in
- let dd, set_dd = loop n in (* dividande *)
+ let dd, set_dd = loop n in (* dividende *)
let q , set_q = loop n in (* quotient *)
let r , set_r = loop n in (* reste *)
@@ -200,39 +200,26 @@ let rec ndivu n a b start_signal =
bien que le calcul est terminé quand c vaut 0 *)
let c , set_c = loop n in
-
-
-
-
- (* On définit la concaténée des nouvelles valeurs de dd, q, r, et c *)
-
- let ddqrc = set_dd (
+ let c = set_c (
mux start_signal
- (* A chaque nouvelle étape *)
- (
-
- (* A l'itération i (i = 0 ... n - 1) Le bit de poids fort de [dd]
- correspond au bit (n-i-1) du dividande original *)
- (shiftl1 n (reg n dd)) ++
- q ++ (* Le quotient reste pour l'instant inchangé *)
- ((dd ** (n-1)) ++ ((reg n r) % (0, n-2))) ++ (* On abaisse le bit (n-i-1) du dividande *)
- shiftl1 n c (* on décale c *)
- )
+ (shiftl1 n (reg n c))
+ ((const "0") ++ (rep (n-1) (const "1"))) ) in
- (* Initialisation *)
- ((a) ++ (zeroes n) ++ (zeroes n) ++ (rep n (const "1"))) )
- in
+ (* Initialisation de q et r *)
+ let q = mux start_signal (reg n q) (zeroes n) in
+ let r = mux start_signal (reg n r) (zeroes n) in
- let dd = set_dd (ddqrc % (0, n-1)) in
- let q' = (ddqrc % (n, 2*n-1)) in
- let r' = (ddqrc % (2*n, 3*n-1)) in
- let c = set_c (ddqrc % (3*n, 4*n-1)) in
+ (* A l'itération i (i = 0 ... n - 1) Le bit de poids fort de [dd]
+ correspond au bit (n-i-1) du dividende original *)
+ let dd = set_dd (mux start_signal (shiftl1 n (reg n dd)) a) in
-
+ (* On abaisse le bit (n-i-1) du dividende *)
+ let r = (dd ** (n-1)) ++ (r % (0, n-2)) in
+
(* Si r >= d alors r := r - d et q(n-i-1) := 1 *)
- let rq = mux (ule_n n b r')
- (r' ++ (const "0") ++ ((reg n q') % (0, n-2)))
- ((nsubber n r' b) ++ (const "1") ++ ((reg n q') % (0, n-2))) in
+ let rq = mux (ule_n n b r)
+ (r ++ ((const "0") ++ (q % (0, n-2))))
+ ((nsubber n r b) ++ ((const "1") ++ (q % (0, n-2)))) in
let r = set_r (rq % (0, n-1)) in
let q = set_q (rq % (n, 2*n-1)) in
@@ -243,18 +230,18 @@ let rec ndivu n a b start_signal =
set_next_busy (busy ^& work_remains) ^.
(not work_remains) ^& busy in
- dd ^. c ^.
+ dd ^. c ^.
q, r, finished
-
+
-(* zeroes (n-3) ++ const "110", zeroes (n-3) ++ const "110",
+(* zeroes (n-3) ++ const "110", zeroes (n-3) ++ const "110",
start_signal *)
(* TODO : unsigned division, returns quotient and remainder *)
let rec nmul n a b start_signal =
- zeroes (n-3) ++ const "101", zeroes (n-3) ++ const "101", start_signal
+ zeroes (n-3) ++ const "101", zeroes (n-3) ++ const "101", start_signal
(* TODO : signed multiplication ; returns low part and high part *)
diff --git a/cpu/os.asm b/cpu/os.asm
index 5a05661..72598c6 100644
--- a/cpu/os.asm
+++ b/cpu/os.asm
@@ -189,23 +189,23 @@ unit_test_1: # Unsigned multiplication
unit_test_2: # Unsigned division
li B 1
- li C 60
+ li C 61
li D 5
divu C C D
move D E
sei A C 12
and B B A
- se A D Z
+ sei A D 1
and B B A
- li C 14129
- li D 477
- divu C C D
- move D E
- sei A C 31
- and B B A
- sei A D 272
- and B B A
+ #li C 61
+ #li D 5
+ #divu C C D
+ #move D E
+ #sei A C 12
+ #and B B A
+ #sei A D 1
+ #and B B A
jr RA
unit_test_3: # Signed multiplication/division