从零构建16位CPU运算器:TEC-2平台与Am2901芯片实战指南
在计算机组成原理的教学实验中,运算器的设计与实现始终是理解计算机核心工作机制的关键环节。对于许多初学者而言,教科书上抽象的ALU结构图和时序波形往往难以形成直观认知。而通过TEC-2教学实验平台配合经典的Am2901位片芯片,我们能够亲手搭建一个完整的16位运算器,用开关和指示灯代替抽象的代码,用硬件连线替代软件仿真,这种"看得见、摸得着"的学习体验,正是理解计算机底层原理的最佳途径。
本文将带领读者从芯片级开始,逐步构建一个功能完备的16位运算器。不同于单纯的原理讲解,我们会重点关注:
- 如何将四片Am2901芯片级联成16位运算单元
- 控制信号(I8~I0)与数据通路的具体对应关系
- 脱机模式下通过开关配置验证运算功能
- 联机状态下与监控程序的协同工作方式
1. 实验环境搭建与芯片特性解析
1.1 硬件准备清单
进行本实验需要以下核心组件:
| 组件名称 | 规格/型号 | 数量 | 备注 |
|---|---|---|---|
| TEC-2主机 | 教学计算机系统 | 1台 | 含电源、数据线、指示灯等 |
| Am2901芯片 | 4位位片运算器 | 4片 | 需确认引脚完好 |
| 连接线束 | 杜邦线 | 若干 | 建议不同颜色区分信号 |
| 逻辑分析仪 | 可选 | 1台 | 用于深度信号观测 |
| 稳压电源 | 5V DC输出 | 1台 | 确保供电稳定 |
1.2 Am2901芯片架构详解
Am2901作为4位位片运算器的代表,其内部结构包含多个关键模块:
[寄存器组] ←→ [ALU] ←→ [移位器] ↑ ↓ └─────[Q寄存器]←┘- 16×4位通用寄存器组:支持双端口读取(A口和B口)和单端口写入
- 4位ALU单元:提供8种基本运算功能,包括:
- 加法(A+B)
- 减法(A-B)
- 逻辑与(A AND B)
- 逻辑或(A OR B)
- 异或(A XOR B)
- 传送(A或B)
- 加1/减1
- Q寄存器:专为乘除运算设计的4位乘商寄存器
- 移位器:支持直送、左移、右移三种结果输出方式
芯片的9位控制信号(I8~I0)分为三组:
- 结果选择组(I8-I6):决定运算结果的去向
- ALU功能组(I5-I3):选择具体的运算类型
- 操作数选择组(I2-I0):确定ALU输入数据的来源
2. 16位运算器的硬件搭建
2.1 芯片级联方案设计
将四片Am2901扩展为16位运算器时,需要特别注意以下信号连接:
高位芯片(3) ←→ 中间芯片(2) ←→ 中间芯片(1) ←→ 低位芯片(0) ↑ ↑ ↑ ↑ └───────────┴───────────┴───────────┴─ 公共控制信号关键连接规则:
- 数据通路:
- 16位输入D15-D0分别接入四片的D3-D0
- 16位输出Y15-Y0分别来自四片的Y3-Y0
- 进位链:
- 低位芯片的Cn+4连接相邻高位芯片的Cn
- 最低位芯片的Cin接外部进位信号
- 控制信号:
- 所有芯片的I8-I0、A/B地址、CP、/OE并联
2.2 实际操作步骤
电源连接:
- 确保所有芯片Vcc接+5V,GND接地
- 上电前用万用表检查无短路
数据总线连接:
- 使用不同颜色线区分数据位:
- 红色:D15-D12(芯片3)
- 黄色:D11-D8(芯片2)
- 绿色:D7-D4(芯片1)
- 蓝色:D3-D0(芯片0)
- 使用不同颜色线区分数据位:
控制信号连接:
- 将TEC-2的微码开关输出接至所有芯片的I8-I0
- A/B地址线并联至各芯片对应引脚
进位链验证:
- 临时将Cin接地,输入全1数据测试进位传递
- 用逻辑笔检查各芯片Cn+4信号
注意:所有连接完成后,建议拍照记录线序,便于后续排查问题。
3. 脱机模式下的运算验证
3.1 基础寄存器操作
在脱机模式下,我们通过手动设置开关来验证运算器功能。以下是一个完整的寄存器写入流程:
设置功能开关:
- FS4 = 1(脱机模式)
- STEP/CONT = STEP(单步执行)
配置数据通路:
SW1设置示例(写入R0): D15-D0: 1010 0000 0000 0000 (A000H) A口: 0000 (R0地址) B口: 0000 (未使用) SCi: 00 (无进位) SSH: 00 (无移位)设置控制微码:
SW2设置(MI8-MI0): I8-I6: 011 (结果写回B口寄存器) I5-I3: 000 (A+B运算) I2-I0: 111 (D输入+0作为操作数)执行单步操作:
- 按压STEP按钮一次
- 观察指示灯显示Y输出应为A000H
3.2 算术运算演示
初始化R0=A000H,R1=4000H后,可进行多种运算测试:
| 运算类型 | MI8-MI0设置 | 预期结果 | 标志位(SVZC) |
|---|---|---|---|
| ADD | 011 000 001 | E000H | 1,0,0,0 |
| SUB | 011 001 001 | 6000H | 0,0,0,1 |
| AND | 011 010 001 | 0000H | 0,0,1,0 |
| OR | 011 011 001 | E000H | 1,0,0,0 |
提示:观察标志位时,需将S2S1S0开关拨至"000"位置,对应指示灯:
- H25 = S(符号)
- H26 = V(溢出)
- H27 = Z(零)
- H28 = C(进位)
4. 联机模式与程序控制
4.1 监控程序准备
启动配置:
- FS1-FS4 = 1010
- STEP/CONT = CONT
- 启动PCEC通讯程序
输入测试程序:
A800 ; 从800H开始输入 MOV R0, A000 MOV R1, 4000 ADD R0, R1 SUB R0, R1 OR R0, R1 AND R0, R1 XOR R0, R1 RET执行与调试:
G800:连续运行全部程序T:单步执行R:查看寄存器状态
4.2 关键机器码解析
以ADD R0, R1指令为例,其对应的微操作包括:
取指阶段:
- PC→MAR→MEM
- 读取指令码到IR
执行阶段:
周期1:R1→B (设置B口地址) 周期2:R0→A, B→ALU (设置A口地址) 周期3:ALU执行加法 周期4:结果写回R0
对应的控制信号变化可通过逻辑分析仪捕获,验证运算器实际工作时序。
5. 进阶实验与故障排查
5.1 移位运算实现
Am2901支持多种移位模式,通过SSH信号控制:
| SSH值 | 移位类型 | 应用场景 |
|---|---|---|
| 00 | 逻辑移位 | SHL/SHR指令 |
| 01 | 循环移位 | ROL/ROR指令 |
| 10 | 联合移位 | 乘除法运算 |
| 11 | 算术右移 | 有符号数处理 |
示例:实现R0逻辑左移
- 设置SSH=00
- I8-I0=100 000 000(F左移)
- 执行STEP脉冲
5.2 常见问题解决方案
现象1:运算结果不正确
- 检查电源电压(应在4.75-5.25V之间)
- 验证所有芯片的I8-I0连接是否一致
- 用逻辑笔测试进位链是否正常传递
现象2:指示灯无反应
- 确认/OE信号已接地(使能输出)
- 检查时钟CP是否有脉冲(可用示波器观测)
- 测试各芯片Y输出引脚电压
现象3:联机通信失败
- 确认TEC-2波特率设置与PC端匹配
- 检查串口线连接是否可靠
- 重启PCEC程序并重新初始化连接
6. 实验思考与延伸
通过本实验,我们不仅构建了一个可工作的16位运算器,更重要的是理解了数据在硬件层面的流动过程。当手动拨动每一个开关时,能清晰看到信号如何从寄存器出发,经过ALU处理,最终写回存储单元——这种直观体验是软件模拟器无法提供的。
建议学有余力的读者尝试以下扩展实验:
- 设计一个4位乘法器(利用Q寄存器)
- 实现条件跳转电路(基于Z/C标志)
- 测量不同运算的延迟时间
- 对比Am2901与现代ALU的架构差异
在调试过程中,我特别建议准备一个实验日志本,记录每次开关设置、预期结果和实际现象。当遇到异常时,通过对比历史记录往往能快速定位问题根源。例如,某次实验中,由于疏忽将进位信号接反,导致加法结果总是偏差1,正是通过系统性的记录比对才发现了这个隐蔽的错误。