计算机系统是分层方式的。这样每一层只需要关注下一层提供的接口和逻辑,不需要管下一层是如何实现的。比如当机器语言改变时,只要其提供的接口不变,那么操作系统就可以直接复用,显著降低了工作量。在此基础上,不同的人员可以同时去完成不同的工作,互不干扰。

比如说早期的机器语言并不支持乘法,这样编译器就只能通过循环加法去实现。随着技术的发展,有些任务也开始重新分配,比如说把网络协议栈从操作系统卸载到硬件网卡。

我们的目的是通过数字逻辑电路技术,搭建出实际机器,也就是能执行机器指令的物理硬件。

冯·诺依曼机

1. 数据的存储与表示

1.1 构造加法器

一个加法单元会接收 Ai,Bi,CiA_i,B_i,C_i,但是发现这样不能并行处理进位。

进位 Ci=AiBi+(Ai⊕Bi)Ci−1C_i=A_iB_i+(A_i\oplus B_i)C_{i-1},其中 Gi=AiBiG_i=A_iB_i 称为本位进位生成函数,Pi=(Ai⊕Bi)P_i=(A_i\oplus B_i) 称为进位传递函数。

我们把进位函数带入进去,就可以做到并行,或者叫做超前进位。但随着加法器字长的增加,导致 CiC_i 涵盖的逻辑项越来越多。于是采用分组进位,组间进位只和每组的最高进位有关。

注意逻辑门是有延迟的,因此芯片的时钟频率必须大于最长路径上的门延迟总和。

1.2 定点数乘法与乘法器设计

1.6 浮点数

一般采用 IEEE 754 标准,分为符号位 S、指数位 E 和尾数位 F,有:

(−1)S×1.F×2E−Bias(-1)^S \times 1.F \times 2^{E-\text{Bias}}

其中 Bias=2∣E∣−1−1\text{Bias}=2^{|E|-1}-1。

  • 规格化数(Normalized Numbers):指数不全为 00 也不全为 11。
  • 非规格化数(Subnormal Numbers):指数位全为 00,但是尾数位不为 00,此时变为 0.F0.F,因此此时 E=1E=1。
  • 无穷大:指数位全为 11,尾数位全为 00。
  • 非数值(NaN):指数位全为 11,尾数为不为 00。符号位不限制。
  • 零:指数位和尾数为全为 00。

无效运算会得到 NaN,除以零和溢出会得到无穷。


Nothing built can last forever.
本站由 iznomia 使用 Stellar 1.30.4 主题创建。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。