这是本人分立元件实现4bit alu计划的一部分。计划采用74hc00实现,元件已经在路上了
对于4位无符号整数除法,除数 B 的取值范围为 [0, 15]。根据 B 的最高两位 B[3:2],可将有效除数划分为三个不相交的区间:
区间 I (8 ≥ B ≥ 15):此时 B ≥ 8,而被除数 A ≥ 15,故商 Q ∈{0, 1}。判定条件简化为单次比较运算 Q = (A ≥ B)。
区间 II (4 ≥ B ≥ 7):此时 B≥ 4,商 Q ≤ 15/4 = 3,即 Q 仅需2位有效表示。该区间内的除法可转化为对阈值 2B 和 3B 的比较运算,无需执行通用减法。
区间 III (1 ≥ B ≥ 3):此时商 Q \le 15,需要完整的4位精度。该区间采用恢复余数法,但由于 B 的取值仅有3种可能(1、2、3),每一级试商对应的减数(8B, 4B, 2B, B)均为已知常量的小倍数,因此减法运算可针对特定移位量进行逻辑化简,避免使用通用全加器。
全局反相 (8)
```text
1. nA0=A0↑A0 2. nA1=A1↑A1 3. nA2=A2↑A2 4. nA3=A3↑A3
5. nB0=B0↑B0 6. nB1=B1↑B1 7. nB2=B2↑B2 8. nB3=B3↑B3
```
除零 (5)
```text
9. t01=nB0↑nB1 10. t23=nB2↑nB3 11. t01n=t01↑t01 12. t23n=t23↑t23 13. B_nz=t01n↑t23n
```
4 位比较器 A≥B (22)
```text
14. LowGE0=nA0↑B0 15. T10=A1↑nB1 16. N10=A1↑B1 17. N20=A1↑N10 18. N30=B1↑N10
19. D0=N20↑N30 20. nD0=D0↑D0 21. T20=nD0↑LowGE0 22. GE_lo=T10↑T20
23. LowGE1=nA2↑B2 24. T11=A3↑nB3 25. N11=A3↑B3 26. N21=A3↑N11 27. N31=B3↑N11
28. D1=N21↑N31 29. nD1=D1↑D1 30. T21=nD1↑LowGE1 31. GE_hi=T11↑T21
32. nGE_lo=GE_lo↑GE_lo 33. t_or=nD1↑nGE_lo 34. t_and=GE_hi↑t_or 35. GE=t_and↑t_and
```
分支 1 (0)
Q3_1=GND Q2_1=GND Q1_1=GND Q0_1=GE
分支 2 (39)
```text
36. t1_2B=A2↑B1 37. t2_2B=nA2↑nB1 38. eq_2B=t1_2B↑t2_2B 39. ge_lo_2B=nA1↑B0
40. t3_2B=eq_2B↑ge_lo_2B 41. t4_2B=A2↑nB1 42. GE_2B_l=t3_2B↑t4_2B
43. t_q1=A3↑GE_2B_l 44. q1_2=t_q1↑t_q1
45. L_B=nA0↑B0 46. N1_B=A1↑B1 47. N2_B=A1↑N1_B 48. N3_B=B1↑N1_B
49. D_B=N2_B↑N3_B 50. nD_B=D_B↑D_B 51. T_B=nD_B↑L_B 52. GT_B=A1↑nB1
53. GE_B_l=GT_B↑T_B 54. t_andA2=A2↑GE_B_l 55. ge_B=nA3↑t_andA2
56. t_y1a=B1↑B0 57. t_y1b=B1↑t_y1a 58. t_y1c=B0↑t_y1a 59. Y1=t_y1b↑t_y1c
60. t_y2=B1↑B0 61. Y2=t_y2↑t_y2
62. L_3B=nA0↑B0 63. N1_3B=A1↑Y1 64. N2_3B=A1↑N1_3B 65. N3_3B=Y1↑N1_3B
66. D_3B=N2_3B↑N3_3B 67. nD_3B=D_3B↑D_3B 68. T1_3B=nD_3B↑L_3B
69. GT_3B=A2↑t_y2 70. GE_3B_l=GT_3B↑T1_3B
71. t_en3B=GE_3B_l↑nB1 72. GE_3B_en=t_en3B↑t_en3B 73. t_ge3B=A3↑GE_3B_en 74. ge_3B=t_ge3B↑t_ge3B
75. t_mux1=q1_2↑ge_3B 76. t_mux0=t_q1↑ge_B 77. q0_2=t_mux0↑t_mux1
```
Q3_2=GND Q2_2=GND Q1_2=q1_2 Q0_2=q0_2
分支 3 (86)
```text
// Level 1 (6)
78. t1_3=nB1↑B0 79. B_eq1=t1_3↑t1_3 80. q3_r=B_eq1↑A3 81. q3_3=q3_r↑q3_r
82. R1_3r=A3↑q3_r 83. R1_3=R1_3r↑R1_3r
// Level 2 (27)
84. Low_GE2=nA2↑B0 85. Term1_2=R1_3↑nB1 86. N1_2=R1_3↑B1 87. N2_2=R1_3↑N1_2 88. N3_2=B1↑N1_2
89. Diff_2=N2_2↑N3_2 90. nDiff_2=Diff_2↑Diff_2 91. Term2_2=nDiff_2↑Low_GE2 92. q2_3=Term1_2↑Term2_2
93. nq2_3=q2_3↑q2_3 94. tY0_2=B0↑q2_3 95. Yp0_2=tY0_2↑tY0_2
96. u1_2=A2↑Yp0_2 97. u2_2=nA2↑tY0_2 98. R2_2=u1_2↑u2_2
99. Cin_r2=nA2↑Yp0_2 100. Cin_2=Cin_r2↑Cin_r2 101. tY1_2=B1↑q2_3 102. Yp1_2=tY1_2↑tY1_2
103. v1_2=R1_3↑Yp1_2 104. nR1_3=R1_3↑R1_3 105. v2_2=nR1_3↑tY1_2
106. X1xor_2=v1_2↑v2_2 107. nX1xor2=X1xor_2↑X1xor_2 108. w1_2=X1xor_2↑Cin_2 109. w2_2=nX1xor2↑Cin_r2 110. R2_3=w1_2↑w2_2
// Level 3 (23)
111. Low_GE3=nA1↑B0 112. Term1_3=R2_2↑nB1 113. N1_3=R2_2↑B1 114. N2_3=R2_2↑N1_3 115. N3_3=B1↑N1_3
116. Diff_3=N2_3↑N3_3 117. nDiff_3=Diff_3↑Diff_3 118. Term2_3=nDiff_3↑Low_GE3 119. GE_low3=Term1_3↑Term2_3
120. nR2_3=R2_3↑R2_3 121. nGE_l3=GE_low3↑GE_low3 122. q1_3=nR2_3↑nGE_l3
123. nq1_3=q1_3↑q1_3 124. tY0_3=B0↑q1_3 125. Yp0_3=tY0_3↑tY0_3
126. u1_3=A1↑Yp0_3 127. u2_3=nA1↑tY0_3 128. R3_1=u1_3↑u2_3
129. Cin_r3=nA1↑Yp0_3 130. Cin_3=Cin_r3↑Cin_r3 131. tY1_3=B1↑q1_3 132. Yp1_3=tY1_3↑tY1_3
133. v1_3=R2_2↑Yp1_3 134. nR2_2=R2_2↑R2_2 135. v2_3=nR2_2↑tY1_3
136. X1xor_3=v1_3↑v2_3 137. nX1xor3=X1xor_3↑X1xor_3 138. w1_3=X1xor_3↑Cin_3 139. w2_3=nX1xor3↑Cin_r3 140. R3_2=w1_3↑w2_3
// Level 4 (11)
141. Low_GE4=nA0↑B0 142. Term1_4=R3_1↑nB1 143. N1_4=R3_1↑B1 144. N2_4=R3_1↑N1_4 145. N3_4=B1↑N1_4
146. Diff_4=N2_4↑N3_4 147. nDiff_4=Diff_4↑Diff_4 148. Term2_4=nDiff_4↑Low_GE4 149. GE_low4=Term1_4↑Term2_4
150. nR3_2=R3_2↑R3_2 151. nGE_l4=GE_low4↑GE_low4 152. q0_3r=nR3_2↑nGE_l4
// 除零掩码 (8)
153. t_q3m=q3_3↑B_nz 154. q3_3m=t_q3m↑t_q3m 155. t_q2m=q2_3↑B_nz 156. q2_3m=t_q2m↑t_q2m
157. t_q1m=q1_3↑B_nz 158. q1_3m=t_q1m↑t_q1m 159. t_q0m=q0_3r↑B_nz 160. q0_3m=t_q0m↑t_q0m
```
Q3_3=q3_3m Q2_3=q2_3m Q1_3=q1_3m Q0_3=q0_3m
控制 (3)
```text
161. t_c2=nB3↑B2 162. c2=t_c2↑t_c2 163. t_c3=nB3↑nB2 164. c3=t_c3↑t_c3
```
选择器 (16)
```text
165. t1_3s=GND↑B3 166. t2_3s=GND↑c2 167. t3_3s=Q3_3↑c3 168. t12_3s=t1_3s↑t2_3s 169. Q3=t12_3s↑t3_3s
170. t1_2s=GND↑B3 171. t2_2s=GND↑c2 172. t3_2s=Q2_3↑c3 173. t12_2s=t1_2s↑t2_2s 174. Q2=t12_2s↑t3_2s
175. t1_1s=GND↑B3 176. t2_1s=q1_2↑c2 177. t3_1s=Q1_3↑c3 178. t12_1s=t1_1s↑t2_1s 179. Q1=t12_1s↑t3_1s
180. t1_0s=GE↑B3 181. t2_0s=q0_2↑c2 182. t3_0s=Q0_3↑c3 183. t12_0s=t1_0s↑t2_0s 184. Q0=t12_0s↑t3_0s
```
---
总门数:184 个二输入 NAND。
关键路径 57 门,5V 74HC 下约 600ns,~1.6MHz。
首先想到的方法是用AM27C128之类的并口存储芯片,地址线低8位做输入,8位数据线做输出。高位地址还可以选择算法,比如A9~A8 00加法,01减法,10乘法,11除法。45ns延时,频率能做到20MHz。
这里我个人建议使用verilog+yosys进行开发,yosys可以将任意逻辑综合到全NAND设计,很方便开发也很高效
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX