【Hunted Horror】mini_m8051w系统调试完成
小有成就的一件事,自己纯手工,基本没有参考别人的代码,只是参考了一些思想,除了51的core用的是mentor的,其他东西都是自己和之前的自己积累下来的东西,硬件代码独立完成。框图如下:
整个memory的地址映射关系如下表:
PBUS | |
ROM2KX8 | 0x0000~0x07FF |
SRAM1KX8 | 0x2000~0x23FF |
EFLASH32KX8 | 0x8000~0xFFFF |
XBUS | |
SRAM1KX8 | 0x3000~0x33FF |
比较新鲜的东西其实没有什么,memory全部使用同步逻辑的memory,加入的gpio是由于功能的需要(后面会有介绍)。只是在eflash_ctrl上多花了点心思进行调试。下面来详细说说这玩意,这个大概花了我半个多月功夫调出的东西。
首先从系统级上来讲,本系统可完成的功能是通过两个GPIO的输入作为选择,可以选择功能,如下表所示
port0_0 | 1 | down mode |
0 | normal mode | |
port0_1 | 1 | info block select |
0 | data block select |
上电过程结束,reset过程结束时,当port0_0为1,则开始进入down程序的过程,是通过串口来down,程序需要满足的要求是以0x42, 0x45, 0x4c, 0x42这4个头字节开始,也以这4个同样的尾字节结尾才可以正常的down入到挂载在ebus接口写操作的32kx8的eflash里面。down的过程则是串口接收到其实的4个头字节之后,直到收到4个尾字节,将中间的数据先全缓存到XBUS上的SRAM1KX8中,之后在通过EBUS分次写入eflash中。
而port0_1来区分是写入info_block还是data_block。
当port0_0为0的时候,就通过ljmp 08000h直接跳转到eflash所在的程序区,执行所down进去的程序。
值得一提的是,最初始的版本,我操作eflash的动作不对,因为对eflash进行写,只能将对应的bit从1->0,而0->1的动作需要erase来完成,结果犯2了我,对eflash中数据写入的时候没有erase的操作,导致对应的写数据操作写入的时候原来是0的bit不能写成1,数据就都错了,那程序也当然执行不正确了。所以在写入的之前一定要对想要写入的page进行erase的动作才能保证写入的正确(我为了简便起见,没有这么区别,只是写之前直接进行macro的erase操作)。
现在的版本,一次down入的数据量最大就是1KX8,收到XBUS上SRAM的限制,而且只能down到从0x8000开始的地址区块中,不过反正是小练习,也不打紧的。既然可以将程序down入了,那么挂外设,对对应的程序进行修改就不必要每次都对ROM里的初始化代码进行修改,重新为了改程序而重新跑FPGA了。对,就是很方便。