|
本帖最后由 liccil 于 2019-4-8 20:58 编辑
这段时间一直在看8-bit guy的视频,这老哥经常玩康懋达的C64 VIC-20一类的机器。这类机器的cpu都是经典的老8bit芯片,正好最近比较空闲,于是就diy了一块小核心板感受一下8bit纯处理器是什么样的。
x度和x宝上搜索了一下发现W65C02好像比较现代一些,cmos工艺功耗也低,最高主频可以开到14MHz,那些七十年代的老NMOS6502芯片最高也只能上到1MHz左右。
从手册上直接能看出来芯片是0.8微米工艺,还是够古老的。关键是这个芯片支持低电压操作,大家都知道纯处理器不叫单片机,因为这个东西真的仅仅是个处理器--没有rom 没有ram 没有GPIO
UART剩下的外设都没有,只有地址线和数据线,读写信号和一些乱七八糟的信号,需要用74xx芯片做地址译码器。这部分东西太闹心了,所以找了一片3.3V的CPLD做地址译码,顺便可以做一些其他功能,例如外挂单片机单步调试、或者用ram做程序存储器,使用外挂单片机-cpld去配置ram,老芯片实现isp下载比拔来拔去爽的多。
电路图的话,用bing一搜索一大堆。我主要参考了一下grant的6502小系统电路,试试能不能跑起来。
http://searle.hostei.com/grant/6502/Simple6502.html
他这个电路用了6502芯片做主处理器,6502芯片和6501(貌似是兼容摩托罗拉6800)区别主要是带了内置的时钟发生器,只要给6502芯片输入一个时钟(据B站上视频讲,NMOS的6502不仅功耗大,由于内部结构的原因不能实现纯静态操作,就是时钟频率不能无限低),芯片的两个时钟输出就可以产生时钟脉冲信号,通过一些简单的组合逻辑的操作就可以驱动8080总线的器件(例如熟悉的62256 28256一类的)。由于16位寻址空间的限制,最多能访问64kB的地址空间,因此分配了32KB的RAM和16KB的ROM,剩下16KB可以用作IO地址空间。
6502上电复位后程序计数器会指向0xFFFC,就是reset向量。在0xFFFC 和 0xFFFD位置放上低8位和高8位地址数据,cpu就会跳到指定的地址开始执行程序。当然实际存储在ROM的地址范围是0-3FFF(对应cpu是$C000-$FFFF)。
上面的图是初版。没有gpio实在是不能忍,点个灯都点不了。所以给它配了个6522。这个芯片是GPIO芯片(VIA),可以转换出两路8位并行IO和两组串行io(类似spi)。最上的芯片是MC68B50,6800总线的ACIA芯片(其实是个UART收发器),两片RAM一片存储程序,一片是纯RAM。最右侧当然是大名鼎鼎的6502。紧跟着是12864接口,打算装个液晶放放烂苹果,以后再说。
rom/ram
右上角最显眼的是一片EPM240T100C5,大家都熟悉的cpld芯片。可以方便的设计里面的逻辑,这要是用74xx 想要修改怕是得切割板子了,而且复杂的逻辑也实现不了。
cpld左侧是一片stm32 这个片子当时设计是为了给程序ram在线下载代码用的,但是..还没有做。毕竟这部分算是调试器,先让电路跑起来再说
50M晶振用cpld分频给时钟信号等等杂活就给cpld干了
地址译码什么的用verilog 或者直接画就完事了 这个图里面给VIA(6522)地址译码范围是$8000-$800F
其中包括IO方向寄存器,IO值寄存器,还有定时器什么的
debug过程..简单写了个程序发现,根本不跑。用示波器看了一下 数据线波形上升巨烂。拉几个上拉电阻吧,顺便把cpld的未用io设置成弱上拉。
折腾了几天 发现好像是汇编器有问题(使用不当?),org指定的位置是乱的 还有刚才提到的cpu地址和实际地址问题,一开始都没发现。
直到某天晚上突然能点灯了,发现这个硬件踩了几个坑(数据线驱动能力 时钟频率 供电 汇编器的指定地址)..
最坑的一个事情是 这货的地址线波形特别怪 这个65C02如果A0-A9输出高电平就是高 ,低电平不是一直低,而是GND和Phase2时钟取或? A10-A16刚好相反,我还以为cpu是坏的?跑飞了?时钟太高?供电不足?
最后发现是正常的。
附上一个闪烁灯的汇编代码
MAIN: LDA #$FF ;向累加器A存0xFF
STA $8002 //让6522的b口全部输出
STA $8003 //a口全部输出
DELAY: LDX #$FF //累加器x存储FF
DLA: LDY #$FF //累加器Y存储于FF
DLB: DEY //Y-=1
BNE DLB //如果Y-1不是0 跳转回DLB
DEX //X-=1
BNE DLA //如果X-1不是0 跳回DLA
LDA #$FF //累加器A存FF
STA $8000 //输出到PA
STA $8001 //输出到PB
LDX #$FF //延时
DLC: LDY #$FF
DLD: DEY
BNE DLD
DEX
BNE DLC
LDA #$00 //累加器A存00
STA $8000 //输出到PA
STA $8001 //输出到PB
JMP DELAY //循环
在主频3.125MHz下,以上代码控制的灯闪烁频率大概3Hz左右。
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
打赏
-
查看全部打赏
|