分享

自制了一个简易的CPU,电路代码全开源

 好汉勃士 2023-02-04 发布于广东

自制了一个简易的8位CPU由74LS系列和PLD器件组成。

采用哈佛架构,64K ROM + 64K RAM,外部总线为标准8080时序。

文章图片1

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内执行。

文章图片2

设计图

电路设计图一共12张。

文章图片3
文章图片4
文章图片5
文章图片6
文章图片7
文章图片8
文章图片9
文章图片10
文章图片11
文章图片12

用嘉立创EDA专业版设计的PCB图

文章图片13

用嘉立创EDA专业版导出的3D图

文章图片14

实物图:通电测试中

由于文件格式原因,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 0xff00write data 0xff02read cmd 0xff01read data 0xff03

LCD写命令的启动代码如下:

0x380x0c0x060x01

需要写入的数据和地址如下(地址--该地址写入的数据),每写一个数据前,都需要输入地址,写地址用写指令操作,写数据用写数据操作:

80--48  81--4582--4c83--4c84--4f85--2086--5787--4f88--5289--4c8a--448b--21(这些ASCII码合起来是“HELLO WORLD!”包括空格)下面是代码:   ****时钟频率1.33MHz(使用12MHz晶振)*****MOVI H 0xff          //   1C FFMOVI L 0x00         //   1C 00---------------------------------------MOVI A , 0x38         //   10 38MOVI PC 0x01         //   19 01MOVI PC 0x40         //   19 40CAL                          //   E1 FFMOVI A , 0x0c         //   10 0CMOVI PC 0x01         //   19 01MOVI PC 0x40         //   19 40CAL                          //   E1 FFMOVI A , 0x06         //   10 0CMOVI PC 0x01         //   19 01MOVI PC 0x40         //   19 40CAL                          //   E1 FFMOVI A , 0x01         //   10 01MOVI PC 0x01         //   19 01MOVI PC 0x40         //   19 40CAL                          //   E1 FF--------------------------------------------MOVI A 0x80           //   10 80MOVI B , 48             //   11 48MOVI PC 0x01         //   19 01MOVI PC 0x00         //   19 00CAL                          //   E1 FFMOVI B , 45             //   11 45MOVI PC 0x01         //   19 01MOVI PC 0x00         //   19 00CAL                          //   E1 FFMOVI B , 4c             //   11 4CMOVI PC 0x01         //   19 01MOVI PC 0x00         //   19 00CAL                          //   E1 FFMOVI B , 4c             //   11 4CMOVI PC 0x01         //   19 01MOVI PC 0x00         //   19 00CAL                          //   E1 FFMOVI B , 4f              //   11 4FMOVI PC 0x01         //   19 01MOVI PC 0x00         //   19 00CAL                          //   E1 FF------------------------------------MOVI B , 00             //   11 00MOVI PC 0x01         //   19 01MOVI PC 0x00         //   19 00CAL                          //   E1 FF------------------------------------MOVI B , 57             //   11 57 MOVI PC 0x01         //   19 01MOVI PC 0x00         //   19 00CAL                          //   E1 FFMOVI B , 4f              //   11 4F MOVI PC 0x01         //   19 01MOVI PC 0x00         //   19 00CAL                          //   E1 FFMOVI B , 52             //   11 52MOVI PC 0x01         //   19 01MOVI PC 0x00         //   19 00CAL                          //   E1 FFMOVI B , 4c              //   11 4CMOVI PC 0x01          //   19 01MOVI PC 0x00          //   19 00CAL                           //   E1 FFMOVI B , 44             //   11 44MOVI PC 0x01         //   19 01MOVI PC 0x00         //   19 00CAL                          //   E1 FFMOVI B , 21             //   11 21MOVI PC 0x01         //   19 01MOVI PC 0x00         //   19 00CAL                          //   E1 FF--------------------------------------------------------HLT                          //   FFFF(.org 0x0100) 写数据子函数 MOVI PC 0x01          //   19 01MOVI PC 0x40          //   19 40CAL                           //   E1 FFMOVI IDX , 0x02       //   18 02MOV RAM , B           //   90 F1ADDI A , 0x01           //   20 01MOVI PC , 0x01        //   19 01MOVI PC , 0x20        //   19 20CAL                          //    E1 FFRET                          //    E2 FF(.org 0x0120) 写读忙+等忙子函数MOVI IDX 0x01         //   18 01MOV D , RAM          //    90 3FADDI D , 0x80          //    23 80JMPC                       //     E0 80RET                          //     E2 FF(.org 0x0140) 写命令子函数MOVI IDX 0x00       //    18 00MOV RAM , A         //    90 F0MOVI PC , 0x01      //    19 01MOVI PC , 0x20     //     19 20CAL                        //     E1 FFRET                        //     E2 FF

视频演示

00:00 / 00:00
2X快进中
重播
播放
00:00 00:00
进入全屏
画中画
    点击按住可拖动视频

    25Hz主频点亮

    00:00 / 00:00
    2X快进中
    重播
    播放
    00:00 00:00
    进入全屏
    画中画
      点击按住可拖动视频

      1MHz主频点亮

        本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
        转藏 分享 献花(0

        0条评论

        发表

        请遵守用户 评论公约

        类似文章 更多