自制了一个简易的CPU,电路代码全开源
自制了一个 简易的8位CPU , 由74LS系列和PLD器件组成。
采用哈佛架构,64K ROM + 64K RAM,外部总线为标准8080时序。
PS:本项目学习价值较高 ,且设计图+代码 都是完全分享 开源的哦。
CPU基本性能速度:1Hz-2.048MHz ,3T-5T单周期,大部分指令是5T,少部分3T(折合每秒钟40万次加法) 硬件中断: 单级、255向量半中断,中断函数中不支持某些指令 外部总线: 8080时序 、64KB 指令长度(带立即数):16 总线和ALU位宽:8 指针栈:4级16bit ROM:64KB(或32KB) RAM:64KB 显卡:无 键盘:无
结构框图
该架构参考 了1972年由英特尔发布的8008 CPU ,采用单内部总线 ,指令集基本参考8008,运算和逻辑指令类同,有4个flag寄存器。
由于原版的8008采用了CDIP-18封装,时序刁钻,因此本设计首先把外部总线的地址线和数据线分离,然后把16KB寻址范围扩大到64KB+64KB的哈佛结构,但程序执行时不支持跳转到RAM内执行。
设计图
电路设计图一共12张。
用嘉立创EDA专业版设计的PCB图
用嘉立创EDA专业版导出的3D图
实物图:通电测试中
由于文件格式原因,PCB设计文件无法上传,需要获得设计图的伙伴可在评论区滴滴,无偿分享的哈~
设计解说
本章节共7个部分,包含了:时钟振荡器和复位电路,算数运算,寄存器堆,PC程序计数器和指针栈,外部中断控制器,控制器,其他说明。
1.时钟振荡器和复位电路
时钟源部分采用了四种来源,分别是: 7556产生的1Hz低频 25Hz低频 手动按钮信号 8224产生2.048MHz高频时钟源,在硬件电路上做任意切换。
复位电路带有上电复位功能。由于指令中有HLT(停机),因此板上自带一个READY按钮方便调试 。
2.算数运算部分(ALU)
ALU采用西格尼蒂克公司的N8260运算单元,拥有全加、与门、同或三种运算功能,在外加的74LS86异或门和74LS153 MUX的辅助下,拥有减法、异或、逻辑位移、比较等功能 。
ALU设立单独的AB寄存器,与主寄存器堆上的AB寄存器没有任何联系。
有四个FLAG,分别是:CF SF ZF PF 。 当有加法进位或减法借位时,CF<=1 ; 当输出的数为0x00/00000000时,ZF<=1 ; 当输出的最高位/符号位为1时,SF<=1 ; 当输出的8个字节中有偶数个1时,PF<= 1 。
3.寄存器堆
ABCDEFXY 8个通用无特殊功能寄存器 PC暂存器:两个寄存器但一个映射,通过阻塞串联实现两个8位写入16位操作,只输入口映射; INDEX三个寄存器:指向外部RAM单元,指针计算公式:256*DPTRH + DPTRL + INDEX ; P寄存器:内部RAM指针、内RAM映射、DPTRH、DPTRL; AF寄存器:双向IO口映射和51单片机的IO口同地址映射类似; 外部RAM映射:读写操作同内部寄存器。
4.PC程序计数器和指针栈
可以实现0000-FFFF的寻址操作,每取得一个8bit程序指令,PC+1 。
在JMP指令执行时,PC寄存器中的高低8位数据压入PC,原16位进程舍弃。
在CAL中,将PC中高低8位压入PC,同时原PC中16位进程压入指针栈。
在RET指令中,将指针栈顶16bit数据压入PC,PC中原进程舍弃。
5.外部中断控制器
一个很不完善的中断机制,只能做一些简单的操作,没有寄存器状态恢复,没有PSW保存与恢复,很不推荐使用 。
6.控制器
由4片GAL16V8/ATF16V8组成的控制器,结构简单。
7.说明
目前版本 使用了很多停产40多年的器件 ,部分器件很难购买,请谨慎参考!
指令集
目前暂时没有汇编器,机器码结构如下所示, 该指令集对手写汇编非常友好。 NOP 空跑 HLT 停机 HLTDMA (DMA可控停机) ADD/ADC/ADDI/ADCI (带/不带立即数的加/全加) SUB/SBC/SUBI/SBCI (带/不带立即数的 减法/带借位减法) NXR/NXRI 同或 XOR 异或 AND /ANDI 按位与 CMP/CMPI 比较 RR/RL 补0的右移/左移 RRC/RLC 补进位的右移/左移 JMP/JMC/JNC/JMZ.... (跳转/当CF= 1时跳转/当CF=0时跳转.... 其他flag类同) CAL/CLC/CNC/CLZ.... (子函数调用/当CF= 1时调用/当CF=0时调用.... 其他flag类同) RET/RTC/RNC/RTZ.... (子函数返回/当CF= 1时返回/当CF=0时返回.... 其他flag类同)
示例代码
实现在LCD1602上显示"HELLO WORLD!",具体映射地址如下: write cmd 0xff00 write data 0xff02 read cmd 0xff01 read data 0xff03
LCD写命令的启动代码如下: 0x38 0x0c 0x06 0x01
需要写入的数据和地址如下(地址--该地址写入的数据),每写一个数据前,都需要输入地址 ,写地址用写指令操作,写数据用写数据操作: 80--48 81--45 82--4c 83--4c 84--4f 85--20 86--57 87--4f 88--52 89--4c 8a--44 8b--21 (这些ASCII码合起来是"HELLO WORLD!"包括空格) 下面是代码: ****时钟频率1.33MHz(使用12MHz晶振)***** MOVI H 0xff // 1C FF MOVI L 0x00 // 1C 00 --------------------------------------- MOVI A , 0x38 // 10 38 MOVI PC 0x01 // 19 01 MOVI PC 0x40 // 19 40 CAL // E1 FF MOVI A , 0x0c // 10 0C MOVI PC 0x01 // 19 01 MOVI PC 0x40 // 19 40 CAL // E1 FF MOVI A , 0x06 // 10 0C MOVI PC 0x01 // 19 01 MOVI PC 0x40 // 19 40 CAL // E1 FF MOVI A , 0x01 // 10 01 MOVI PC 0x01 // 19 01 MOVI PC 0x40 // 19 40 CAL // E1 FF -------------------------------------------- MOVI A 0x80 // 10 80 MOVI B , 48 // 11 48 MOVI PC 0x01 // 19 01 MOVI PC 0x00 // 19 00 CAL // E1 FF MOVI B , 45 // 11 45 MOVI PC 0x01 // 19 01 MOVI PC 0x00 // 19 00 CAL // E1 FF MOVI B , 4c // 11 4C MOVI PC 0x01 // 19 01 MOVI PC 0x00 // 19 00 CAL // E1 FF MOVI B , 4c // 11 4C MOVI PC 0x01 // 19 01 MOVI PC 0x00 // 19 00 CAL // E1 FF MOVI B , 4f // 11 4F MOVI PC 0x01 // 19 01 MOVI PC 0x00 // 19 00 CAL // E1 FF ------------------------------------ MOVI B , 00 // 11 00 MOVI PC 0x01 // 19 01 MOVI PC 0x00 // 19 00 CAL // E1 FF ------------------------------------ MOVI B , 57 // 11 57 MOVI PC 0x01 // 19 01 MOVI PC 0x00 // 19 00 CAL // E1 FF MOVI B , 4f // 11 4F MOVI PC 0x01 // 19 01 MOVI PC 0x00 // 19 00 CAL // E1 FF MOVI B , 52 // 11 52 MOVI PC 0x01 // 19 01 MOVI PC 0x00 // 19 00 CAL // E1 FF MOVI B , 4c // 11 4C MOVI PC 0x01 // 19 01 MOVI PC 0x00 // 19 00 CAL // E1 FF MOVI B , 44 // 11 44 MOVI PC 0x01 // 19 01 MOVI PC 0x00 // 19 00 CAL // E1 FF MOVI B , 21 // 11 21 MOVI PC 0x01 // 19 01 MOVI PC 0x00 // 19 00 CAL // E1 FF -------------------------------------------------------- HLT // FFFF (.org 0x0100) 写数据子函数 MOVI PC 0x01 // 19 01 MOVI PC 0x40 // 19 40 CAL // E1 FF MOVI IDX , 0x02 // 18 02 MOV RAM , B // 90 F1 ADDI A , 0x01 // 20 01 MOVI PC , 0x01 // 19 01 MOVI PC , 0x20 // 19 20 CAL // E1 FF RET // E2 FF (.org 0x0120) 写读忙+等忙子函数 MOVI IDX 0x01 // 18 01 MOV D , RAM // 90 3F ADDI D , 0x80 // 23 80 JMPC // E0 80 RET // E2 FF (.org 0x0140) 写命令子函数 MOVI IDX 0x00 // 18 00 MOV RAM , A // 90 F0 MOVI PC , 0x01 // 19 01 MOVI PC , 0x20 // 19 20 CAL // E1 FF RET // E2 FF
视频演示
视频加载中...
25Hz主频点亮
视频加载中...
1MHz主频点亮
文章所有资料参考来源:立创开源硬件平台《DJS-08 电子计算机 》作者:BH2VGM。
https://oshwhub.com/king13478509115/8bitcisc#P2