SI100B Spring 2025 EE Project

ASIC for Digital Image Processing

Tutorial 3
@Yunxiang He heyx1@shanghaitech.edu.cn
@Quanyu Chen chenqy2022@shanghaitech.edu.cn

Contents

Contents

Project tutorial 3

1. Conuter

Project tutorial 3

1.Conuter

#c

Project tutorial 3

1.Conuter

1.Conuter in Logisim

#c

2. Image I/O in Logisim

Project tutorial 3

2. Image I/O in Logisim

我们提供了两个脚本:

  • ImageToMemory.py
  • VisualizeMemory.py
  1. 使用我们所提供的脚本进行一遍完整的 Image 和 Memory 之间的交互流程

  2. 使用我们提供的脚本给Memory喂一张图片,设置一下不同databits,导出看是否会让图片质量有所损失

3. Introduction to Numbers

Project tutorial 3

3. Introduction to Numbers

在计算机中,所有数据最终都以二进制的形式存储和处理。

二进制是一种基于2的数制,仅使用两个数字—— 0 和 1 ——来表示数值。这种设计源于计算机硬件的物理特性:电子元件(如晶体管)的开关状态可以自然地对应二进制的“关”(0)和“开”(1)。二进制的高效性和与硬件的高度适配性,使其成为计算机表示数值的基础。

当然,前苏联的计算机科学家也曾提出过三进制计算机,但由于技术和经济等多方面的原因,最终没有得到广泛应用。

二进制的表示有很多种标准,包括整数、定点数、浮点数等。理解二进制的不同表示,在硬件设计中非常重要。接下来我们将会一一介绍。

Project tutorial 3

3. Introduction to Numbers

3.1. 整数:原码、反码和补码

Project tutorial 3

3. Introduction to Numbers

3.1.1. 二进制表示正整数

正整数的二进制表示是很自然的:它采用基数为2的位权计数法,每一位的权值是2的幂次方。具体来说,一个n位二进制数 (其中 为 0 或 1 )对应的十进制值为:

示例:

  • 二进制数 1011 转换为十进制:

    因此,1011₂ = 11₁₀。

计算机使用固定位数(如8位、16位、32位等)存储二进制数,高位补零以满足位数要求。例如,数字5在8位二进制中表示为 00000101。

这种表示方法简单高效,是计算机处理整数的基本方式。

Project tutorial 3

3. Introduction to Numbers

3.1.2. 二进制表示负整数(1):原码

在十进制中,我们使用正负号(+ 或 -)直接表示一个数的符号,例如 +5 和 -5。但在二进制中,计算机只能存储 0 和 1,因此需要一种特殊的编码方式来表示负数。

原码(Sign-Magnitude) 是最直观的负数表示方法:

  • 最高位作为符号位:0 表示正数,1 表示负数。
  • 剩余位表示数值部分(即绝对值的二进制形式)。

示例(以 8 位二进制为例):

  • +5 的原码:00000101(最高位 0 表示正,后7位 0000101 是5的二进制)
  • -5 的原码:10000101(最高位 1 表示负,后7位 0000101 仍是5的二进制)
Project tutorial 3

3. Introduction to Numbers

3.1.2. 二进制表示负整数(1):原码

虽然原码直观,但它存在两个主要问题:

  1. 零的表示不唯一:

    • +0:00000000
    • -0:10000000
      这会导致计算时出现歧义。
  2. 加减运算复杂:
    原码的加减法需要区分符号位和数值部分,硬件实现效率低。例如:

    • 5 + (-3) 不能直接相加,必须先比较绝对值大小,再调整符号,增加了计算复杂度。

