Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/DeathKing/CPME48

Why CP-YOU? Let's CP-ME! 非常简单的8位CPU的VHDL实现,拥有精简的RISC式指令集。更有配套扩展指令集IR48*、汇编器DASM48、高级语言Cheme,你值得拥有。(课程作业,仅供交流,切勿抄袭!)
https://github.com/DeathKing/CPME48

Last synced: 2 months ago
JSON representation

Why CP-YOU? Let's CP-ME! 非常简单的8位CPU的VHDL实现,拥有精简的RISC式指令集。更有配套扩展指令集IR48*、汇编器DASM48、高级语言Cheme,你值得拥有。(课程作业,仅供交流,切勿抄袭!)

Awesome Lists containing this project

README

        

# CPME48

CPME48是一个简易CPU的VHDL实现,它仅支持少量自定义的RISC指令(IR48)。

## 配套软件

+ cheme:为CPME48设计的高级语言,Scheme的变种子集。cheme拥有语法为S-表达式风格、语义基于副作用、强类型等特点。cheme语言提供的`chemec`可以将cheme程序编译为CPME48的汇编指令IR48\*。
+ dasm: 为CPME48设计的汇编器,能将IR48指令编写的文件汇编为CPME48的机器指令。也能将CPME48的二进制程序反编译。

## 技术规格

在默认的IR48指令集实现中,CPME48的技术规格如下:

+ CPME48具有8个8位通用寄存器(从R0到R7)(注①)。
+ CPME48的指令寄存器(IR)是16位的。
+ CPME48的数据总线是16位的(注②)。
+ CPME48的地址总线是16位的。
+ CPME48的外设端口设置了8个(注③)。
+ CPME48的存储器大小为64K×16位(注④)。

> **注:**
> ① CPME48没有对有特殊用途的R7寄存器做保护,即寄存器R7有时作为地址高字节使用,但对汇编语言的程序员来说,R0到R7都是可直接存取的。
> ② 数据总线仅在读取IR时处理16数据,在读取其它数据时,按照8位总线使用。
> ③ 由于实际硬件的限制,这8个端口实则同一个端口。
> ④ 存取指令时,每个单元16位数据都有效;存取数据时,每个单元仅低字节有效。

在IR48的扩展指令集IR48\*的意义下,CPME48\*基本技术规格与CPME48一致,但新增加了几个寄存器,并将通用寄存器赋予了新的意义。寄存器详细指标如下:

| 引用代码 | 寄存器 | 名字 | 说明 |
| :-----: | :----: |:-------: | :---------------- |
| 000 | AX(R0) | 累加器 | 通用,或作为累加器 |
| 001 | BX(R1) | | 通用 |
| 010 | CX(R2) | | 通用 |
| 011 | DX(R3) | | 通用 |
| 100 | SI(R4) | 源索引 | 串复制源地址,数组索引|
| 101 | DI(R5) | 目的索引 | 目的地址,数组索引 |
| 110 | SP(R6) | 栈指针 | 栈顶指针 |
| 111 | BP(R7) | 基址指针 | 栈中引用位置的地址 |
| --- | CS | 代码段基址| 代码段基址 |
| --- | DS | 数据段基址| 数据段基址 |
| --- | SS | 栈段基址 | 栈段基址 |
| 111 | FLAG | 状态位 | 标志集,状态位 |
| --- | IR | 指令寄存器| 当前指令地址 |
| 000 | PC | 程序计数 | 将要执行的指令的地址 |

> **注:**
> ① `---`表示无法直接引用,只能通过指令间接影响该寄存器。
> ② 寄存器PC、FLAG只能被特殊指令(如`SPOP`、`SPSH`指令)引用。

## 寻址模式

CPME48只支持直接寻址的寻址方式。

## 内存布局

CPME48采用的内存布局称为“simple”,反应在汇编代码中应为:

```asm
.MODEL SIMPLE
```

在IR48中,数据、代码和运行时栈(Runtime stack)并不严格区分,在IR48\*中,引入了CS、DS以及SS寄存器管理这些内存区域。尽管如此,一个程序还是会占用整个存储器空间,因此这种内存布局是“简易的”。

```
+--------------------+
0x0000 | Empty Unit |
+--------------------+
0x0001 | |
| Code Segment |
0x00FF | |
+--------------------+
0x0100 | |
| Data Segment |
0x01FF | |
+--------------------+
0x0200 | |
| Stack Segment |
0x02FF | |
+--------------------+
```