北京邮电大学计算机组成原理课程设计 A 题归档。本仓库面向 TEC-8 实验平台和 Altera MAX 7000S EPM7128SLC84-15,按“基础顺序控制 → 二级流水 → 中断扩展”保留三套彼此独立的 Quartus II 9.0 SP2 工程。
本仓库实现的是 TEC-8 的硬布线控制器;ALU、R0-R3、PC、AR、IR、双端口 RAM 与总线均使用实验台既有数据通路。
| 目录 | 层次 | 实现重点 |
|---|---|---|
01-basic-controller/ |
基础顺序硬布线控制器 | 与课程任务书的功能、接口、W1/W2/W3 时序、器件和引脚约束保持一致 |
02-two-stage-pipeline/ |
二级流水硬布线控制器 | 取指与执行重叠,以 EX_IR7_4 分离取指侧 IR 和执行级指令 |
03-interrupt-controller/ |
带中断硬布线控制器 | R3 作为 PC 影子寄存器,R2 保存中断入口,支持 EI、DI、IRET |
flowchart LR
B["基础版<br/>顺序 W1/W2/W3"] --> P["二级流水版<br/>取指与执行重叠"]
P --> I["中断版<br/>断点保存与自动转移"]
.
├── 01-basic-controller/
│ ├── src/controller.v
│ ├── controller.qpf / controller.qsf
│ ├── controller_assignment_defaults.qdf
│ ├── controller.cdf
│ └── artifacts/controller.pof
├── 02-two-stage-pipeline/
│ └── 与基础版相同的独立工程结构
├── 03-interrupt-controller/
│ ├── src/controller.v
│ ├── tb/*.v
│ └── Quartus 工程与编程文件
└── docs/
├── course-specification.pdf
└── two-stage-pipeline-stop-control.docx
基础版对应课程 A 题的基础层次。控制器支持运行程序、读/写存储器、读/写寄存器五种操作台模式;运行时在 W1 取指并令 PC 自增,在 W2 译码和执行普通指令,LD、ST 通过 LONG 延长到 W3 完成访存。
实现覆盖 NOP、ADD、SUB、AND、INC、LD、ST、JC、JZ、JMP、STOP 等基本指令,并保留 OUT、OR、CMP、MOV 扩展。控制接口、基本时序和引脚分配分别对应课程任务书第 10、27-31、40 页。
流水版把取指和执行安排到固定时槽:空流水在 P_EMPTY/W2 填充,当前指令在 P_EXEC/W1 执行;普通指令执行时同步产生 do_fetch,由 LIR 与 PCINC 预取下一条。LD/ST 进入 P_MEM2/W2,完成第二拍访存的同时取下一条指令。
控制器增加 EX_IR7_4 作为执行级 OP 寄存器,仅在 do_fetch 有效的 T3 下降沿更新。执行译码、状态转移和停机控制均读取执行级寄存器:STOP 只在 do_exec && ex_is_stop 时生效,并作为流水边界禁止继续预取;跳转同样清空当前流水,随后从新 PC 重新填充。P_MEM2 是访存的第二个微周期,不是额外的通用流水级。
flowchart LR
A["P_EMPTY / W2<br/>填充流水<br/>LIR + PCINC"] --> B["P_EXEC / W1<br/>按 EX_IR7_4 执行"]
B -->|"普通指令:执行 + 预取"| B
B -->|"LD / ST"| C["P_MEM2 / W2<br/>完成访存 + 预取"]
C --> B
B -->|"跳转:清空后重取"| A
B -->|"STOP:不再预取"| H["STOP = 1"]
IR["IR7_4<br/>取指侧 OP"] -->|"do_fetch,T3 下降沿"| EX["EX_IR7_4<br/>执行级 OP"]
EX --> B
TEC-8 的本控制器接口没有提供可直接保存断点的独立通路,因此中断版保留 R3 作为 PC 的影子寄存器,并在运行前把中断服务程序入口写入 R2。
- 主程序每次 W1 取指时同时执行
PC ← PC + 1、R3 ← R3 + 1。 JMP使用1001_11_rs编码:高两位寄存器字段固定为11以选择 R3 写回,原先空闲的低两位改作跳转源寄存器号,使PC与R3同时装入R[rs]。PULSE上升沿锁存中断请求;控制器在当前指令结束后受理,关闭中断并冻结 R3,下一 W1 自动执行PC ← R2。IRET通过 ALU A 口执行PC ← R3,随后退出服务态并重新开放中断。
flowchart TD
F["主程序 W1 取指<br/>PC 与 R3 同步自增"] --> E["执行当前指令"]
E --> J{"JMP?"}
J -->|"是"| JT["1001_11_rs<br/>PC、R3 同时装入 R[rs]"]
J -->|"否"| Q{"指令结束且有已使能请求?"}
JT --> Q
Q -->|"否"| F
Q -->|"是"| A["受理中断<br/>关中断并冻结 R3"]
A --> V["入口 W1<br/>PC ← R2"]
V --> ISR["执行中断服务程序"]
ISR --> R{"IRET?"}
R -->|"否"| ISR
R -->|"是"| RET["PC ← R3<br/>重新开中断"]
RET --> F
复位后中断默认关闭,需要先执行 EI。当前中断版本将 R3 作为保留寄存器,并暂不支持难以同步修正 R3 的 JC/JZ;主程序跳转应使用上述 JMP 编码。
|
@TeaSings |
@jingjia-11 |
@Gjt20051218 |
@Xuanx-7 |