由于这些缺陷,计算机通常采用更高效的 补码(Two's Complement) 表示负数(见下一节)。但原码仍然是理解负数表示的基础概念之一。

Project tutorial 3

3. Introduction to Numbers

3.1.3. 二进制表示负整数(2):反码

反码(Ones' Complement)是对原码的一种改进,旨在简化负数的表示和运算。它的核心思想是通过按位取反来表示负数,从而避免原码在加减法中的复杂符号处理。

  1. 正数的反码:与原码相同,最高位为 0,其余位表示数值。
    • 例如,+5 在 8 位二进制中:

      (与原码一致)

  2. 负数的反码:将对应正数的所有位按位取反(0→1,1→0),包括符号位。
    • 例如,-5 的反码计算步骤:
      • 先写出 +5 的原码:00000101
      • 所有位取反:11111010
      • 因此,-5 的反码为 11111010。
Project tutorial 3

3. Introduction to Numbers

3.1.3. 二进制表示负整数(2):反码

相对于原码,反码有一些独特的特点:

  1. 零的表示仍不唯一:+0:00000000 / -0:11111111

  2. 加减法运算的改进:
    反码的加减法可以通过循环进位(End-Around Carry)实现:直接按位相加,若最高位产生进位,需将进位加回到结果的最低位。

    • 示例:计算 5 + (-3)(8 位反码):
      • +5:00000101 (5 的反码) / -3:11111100(3 的反码)
      • 00000101 + 11111100 = (1)00000001,将进位 1 加回最低位:00000001 + 1 = 00000010(即 +2)。
  3. 硬件实现简化:
    反码的取反操作仅需简单的逻辑门电路(NOT 门),比原码的符号判断更高效。

Project tutorial 3

3. Introduction to Numbers

3.1.4. 二进制表示负整数(3):补码

补码(Two's Complement)是现代计算机系统中表示负整数的标准方式,它解决了原码和反码的缺陷(零的冗余表示和运算复杂性),同时提供了统一的加减法运算规则。

Project tutorial 3

3. Introduction to Numbers

3.1.4. 二进制表示负整数(3):补码

补码的定义

  1. 正数的补码:与原码相同,最高位为 0,其余位表示数值。
    • 例如,+5 在 8 位补码中:

      (与原码一致)

Project tutorial 3

3. Introduction to Numbers

3.1.4. 二进制表示负整数(3):补码

补码的定义
2. 负数的补码(以 -5 为例):

  • 步骤1:写出对应正数的二进制表示(符号位为 0)。——+5 原码:00000101
  • 步骤2:按位取反(得到反码)。——按位取反:11111010(反码)
  • 步骤3:对反码加 1(忽略最高位的进位)。——加 1:11111011(补码)

快速计算:从右向左找到第一个 1,保留该 1 及其右侧所有位,左侧全部取反。

  • 例如,-5 的补码:00000101 -> 11111011(第一个 1 在最低位)
Project tutorial 3

3. Introduction to Numbers

3.1.4. 二进制表示负整数(3):补码

补码的特性

  1. 唯一表示零:

    • +0 和 -0 的补码均为 00000000,解决了原码和反码的冗余问题。
  2. 符号位参与运算:

    • 最高位既是符号位,也是数值的一部分。例如,8 位补码的范围是 -128(10000000)到 +127(01111111)。
Project tutorial 3

3. Introduction to Numbers

3.1.4. 二进制表示负整数(3):补码

补码的特性
3. 加减法统一:

  • 所有运算(包括减法)均可通过补码加法实现,无需额外处理符号。
  • 示例:计算 5 - 3(相当于 5 + (-3)):
    • 5 的补码:00000101
    • -3 的补码:11111101
    • 相加:

      (忽略溢出位)(即)

  1. 溢出检测:
    • 若两个正数相加结果为负,或两个负数相加结果为正,则发生溢出。
    • 硬件实现:通过符号位和进位标志判断。
Project tutorial 3

3. Introduction to Numbers

3.1.4. 二进制表示负整数(3):补码

补码的优势

  1. 运算简化:
    • 加减法只需一套加法电路,无需区分符号(反码则需要额外处理循环进位)。
  2. 表示范围更大:
    • N 位补码可表示 -2^{N-1} 到 2^{N-1}-1,比原码和反码多一个负数(如 8 位补码的 -128)。
  3. 易于扩展:
    • 想把补码扩展到更高位数,只需要在高位补符号位(0 或 1),而原码和反码则需要复杂的符号处理。
    • 例如,8 位补码 1111 1101(-3)扩展到 16 位,结果直接为 1111 1111 1111 1101。
  4. 硬件友好:
    • 补码的取反加一操作可通过简单逻辑电路实现,适合现代处理器设计。
Project tutorial 3

3. Introduction to Numbers

3.1.4. 二进制表示负整数(3):补码

补码的数学原理
补码的本质是模运算。对于 N 位二进制,补码表示的数 x 满足:

真值

例如,-3 的 8 位补码 11111101 对应无符号数 253,因为:

这种同余关系使得加减法在模意义下自然成立。

Project tutorial 3

3. Introduction to Numbers

3.1.4. 二进制表示负整数(3):补码

补码因其运算统一性、零的唯一性和硬件高效性,成为现代计算机的整数表示标准。理解补码是掌握计算机算术的基础,尤其在底层编程(如嵌入式系统)中至关重要。

Project tutorial 3

3. Introduction to Numbers

3.2. 二进制中小数的表示

计算机系统中,小数的二进制表示主要有两种方法:定点数和浮点数。它们各有优缺点,适用于不同的计算场景。

Project tutorial 3

3. Introduction to Numbers

3.2.1. 定点数表示法(Fixed-Point Representation)

定义:
预先约定小数点的固定位置,将整数部分和小数部分分别用固定长度的二进制位表示。

核心特点:

  1. 固定格式:例如 16.8 格式表示 16 位整数 + 8 位小数。
  2. 无指数部分:所有数值的小数点位置相同。
  3. 硬件简单:可直接用整数运算单元处理(需额外移位操作)。
Project tutorial 3

3. Introduction to Numbers

3.2.1. 定点数表示法(Fixed-Point Representation)

示例(假设 8 位二进制,其中高 4 位为整数,低 4 位为小数):

  • 0011 1100 → 整数部分 0011(3),小数部分 1100(0.75)→ 值:3.75
  • 最小分辨率:小数部分 1 位 = 1/16(因 2^4=16)。

优缺点:

  • 适合处理货币、传感器数据等范围固定的场景。
  • 动态范围小,大数和小数难以兼顾(如同时表示 0.0001 和 100000.0)。
Project tutorial 3

3. Introduction to Numbers

3.2.2. 浮点数表示法(Floating-Point Representation)

定义:
基于科学计数法,用 符号位(S) + 指数位(E) + 尾数位(M) 动态表示小数点的位置。

标准格式(以 IEEE 754 为例):

类型 总位数 符号位(S) 指数位(E) 尾数位(M)
单精度浮点 32-bit 1-bit 8-bit 23-bit
双精度浮点 64-bit 1-bit 11-bit 52-bit
Project tutorial 3

3. Introduction to Numbers

3.2.2. 浮点数表示法(Floating-Point Representation)

数值计算:

  • Bias:127(单精度)或 1023(双精度),用于支持负指数。
  • 隐含的 1:尾数部分实际为 1.M(规范化数)。

优缺点:

  • 动态范围极大(单精度约 ±10^38)。
  • 存在精度损失(如 0.1 无法被浮点数所精确表示)、存在舍入误差。
Project tutorial 3

3. Introduction to Numbers

3.3. 定点数与浮点数的对比

特性 定点数 浮点数
动态范围 小(固定小数点) 大(指数动态调整)
精度 固定(取决于小数位长度) 可变(尾数位有限)
硬件成本 低(直接整数运算) 高(专用浮点运算单元)
适用场景 财务计算、嵌入式系统 科学计算、图形处理

大部分 ASIC 设计中,我们使用定点数来表示小数,因为它们的硬件实现简单且高效。本次 Project 中,我们也将使用定点数来表示小数。

Project tutorial 3

3. Introduction to Numbers

3.4. 定点数的表示和计算

Project tutorial 3

3. Introduction to Numbers

3.4.1. 定点数的表示

定义
定点数(Fixed-Point Number)通过固定小数点的位置来表示实数。其格式通常定义为 Qm.n,其中:

  • m:整数部分的二进制位数(包括符号位)
  • n:小数部分的二进制位数

编码规则

  1. 符号位:最高位(MSB)表示符号(0为正,1为负,仅限有符号数)
  2. 数值范围:
    • 无符号定点数范围:0 到 2^m - 2^-n
    • 有符号定点数范围:-2^(m-1) 到 2^(m-1) - 2^-n
  3. 分辨率:最小可表示的小数值为 2^-n
Project tutorial 3

3. Introduction to Numbers

3.4.1. 定点数的表示

示例(Q3.5 格式,8位):

  • 二进制 01011010:
    • 整数部分:010(2)
    • 小数部分:11010(0.8125)
    • 实际值:2.8125
  • 最小正数:00000001 → 0.03125(2^-5)
Project tutorial 3

3. Introduction to Numbers

3.4.2. 定点数的加法

运算规则

  1. 对齐小数点:两个操作数必须使用相同的 Qm.n 格式。
  2. 直接相加:二进制位直接相加,小数点位自动对齐。
  3. 溢出处理:结果可能超出 m+n 位表示范围,需扩展位数或饱和处理。
Project tutorial 3

3. Introduction to Numbers

3.4.2. 定点数的加法

示例(Q3.5 格式):

  • 2.5(01010000) + 1.25(00101000):
      01010000 (2.5)
    + 00101000 (1.25)
    —————————————————
      01111000 (3.75)
    
  • 若结果超出范围(如 4.0 + 4.0),会触发溢出。

注意事项:

  • 有符号数需使用补码运算。
  • 硬件实现通常依赖整数加法器。
Project tutorial 3

3. Introduction to Numbers

3.4.3. 定点数的减法

运算规则

  1. 补码转换:将减数取补码(按位取反后加1),再与被减数相加。
  2. 符号位处理:最高位为符号位,参与运算。
Project tutorial 3

3. Introduction to Numbers

3.4.3. 定点数的减法

示例(Q3.5 有符号数):

  • 2.5(01010000) - 1.25(00101000):
    1. 取 1.25 的补码:11011000(-1.25)
    2. 执行加法:
      01010000 (2.5)
    + 11011000 (-1.25)
    —————————————————
      00101000 (1.25)(忽略进位)
    

特殊情况:

  • 结果为负时,自动以补码形式存储。
  • 下溢出(结果小于最小可表示值)需特殊处理。
Project tutorial 3

3. Introduction to Numbers

3.4.4. 定点数的乘法

运算规则

  1. 全精度乘法:两个 m+n 位数相乘,结果为 2(m+n) 位。
  2. 截断与舍入:保留 m+n 位结果时需处理小数点位:
    • 乘积的小数位数为 2n,需右移 n 位对齐格式。
  3. 符号处理:有符号数使用补码乘法(如 Booth 算法)。
Project tutorial 3

3. Introduction to Numbers

3.4.4. 定点数的乘法

示例(Q3.5 无符号数):

  • 1.5(00110000) × 2.0(01000000):

    1. 整数乘法:

    00110000 × 01000000 = 0000110000000000 (48)

    1. 小数调整(右移5位):
      • 二进制:0000110000000000 → 00001100000(3.0)
      • 实际值:48 × 2^-5 = 1.5(需修正为 3.0,此处示例需调整解释)

优化方法:

  • 使用移位代替除法(如 a × b ≈ (a × b) >> n)。
  • 硬件可通过乘法器+移位器实现。
Project tutorial 3

3. Introduction to Numbers

3.4.5. 定点数运算的误差控制

  1. 扩展位数法:中间结果使用更高精度的 Q(m+k).(n+k) 格式。
  2. 饱和运算:溢出时返回最大值(如 0111...1 或 1000...0)。
  3. 舍入模式:
    • 截断(直接丢弃低位)
    • 四舍五入(加 0.5 后截断)
Project tutorial 3

3. Introduction to Numbers

3.5. 代码演示

Project tutorial 3

3. Introduction to Numbers

3.6. Tasks

  1. Implement Fixed-Point Arithmetic in Python
    请尝试在 Python 中实现一个简单的定点数类,支持加法、减法和乘法运算。

  2. Try to implement a simple fixed-point multiplier in Logisim
    请尝试在 Logisim 中实现一个简单的定点数乘法器,支持 Q8.8 格式的乘法运算。

Optional Themes: ShanghaiTech_Tutorial / NaiLoong / QYGG