# 计算机组成原理_工程实践
**Repository Path**: yy_lan/cs
## Basic Information
- **Project Name**: 计算机组成原理_工程实践
- **Description**: No description available
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 1
- **Forks**: 41
- **Created**: 2025-05-11
- **Last Updated**: 2025-06-16
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# 《计算机组成与结构》实践项目 — 总体说明
## 📅 项目基本信息
* **提交截止日期**:6月15日 12:00
* **报告时间及方式**:另行通知
* **小组人数**:每组最多3人(自由组队)
* **编程语言**:C语言(基于Windows控制台,无GUI)(建议使用Dev-C++)
* **提交方式**:打包提交代码文件(`.c`、`.h`)、可执行文件、项目说明文档(md格式或pdf格式)
* **提交通道**:另行通知
* **选题方式**:自由组队后,在共享文档中进行选题,每组选择1个题目,题目禁止重复选择。
* **注意事项**:如果对题目本身存在疑问,可以在课程群中提出。除此之外助教不会回答任何技术相关的问题,请大家自行解决,培养工程思维和Debug能力。
---
## 📦 提交内容要求
每组需提交以下材料:
1. `main.c`(主程序代码)及必要的头文件;
2. `README.md` 或说明文档(PDF),包括:
* 项目简介与功能描述;
* 核心设计结构说明;
* 各成员分工情况;
* 编译运行方法说明;
3. 可执行程序(Windows平台下可运行);
4. 示例输入输出截图;
5. 项目源代码中需含必要注释,结构清晰。
---
## 🎯 评分方式(总分 100 分)
| 评分维度 | 权重 | 说明 |
| ---------- | ---- | ---------------------- |
| 功能正确性 | 50 分 | 是否完成全部基本功能,运行无误,符合题目要求 |
| 程序结构与可读性 | 20 分 | 代码风格统一,模块划分清晰,有适当注释 |
| 扩展与挑战部分完成度 | 20 分 | 是否实现附加功能或难度加分点 |
| 项目说明文档 | 10 分 | 说明是否详尽、格式规范、结构完整 |
> 📌 注:如发现雷同、抄袭或未遵守“禁止调用现成函数”说明的行为,将严肃处理。
---
## 📋 项目题目列表(共30题)
> 📌 注:如果你对下方题目都不满意,可以自己提出课题与助教沟通,确认可用后做自己提出的课题。
| 编号 | 题目名称 | 难度 |
| -- | ------------------- | -- |
| 01 | 模拟二进制加法器 | 入门 |
| 02 | 寄存器组模拟器 | 入门 |
| 03 | ALU算术逻辑单元仿真 | 入门 |
| 04 | 十进制转二进制转换器 | 入门 |
| 05 | 指令译码器实现 | 入门 |
| 06 | 主存访问模拟器 | 入门 |
| 07 | 逻辑门电路模拟器 | 入门 |
| 08 | 字符与ASCII编码器 | 入门 |
| 09 | 简易程序计数器模拟器 | 入门 |
| 10 | 内存与寄存器交换模拟器 | 入门 |
| 11 | 浮点数二进制表示器 | 入门 |
| 12 | 反向地址访问模拟器 | 入门 |
| 13 | 数值位翻转器 | 入门 |
| 14 | 奇偶校验位计算器 | 入门 |
| 15 | 补码转换器 | 入门 |
| 16 | 十六进制计算器 | 入门 |
| 17 | 简单缓存访问模拟器 | 入门 |
| 18 | 内存对齐检测器 | 入门 |
| 19 | 32位浮点数解析器(IEEE 754) | 中等 |
| 20 | 虚拟地址页表转换模拟器 | 中等 |
| 21 | 管线冲突检测模拟器 | 中等 |
| 22 | 简易微程序控制器模拟 | 中等 |
| 23 | 定点乘法器(Booth算法) | 中等 |
| 24 | 四路组相联缓存模拟器 | 中等 |
| 25 | 寄存器组模拟器 | 中等 |
| 26 | 算术逻辑单元(ALU)模拟器 | 中等 |
| 27 | 简化版 MIPS 解释器 | 稍高 |
| 28 | 五级流水线执行器模拟(带冒泡插入) | 稍高 |
| 29 | 两级缓存一致性模拟器(MESI 协议) | 稍高 |
| 30 | 微型指令集架构设计与解释器实现 | 稍高 |
---
## **项目 1:模拟二进制加法器**
### 🔧 功能要求:
* 实现两个 **4位二进制数** 的逐位加法。
* 每一位加法需要显示进位过程。
* 所有计算必须基于位运算完成,**禁止使用C语言内置整数加法运算符(+)**。
### 🔤 输入输出样例:
```
Input A: 1011
Input B: 1101
Output:
Bit 0: 1 + 1 with carry 0 => sum: 0 carry: 1
Bit 1: 1 + 0 with carry 1 => sum: 0 carry: 1
Bit 2: 0 + 1 with carry 1 => sum: 0 carry: 1
Bit 3: 1 + 1 with carry 1 => sum: 1 carry: 1
Final Sum: 11000
```
### 👥 工作分工建议:
* 成员A:输入/输出模块设计和错误检测。
* 成员B:逐位加法逻辑实现。
* 成员C:结果整合、调试与测试脚本编写。
### 📝 评分标准:
* 功能正确性(40%)
* 位运算实现完整性(30%)
* 输入格式与边界情况处理(15%)
* 程序结构清晰度与注释质量(15%)
---
## **项目 2:寄存器组模拟器**
### 🔧 功能要求:
* 模拟8个通用寄存器(R0–R7),每个32位。
* 支持命令行输入格式:`WRITE Rx value`、`READ Rx`、`DUMP`
* 所有寄存器初始值为0。
### 🔤 输入输出样例:
```
> WRITE R2 15
> READ R2
R2 = 15
> DUMP
R0 = 0
R1 = 0
R2 = 15
...
R7 = 0
```
### 👥 工作分工建议:
* 成员A:数据结构与寄存器初始化。
* 成员B:命令解析与执行逻辑。
* 成员C:输出格式、调试与边界情况处理。
### 📝 评分标准:
* 指令处理正确率(40%)
* 存储结构设计合理性(25%)
* 交互友好性和边界处理(20%)
* 注释与程序可读性(15%)
---
## **项目 3:ALU算术逻辑单元仿真**
### 🔧 功能要求:
* 支持以下运算:ADD, SUB, AND, OR, XOR, NOT
* 操作数为8位整数,结果输出为二进制字符串
* **不得使用标准库中的`+`、`-`、`*`等运算符(必须使用位运算模拟)**
### 🔤 输入输出样例:
```
Input: 5 AND 3
Binary: 00000101 AND 00000011
Result: 00000001
Input: NOT 6
Binary: NOT 00000110
Result: 11111001
```
### 👥 工作分工建议:
* 成员A:输入解析与操作符识别。
* 成员B:逻辑运算模块(基于位运算)。
* 成员C:格式化输出、异常处理与调试。
### 📝 评分标准:
* 运算功能实现正确(40%)
* 位运算实现方式规范(30%)
* 输出格式标准化(15%)
* 注释与模块划分合理(15%)
---
## **项目 4:十进制转二进制转换器**
### 🔧 功能要求:
* 将一个带符号的十进制整数转换为8位补码形式的二进制字符串。
* 结果应带符号位,范围\[-128, 127]
* 禁止使用`itoa`、`sprintf`等字符串转换函数。
### 🔤 输入输出样例:
```
Input: -5
Output: 11111011
Input: 15
Output: 00001111
```
### 👥 工作分工建议:
* 成员A:输入验证与符号判断。
* 成员B:补码计算逻辑(特别是负数处理)。
* 成员C:结果拼接与调试。
### 📝 评分标准:
* 补码转换正确性(40%)
* 字符串构造过程合规性(25%)
* 输入范围校验与报错机制(20%)
* 结构清晰与注释完整性(15%)
---
## **项目 5:指令译码器实现**
### 🔧 功能要求:
实现一个简化的指令译码器,解析输入的16位二进制字符串形式的指令,并输出各字段的含义。具体要求如下:
1. **输入格式**:
* 输入为一个16位的二进制字符串(如 `0001001010001100`)。
* 字符串必须严格为16位,且仅包含字符 `0` 和 `1`。
* 如果输入不合法(如长度不足或包含非法字符),需提示用户重新输入。
2. **指令格式**:
* **操作码(Opcode)**:前4位(bit 0-3),表示操作类型。
* **源寄存器(Src Register)**:接下来的4位(bit 4-7),表示源寄存器编号。
* **目标寄存器(Dst Register)**:再接下来的4位(bit 8-11),表示目标寄存器编号。
* **立即数(Immediate Value)**:最后4位(bit 12-15),表示一个无符号整数。
3. **输出格式**:
* 操作码(Opcode):显示二进制值及对应的操作名称(如 `0001 (ADD)`)。
* 源寄存器(Src):显示寄存器编号(如 `R2`)。
* 目标寄存器(Dst):显示寄存器编号(如 `R8`)。
* 立即数(Immediate):显示十进制值(如 `12`)。
4. **操作码定义**:
* `0001`:ADD(加法)
* `0010`:SUB(减法)
* `0011`:AND(按位与)
* `0100`:OR(按位或)
* `0101`:XOR(按位异或)
* `0110`:LOAD(加载)
* `0111`:STORE(存储)
* 其他值:非法操作码,需提示用户。
### 🔤 输入输出样例:
```
Input: 0001001010001100
Output:
Opcode: 0001 (ADD)
Src: R2
Dst: R8
Immediate: 12
```
### 👥 工作分工建议:
* 成员A:定义指令格式及合法性检查。
* 成员B:字符串解析与字段分割。
* 成员C:解释输出与用户提示。
### 📝 评分标准:
* 字段解析准确性(40%)
* 译码规则清晰规范(30%)
* 输出整洁明了(15%)
* 程序结构与注释(15%)
---
## **项目 6:主存访问模拟器**
### 🔧 功能要求:
* 模拟一段主存(256字节),按地址访问读/写操作。
* 命令格式:`WRITE
`、`READ `
* 地址合法性需判断,支持`DUMP`内存状态。
* 禁止使用数组以外的任何高阶数据结构(如链表、库容器等)
### 🔤 输入输出样例:
```
> WRITE 10 255
> READ 10
Memory[10] = 255
> DUMP
Memory[0] = 0
...
Memory[10] = 255
...
Memory[255] = 0
```
### 👥 工作分工建议:
* 成员A:内存结构初始化与边界检测。
* 成员B:命令解析与读写逻辑。
* 成员C:结果打印模块与调试工具。
### 📝 评分标准:
* 读写操作正确性(40%)
* 边界处理与错误提示(30%)
* 数据结构实现合理性(15%)
* 程序风格与注释(15%)
---
## **项目 7:逻辑门电路模拟器**
### 🔧 功能要求:
* 使用C语言模拟基础逻辑门:AND、OR、NOT、NAND、NOR、XOR。
* 用户可输入任意两个1位二进制数和运算类型,程序返回结果。
* **不得使用`&&`、`||`等逻辑运算符,必须使用位运算(`&`, `|`, `^`, `~`)实现逻辑门功能。**
### 🔤 输入输出样例:
```
Input A: 1
Input B: 0
Operation: NAND
Result: 1
```
### 👥 工作分工建议:
* 成员A:输入校验与运算类型解析。
* 成员B:逻辑门功能实现。
* 成员C:结构整理与交互界面。
### 📝 评分标准:
* 运算功能准确(40%)
* 禁止逻辑运算符执行情况(检查实现)(25%)
* 用户输入与输出设计(20%)
* 注释与代码结构清晰(15%)
---
## **项目 8:字符与ASCII编码器**
### 🔧 功能要求:
* 用户输入字符串,程序逐字符显示其ASCII值(二进制和十进制)。
* 程序必须实现十进制到二进制转换,**禁止使用`itoa`、`sprintf`等字符串转换函数。**
### 🔤 输入输出样例:
```
Input: Hello
Output:
H => ASCII: 72 => Binary: 01001000
e => ASCII: 101 => Binary: 01100101
...
```
### 👥 工作分工建议:
* 成员A:字符读取与控制流程。
* 成员B:十进制转二进制函数实现。
* 成员C:格式化输出。
### 📝 评分标准:
* 编码提取正确(40%)
* 二进制转换函数实现规范(30%)
* 输出可读性(15%)
* 程序注释与格式规范(15%)
---
## **项目 9:简易程序计数器模拟器**
### 🔧 功能要求:
* 模拟一个8位程序计数器(PC),支持指令:INC、DEC、RESET、SET
* 初始值为0,每次操作后显示当前PC值(二进制与十进制)。
### 🔤 输入输出样例:
```
> INC
PC = 00000001 (1)
> SET 5
PC = 00000101 (5)
> DEC
PC = 00000100 (4)
```
### 👥 工作分工建议:
* 成员A:计数器结构设计。
* 成员B:指令解析与执行逻辑。
* 成员C:输出格式、测试脚本编写。
### 📝 评分标准:
* 功能正确实现(40%)
* 指令处理逻辑清晰(30%)
* 输出直观、格式统一(15%)
* 注释与模块化程度(15%)
---
## **项目 10:内存与寄存器交换模拟器**
### 🔧 功能要求:
* 模拟一个寄存器(R)和一段内存(64字节),支持命令:
* `LOAD `:将内存地址的数据读入寄存器
* `STORE `:将寄存器值写入内存地址
* 寄存器和内存初始值均为0。
### 🔤 输入输出样例:
```
> STORE 10
Memory[10] = 0
> LOAD 20
Register = 0
> STORE 20
Memory[20] = 0
```
### 👥 工作分工建议:
* 成员A:寄存器和内存结构实现。
* 成员B:命令解析与地址判断。
* 成员C:调试与用户提示实现。
### 📝 评分标准:
* 数据交换功能正确(40%)
* 地址范围控制与异常处理(30%)
* 数据一致性检查机制(15%)
* 程序结构清晰度(15%)
---
## **项目 11:浮点数二进制表示器**
### 🔧 功能要求:
* 输入一个`float`类型变量,程序打印其IEEE 754单精度二进制表示(32位)。
* 需将float转换为二进制格式,显示符号位、指数部分和尾数部分。
* **不得使用联合体(union)或标准库强制转换函数。**
### 🔤 输入输出样例:
```
Input: 3.75
Output:
Sign: 0
Exponent: 10000000
Mantissa: 11100000000000000000000
```
### 👥 工作分工建议:
* 成员A:浮点数转内存位分析设计。
* 成员B:位提取函数实现。
* 成员C:结果输出排版与测试。
### 📝 评分标准:
* IEEE格式正确提取(40%)
* 禁用union或库函数检查(25%)
* 输出格式完整(20%)
* 注释与代码结构(15%)
---
## **项目 12:反向地址访问模拟器**
### 🔧 功能要求:
* 用户输入一个正整数数组(最大10个元素),程序逆序打印数组内容,并输出其每个元素在内存中的地址。
* 必须使用指针进行访问与地址获取,**禁止使用下标(array\[i])语法。**
### 🔤 输入输出样例:
```
Input: 1 2 3 4 5
Output:
5 at address 0x123456
4 at address 0x123454
...
1 at address 0x12344C
```
### 👥 工作分工建议:
* 成员A:数组输入与存储。
* 成员B:指针逆序访问实现。
* 成员C:地址打印与输出排版。
### 📝 评分标准:
* 指针操作是否正确(40%)
* 逆序与地址对应关系准确(30%)
* 禁用数组下标实现检查(15%)
* 注释与结构整洁性(15%)
---
## **项目 13:数值位翻转器**
### 🔧 功能要求:
* 输入一个正整数(32位以内),程序将其二进制表示中的每一位进行翻转(0→1,1→0),并输出结果的十进制与二进制形式。
* 禁止使用现成的位反转函数,需自行实现。
### 🔤 输入输出样例:
```
Input: 5
Binary: 00000000000000000000000000000101
Flipped: 11111111111111111111111111111010
Decimal Result: 4294967290
```
### 👥 工作分工建议:
* 成员A:输入读取与格式控制。
* 成员B:位翻转函数实现。
* 成员C:二进制显示函数。
### 📝 评分标准:
* 位翻转准确性(40%)
* 二进制格式化输出(30%)
* 输入边界处理(15%)
* 注释与模块划分(15%)
---
## **项目 14:奇偶校验位计算器**
### 🔧 功能要求:
* 输入一个8位二进制字符串(如 "10101010"),程序输出其奇校验位和偶校验位。
* 奇校验:若1的个数为奇数,则校验位为0;为偶数,则为1(使整体为奇数个1)。
* 偶校验则反之。
### 🔤 输入输出样例:
```
Input: 11010010
Odd Parity Bit: 1
Even Parity Bit: 0
```
### 👥 工作分工建议:
* 成员A:输入合法性判断。
* 成员B:1的位计数函数。
* 成员C:输出与验证格式。
### 📝 评分标准:
* 校验位逻辑正确(40%)
* 输入判断与纠错机制(30%)
* 输出规范与测试覆盖(15%)
* 模块结构与注释清晰(15%)
---
## **项目 15:补码转换器**
### 🔧 功能要求:
* 输入一个范围在\[-128, 127]的整数,程序输出其8位补码表示。
* 要求手动实现补码生成逻辑(尤其对负数处理),禁止调用标准库的位运算封装函数。
### 🔤 输入输出样例:
```
Input: -5
Output: 11111011
```
### 👥 工作分工建议:
* 成员A:正负数识别与控制逻辑。
* 成员B:补码构造实现。
* 成员C:二进制输出格式控制。
### 📝 评分标准:
* 补码生成是否准确(40%)
* 负数边界值处理(30%)
* 输出整洁性(15%)
* 结构化与注释(15%)
---
## **项目 16:十六进制计算器**
### 🔧 功能要求:
* 用户输入两个十六进制数(如`0x1F`, `0xA3`)与一个运算符(+、-、\*、/)。
* 输出十进制结果与十六进制结果。
* 必须实现十六进制输入解析与输出格式控制。
### 🔤 输入输出样例:
```
Input: 0x1F + 0xA3
Decimal Result: 190
Hex Result: 0xBE
```
### 👥 工作分工建议:
* 成员A:输入解析(带0x前缀);
* 成员B:基本运算实现;
* 成员C:输出格式(十进制和十六进制)封装。
### 📝 评分标准:
* 运算结果准确(40%)
* 十六进制解析与输出格式规范(30%)
* 输入容错处理(15%)
* 模块与注释(15%)
---
## **项目 17:简单缓存访问模拟器**
### 🔧 功能要求:
* 模拟一个包含**8组**缓存行的直接映射Cache(地址范围0\~255)。
* 输入访问地址,输出其是否命中缓存(命中/不命中),以及所在缓存行编号。
* 每组缓存记录最后一次访问地址。
### 🔤 输入输出样例:
#### 示例 1:
```
Access Address: 34
Cache Line: 2 => Miss
Updated Cache Line 2: Address 34
Access Address: 34
Cache Line: 2 => Hit
```
### 👥 工作分工建议:
* 成员A:地址映射到行的哈希函数;
* 成员B:缓存数据结构设计;
* 成员C:访问流程与命中判断逻辑。
### 📝 评分标准:
* 命中判断准确(40%)
* 缓存行编号逻辑正确(30%)
* 输出与用户交互(15%)
* 注释与逻辑结构(15%)
---
## **项目 18:内存块对齐分析器**
### 🔧 功能要求:
实现一个程序,分析用户输入的内存块是否满足指定的对齐要求,并提供优化建议。
1. **对齐检测**:
* 用户输入一个内存块的起始地址和大小(字节数)。
* 检测该内存块是否满足以下对齐要求:
- **4字节对齐**:起始地址能被4整除。
- **8字节对齐**:起始地址能被8整除。
- **16字节对齐**:起始地址能被16整除。
2. **优化建议**:
* 如果内存块不满足对齐要求,提示需要调整的偏移量以满足对齐要求。
* 输出调整后的起始地址。
3. **输入要求**:
* 用户输入起始地址和大小,均为非负整数(假设地址范围为32位无符号整数,0~4294967295)。
* 如果输入非法(如负数或非数字),提示用户重新输入。
4. **输出要求**:
* 对每种对齐要求,输出“是”或“否”。
* 如果不满足对齐要求,输出建议的调整值。
### 🔤 输入输出样例:
#### 示例 1:
```
Input Start Address: 100
Input Block Size: 50
4-byte aligned: Yes
8-byte aligned: No
16-byte aligned: No
Suggested Adjustment: Start Address +4 (to 104)
```
#### 示例 2:
```
Input Start Address: 64
Input Block Size: 128
4-byte aligned: Yes
8-byte aligned: Yes
16-byte aligned: Yes
Suggested Adjustment: None
```
### 👥 工作分工建议:
* 成员A:输入校验与读取;
* 成员B:对齐判断逻辑(使用位与);
* 成员C:输出结果格式与测试用例。
### 📝 评分标准:
* 判断逻辑是否使用位运算(40%)
* 输出结果准确(30%)
* 程序可拓展性与结构(15%)
* 注释与整洁性(15%)
---
## **项目 19:32位浮点数解析器(IEEE 754)**
### 🔧 功能要求:
* 输入一个 32 位无符号整数(如:`0x40490FDB`),将其解释为 IEEE 754 标准的单精度浮点数。
* 显示其符号位、阶码(偏移)、尾数(含隐藏位)、最终十进制值。
* 禁止使用 `float` 或 `union` 转换方式,必须使用位运算进行解析。
### 🔤 输入输出样例:
```
Input: 0x40490FDB
Sign Bit: 0
Exponent (biased): 128
Exponent (actual): 1
Mantissa: 1.10010010000111111011011
Decimal Value: 3.14159
```
### 👥 工作分工建议:
* 成员A:输入转换与合法性判断;
* 成员B:位解析与字段提取;
* 成员C:十进制浮点值构造。
### 📝 评分标准:
* 位域提取准确(30%)
* 十进制转换逻辑清晰(30%)
* 禁用 `float` / `union` 实现(20%)
* 模块化与注释(20%)
---
## **项目 20:虚拟地址页表转换模拟器**
### 🔧 功能要求:
* 模拟一个简化的页式虚拟存储系统(假设页大小为 4KB,地址空间为 16-bit 虚拟地址)。
* 输入一个虚拟地址,输出其页号、页内偏移,并模拟转换为物理地址(通过给定页表映射)。
* 要求自行设计页表结构,不得使用数组下标做指针偏移。
### 🔤 输入输出样例:
```
Input Virtual Address: 0x2A3F
Page Number: 10
Offset: 0x03F
Mapped Frame: 5
Physical Address: 0x53F
```
### 👥 工作分工建议:
* 成员A:地址拆解与位运算;
* 成员B:页表结构与映射模拟;
* 成员C:用户输入与输出解析。
### 📝 评分标准:
* 页号和偏移计算准确(30%)
* 页表映射逻辑正确(30%)
* 地址转换结果正确(20%)
* 程序结构清晰(20%)
---
## **项目 21:管线冲突检测模拟器**
### 🔧 功能要求:
实现一个简化的五级指令流水线模拟器,支持以下功能:
1. **流水线结构**:
* 模拟五级流水线:`IF`(取指令)、`ID`(指令译码)、`EX`(执行)、`MEM`(访存)、`WB`(写回)。
* 每条指令依次经过流水线的五个阶段。
2. **冲突检测**:
* 输入一组指令序列(如 `LOAD R1, 0(R2)`,`ADD R3, R1, R4` 等)。
* 检测指令之间是否存在数据冒险(RAW,Read After Write)。
* 如果存在冲突,输出冲突的指令编号及冲突类型。
3. **冒泡插入**:
* 对于检测到的冲突,模拟插入 `NOP` 指令(冒泡)以解决冲突。
* 输出插入 `NOP` 后的流水线执行顺序。
4. **输出要求**:
* 输出每条指令的流水线执行过程(如 Gantt 图样式)。
* 输出冲突检测结果和插入 `NOP` 后的流水线状态。
### 🔤 输入输出样例:
#### 示例 1(无冲突):
```
Input Instructions:
1. LOAD R1, 0(R2)
2. ADD R3, R4, R5
Output:
No conflicts detected.
Pipeline Execution:
Cycle 1: LOAD (IF)
Cycle 2: LOAD (ID), ADD (IF)
Cycle 3: LOAD (EX), ADD (ID)
Cycle 4: LOAD (MEM), ADD (EX)
Cycle 5: LOAD (WB), ADD (MEM)
Cycle 6: ADD (WB)
```
#### 示例 2(有冲突):
```
Input Instructions:
1. LOAD R1, 0(R2)
2. ADD R3, R1, R4
3. SUB R5, R3, R6
Output:
Conflict Detected:
- Between Instruction #1 and #2 (RAW on R1)
- Between Instruction #2 and #3 (RAW on R3)
Pipeline Execution (with NOPs):
Cycle 1: LOAD (IF)
Cycle 2: LOAD (ID), NOP (IF)
Cycle 3: LOAD (EX), NOP (ID)
Cycle 4: LOAD (MEM), ADD (IF)
Cycle 5: LOAD (WB), ADD (ID), NOP (IF)
Cycle 6: ADD (EX), NOP (ID)
Cycle 7: ADD (MEM), SUB (IF)
Cycle 8: ADD (WB), SUB (ID)
Cycle 9: SUB (EX)
Cycle 10: SUB (MEM)
Cycle 11: SUB (WB)
```
### 👥 工作分工建议:
* 成员A:指令数据结构设计;
* 成员B:冲突检测算法;
* 成员C:输出格式与冒泡插入模拟。
### 📝 评分标准:
* 冲突检测逻辑正确(40%)
* 插入冒泡判断正确(30%)
* 指令输入/格式正确(15%)
* 模块注释与代码可读性(15%)
---
## **项目 22:简易微程序控制器模拟**
### 🔧 功能要求:
实现一个简易微程序控制器模拟器,支持以下功能:
1. **微程序控制器结构**:
* 模拟一个微程序控制器,包含以下核心组件:
- **微程序存储器(Microprogram ROM)**:存储微指令序列。
- **控制信号生成器**:根据微指令生成控制信号。
- **状态寄存器**:记录当前微指令的执行状态。
* 每条机器指令由一组微指令组成,微指令按时序依次执行。
2. **指令集说明**:
* 支持以下有限指令集:
- `LOAD R1, Addr`:从内存地址 `Addr` 加载数据到寄存器 `R1`。
- `STORE R1, Addr`:将寄存器 `R1` 的数据存储到内存地址 `Addr`。
- `ADD R1, R2`:将寄存器 `R1` 和 `R2` 的值相加,结果存入 `R1`。
- `SUB R1, R2`:将寄存器 `R1` 减去 `R2` 的值,结果存入 `R1`。
- `JUMP Addr`:跳转到指定的内存地址 `Addr`。
* 每条指令对应一组微操作序列。
3. **微指令执行**:
* 输入一条机器指令,程序解析指令并输出对应的微操作序列。
* 模拟微程序控制器的状态转移过程,逐步执行微指令。
4. **输出要求**:
* 输出每条机器指令对应的微操作序列。
* 输出微程序控制器的状态转移过程。
---
### 🔤 输入输出样例:
#### 示例 1(单条指令):
```
Input Instruction: ADD R1, R2
Output:
Micro-operations:
T1: MAR <- PC
T2: MDR <- M[MAR]
T3: IR <- MDR
T4: A <- R1
T5: B <- R2
T6: ALU <- A + B
T7: R1 <- ALU
/*
* State Transitions:
* Cycle 1: Fetch (MAR <- PC)
* Cycle 2: Fetch (MDR <- M[MAR])
* Cycle 3: Decode (IR <- MDR)
* Cycle 4: Execute (A <- R1, B <- R2)
* Cycle 5: Execute (ALU <- A + B)
* Cycle 6: Write Back (R1 <- ALU)
*/
```
#### 示例 2(多条指令):
```
Input Instructions: LOAD R1, 100
Output:
Micro-operations:
T1: MAR <- PC
T2: MDR <- M[MAR]
T3: IR <- MDR
T4: MAR <- 100
T5: MDR <- M[MAR]
T6: R1 <- MDR
Input Instruction: ADD R1, R2
Output:
Micro-operations:
T1: MAR <- PC
T2: MDR <- M[MAR]
T3: IR <- MDR
T4: A <- R1
T5: B <- R2
T6: ALU <- A + B
T7: R1 <- ALU
```
### 👥 工作分工建议:
* 成员A:指令解析模块;
* 成员B:微操作生成规则;
* 成员C:状态序列输出逻辑。
### 📝 评分标准:
* 微操作设计完整(40%)
* 状态转移模拟准确(30%)
* 输入解析与映射正确(20%)
* 编码规范与注释清晰(10%)
---
## **项目 23:定点乘法器(Booth算法)**
### 🔧 功能要求:
* 实现两个 8 位有符号整数的乘法,采用 Booth 算法。
* 模拟移位寄存器、乘数、被乘数、加法器、控制单元等部件的计算过程。
* 要求逐步显示各轮操作内容(如寄存器值变化),并禁止使用乘法运算符 `*`。
---
### 🔤 输入输出样例:
#### 示例 1(正数乘法):
```
Input: 3 * 6
Booth Encoding Step:
Multiplier (6): 00000110
Multiplicand (3): 00000011
Step-by-Step Execution:
Cycle 1:
Accumulator: 00000000
Multiplier: 00000110
Q-1: 0
Operation: No operation (Q0 = Q-1)
After Shift: Accumulator: 00000000, Multiplier: 00000011, Q-1: 0
Cycle 2:
Accumulator: 00000000
Multiplier: 00000011
Q-1: 0
Operation: Add Multiplicand (Q0 = 1, Q-1 = 0)
After Add: Accumulator: 00000011
After Shift: Accumulator: 00000001, Multiplier: 10000001, Q-1: 1
... (省略中间步骤)
Final Result: 18
```
#### 示例 2(负数乘法):
```
Input: -3 * 6
Booth Encoding Step:
Multiplier (6): 00000110
Multiplicand (-3): 11111101 (2's complement of 3)
Step-by-Step Execution:
Cycle 1:
Accumulator: 00000000
Multiplier: 00000110
Q-1: 0
Operation: No operation (Q0 = Q-1)
After Shift: Accumulator: 00000000, Multiplier: 00000011, Q-1: 0
Cycle 2:
Accumulator: 00000000
Multiplier: 00000011
Q-1: 0
Operation: Add Multiplicand (Q0 = 1, Q-1 = 0)
After Add: Accumulator: 11111101
After Shift: Accumulator: 11111110, Multiplier: 10000001, Q-1: 1
... (省略中间步骤)
Final Result: -18
```
### 👥 工作分工建议:
* 成员A:Booth 算法流程实现;
* 成员B:寄存器模拟与位移逻辑;
* 成员C:交互与结果输出模块。
### 📝 评分标准:
* Booth 流程实现正确(40%)
* 禁用乘法符号(20%)
* 每轮状态输出清晰(20%)
* 模块分明、注释完备(20%)
---
## **项目 24:四路组相联缓存模拟器**
### 🔧 功能要求:
* 模拟一个简化的四路组相联缓存(16组,每组4路),使用最近最少使用(LRU)替换策略。
* 支持地址访问、命中/未命中反馈,并显示缓存结构状态。
* 使用 C 结构体管理缓存,禁止使用 STL(如 C++ 的 `vector` 等)或任何动态内存分配。
---
### 🔤 输入输出样例:
#### 示例 1(命中):
```
Access Address: 0x2A4
Binary Address: 001010100100
Set Index: 10
Tag: 0x2
Result: Hit
Cache Set 10: [0x2A4, 0x1B8, 0x3C0, 0x4D2] (LRU updated)
```
#### 示例 2(未命中,替换):
```
Access Address: 0x5E0
Binary Address: 010111100000
Set Index: 14
Tag: 0x5
Result: Miss
Cache Set 14 (Before): [0x1E4, 0x2F8, 0x3A0, 0x4B2]
Replaced: 0x1E4 (Least Recently Used)
Cache Set 14 (After): [0x5E0, 0x2F8, 0x3A0, 0x4B2] (LRU updated)
```
#### 示例 3(初始状态):
```
Access Address: 0x1B8
Binary Address: 000110111000
Set Index: 6
Tag: 0x1
Result: Miss
Cache Set 6 (Before): [Empty, Empty, Empty, Empty]
Cache Set 6 (After): [0x1B8, Empty, Empty, Empty] (LRU updated)
```
### 👥 工作分工建议:
* 成员A:缓存结构定义与初始化;
* 成员B:替换策略与LRU实现;
* 成员C:交互与输出显示。
### 📝 评分标准:
* 命中/替换逻辑准确(40%)
* LRU实现完整(30%)
* 输出状态清晰(15%)
* 模块划分清楚,注释规范(15%)
---
## **项目 25:寄存器组模拟器**
### 🔧 功能要求:
* 模拟一个包含 **32个通用寄存器** 的寄存器堆,支持三操作数格式的读写(2读1写)。
* 检测并处理读写冲突(如同一条指令中对同一寄存器既读又写)。
* 输入一系列伪汇编格式语句,更新寄存器状态并输出变化。
* 所有寄存器初始值为 0,用户可通过 `LOAD` 或 `MOV` 指令为寄存器赋初值。
* 支持以下伪汇编指令格式:
- `LOAD R1, #value`:将立即数 `value` 加载到寄存器 `R1`。
- `ADD R1, R2, R3`:R1 = R2 + R3
- `SUB R4, R5, R6`:R4 = R5 - R6
- `MUL R7, R8, R9`:R7 = R8 * R9
- `DIV R10, R11, R12`:R10 = R11 / R12
* 使用字符串解析输入,提取操作码、寄存器编号和立即数。
---
### 🔤 输入输出样例:
#### 示例 1(初始化寄存器值):
```
Instruction: LOAD R2, #2
Operation: R2 = 2
Register File: [R0=0, R1=0, R2=2, R3=0, ..., R31=0]
```
#### 示例 2(基本操作):
```
Instruction: ADD R1, R2, R3
Operation: R1 = R2 + R3
Register File: [R0=0, R1=5, R2=2, R3=3, ..., R31=0]
```
#### 示例 3(冲突检测):
```
Instruction: ADD R1, R1, R2
Conflict Detected: R1 is both read and written in the same instruction.
Operation: R1 = Old R1 + R2
Register File: [R0=0, R1=7, R2=3, ..., R31=0]
```
#### 示例 4(多条指令):
```
Input Instructions:
1. LOAD R2, #2
2. LOAD R3, #3
3. ADD R1, R2, R3
4. SUB R4, R1, R2
Output:
Instruction 1: LOAD R2, #2
Operation: R2 = 2
Register File: [R0=0, R1=0, R2=2, R3=0, ..., R31=0]
Instruction 2: LOAD R3, #3
Operation: R3 = 3
Register File: [R0=0, R1=0, R2=2, R3=3, ..., R31=0]
Instruction 3: ADD R1, R2, R3
Operation: R1 = R2 + R3
Register File: [R0=0, R1=5, R2=2, R3=3, ..., R31=0]
Instruction 4: SUB R4, R1, R2
Operation: R4 = R1 - R2
Register File: [R0=0, R1=5, R2=2, R3=3, R4=3, ..., R31=0]
```
#### 示例 5(非法指令):
```
Instruction: ADD R32, R1, R2
Error: Invalid register R32. Register index must be between R0 and R31.
```
### 👥 工作分工建议:
* 成员A:输入解析;
* 成员B:寄存器结构与更新;
* 成员C:冲突检测与结果显示。
### 📝 评分标准:
* 输入解析正确(30%)
* 冲突检测与处理准确(30%)
* 寄存器显示清晰(20%)
* 模块化与注释(20%)
---
## **项目 26:算术逻辑单元(ALU)模拟器**
### 🔧 功能要求:
* 实现一个支持以下运算的 ALU 模块:
- 加法(ADD)
- 减法(SUB)
- 按位与(AND)
- 按位或(OR)
- 按位异或(XOR)
- 按位非(NOT,仅对操作数 A)
- 左移(SHL)
- 右移(SHR)
* ALU 接收一条 20 位机器码作为输入,解析操作数和操作码,输出结果及标志位:
- **Zero Flag (ZF)**:结果是否为零。
- **Carry Flag (CF)**:是否产生进位(仅对加法和减法有效)。
* 禁止使用 C 语言的位运算符(如 `~`, `^`, `&` 等),需手动实现位操作逻辑。
---
### 🔤 输入格式:
1. **机器码格式**:
* 输入一条 20 位二进制字符串,格式如下:
```
[4 位操作码][8 位操作数 A][8 位操作数 B]
```
* 如果操作仅需要一个操作数(如 NOT),操作数 B 的部分填充为 `00000000`。
2. **操作码定义**:
* 使用以下 4 位操作码指定运算类型:
- `0000`:ADD(加法)
- `0001`:SUB(减法)
- `0010`:AND(按位与)
- `0011`:OR(按位或)
- `0100`:XOR(按位异或)
- `0101`:NOT(按位非,仅对 A)
- `0110`:SHL(左移)
- `0111`:SHR(右移)
---
### 🔤 输入输出样例:
#### 示例 1(加法):
```
Input: 0000000011000101 // ADD, A=12, B=5
Output:
Result: 17
Zero Flag: 0
Carry Flag: 0
```
#### 示例 2(按位与):
```
Input: 0010000011000101 // AND, A=12, B=5
Output:
Result: 4
Zero Flag: 0
Carry Flag: 0
```
#### 示例 3(按位非):
```
Input: 0101000011000000 // NOT, A=12
Output:
Result: 243
Zero Flag: 0
Carry Flag: N/A
```
#### 示例 4(左移):
```
Input: 0110000011000000 // SHL, A=12
Output:
Result: 24
Zero Flag: 0
Carry Flag: 0
```
### 👥 工作分工建议:
* 成员A:ALU操作码解析;
* 成员B:ALU功能模块实现(禁止直接使用运算符);
* 成员C:标志寄存器状态计算。
### 📝 评分标准:
* ALU 操作实现完整(40%)
* 禁用原始运算符符号成功(20%)
* 标志位计算准确(20%)
* 模块化与说明文档(20%)
---
## **项目 27:简化版 MIPS 解释器**
### 🔧 功能要求:
* 实现一个简化版 MIPS 汇编指令解释器,支持基本的R型和I型指令:
* `ADD`, `SUB`, `AND`, `OR`, `SLT`
* `LW`, `SW`, `BEQ`, `BNE`
* 程序接收一组汇编指令文本作为输入,模拟寄存器堆和内存的行为并按顺序执行。
* 内存使用固定大小数组模拟;程序中禁止使用 `eval` 等动态解释技术。
### 🔤 输入输出样例:
```
Input:
ADD R1, R2, R3
SUB R4, R1, R2
SW R4, 0(R5)
LW R6, 0(R5)
BEQ R6, R4, LABEL
Output:
R1 = R2 + R3 = 10
R4 = R1 - R2 = 5
MEM[Addr in R5] = R4 = 5
R6 loaded from memory = 5
Branch to LABEL: YES
```
### 👥 工作分工建议:
* 成员A:汇编解析器实现;
* 成员B:寄存器/内存结构与模拟;
* 成员C:跳转与分支逻辑实现。
### 📝 评分标准:
* 指令解析与执行正确(40%)
* 跳转/分支逻辑正确(25%)
* 数据存取与更新准确(20%)
* 程序结构、可扩展性、注释良好(15%)
---
## **项目 28:五级流水线执行器模拟(带冒泡插入)**
### 🔧 功能要求:
* 实现一个可模拟五级流水线(IF, ID, EX, MEM, WB)指令执行器。
* 输入为一个简化汇编程序,输出为每条指令在每周期的位置(流水线状态表),自动检测并插入 NOP 解决数据冲突(RAW)和结构冲突。
* 指令格式与 MIPS 类似。
* 需显示完整的执行过程,时间表格式如 Gantt 图样式。
### 🔤 输入输出样例:
```
Instruction List:
LOAD R1, 0(R2)
ADD R3, R1, R4
SUB R5, R3, R6
Pipeline:
Cycle 1: IF
Cycle 2: ID IF
Cycle 3: EX NOP IF
Cycle 4: MEM ID NOP
Cycle 5: WB EX ID
...
```
### 👥 工作分工建议:
* 成员A:数据结构设计与流水线建模;
* 成员B:冒泡插入逻辑实现;
* 成员C:输出格式(表格/Gantt图风格)生成。
### 📝 评分标准:
* 流水线周期状态模拟正确(40%)
* 冲突检测与冒泡插入准确(30%)
* 输出表格清晰、规范(15%)
* 程序注释与设计合理(15%)
---
## **项目 29:两级缓存一致性模拟器(MESI 协议)**
### 🔧 功能要求:
* 模拟两个CPU核,每个拥有自己的一级缓存L1。
* 实现 MESI(一致性)协议以确保写操作的缓存一致性。
* 模拟跨核心访问/修改共享变量的场景,展示状态转移过程。
* 禁止使用共享全局变量直接同步,必须使用协议状态机控制。
### 🔤 输入输出样例:
```
Core 0: LOAD X
Core 1: STORE X
State Transitions:
Core 0: X in Shared
Core 1: X in Modified
Core 0: X invalidated
```
### 👥 工作分工建议:
* 成员A:缓存数据结构与状态机建模;
* 成员B:MESI协议状态转换逻辑实现;
* 成员C:交互与访问模拟输出。
### 📝 评分标准:
* MESI协议状态机实现准确(40%)
* 缓存状态更新逻辑正确(30%)
* 多核访问交互设计合理(20%)
* 程序结构清晰、注释齐全(10%)
---
## **项目 30:微型指令集架构设计与解释器实现**
### 🔧 功能要求:
* 自定义一个 8 位微型指令集(例如指令长度为 8-bit,支持基本算术与逻辑运算、跳转、内存访问)。
* 设计其编码格式、寄存器与内存结构。
* 实现一个解释器可以解析、加载并运行该指令集程序,并输出执行日志。
* 要求不得使用已有汇编解释器或虚拟机库,指令解析必须自己手动实现。
### 🔤 输入输出样例:
```
Instruction Set Format:
Opcode: 3 bits
Operand1: 2 bits
Operand2: 3 bits
Input Program (in binary):
00001011 // ADD R0, R3
00111000 // MOV R1, #0
Execution Log:
R0 = R0 + R3 = 7
R1 = 0
```
### 👥 工作分工建议:
* 成员A:指令集设计与编码;
* 成员B:解释器与执行引擎实现;
* 成员C:执行日志格式与程序加载。
### 📝 评分标准:
* 指令集设计合理,结构清晰(30%)
* 解释器执行正确无误(40%)
* 日志输出规范、逻辑清楚(15%)
* 编码规范与注释完备(15%)