紫光同创PGL22G开发平台试用连载(3)---在FPGA上实现DW8051 MCU

LuoGuibin 提交于 周四, 08/13/2020
紫光同创PGL22G开发平台试用连载(3)---在FPGA上实现DW8051 MCU

作者:罗桂斌

现在国内半导体行业如此欣欣向荣,为了打破美国对国内高端器件的控制,国家也是下定了决心要在IC设计和制造领域实现自主可控。但是要实现这个目标不是一蹴而就的,行业发展需要资金、人才和配套产业链,更需要时间。而这个时间可能是几十年,也可能是几代人的努力。

相信很多FPGA工程师也想要投身到半导体行业中去,不管是因为看好行业的发展前景,还是想要为中国IC产业添砖加瓦。其实从知识储备和技术层面上,FPGA开发和IC前端设计或者验证都有相同之处。可能在设计思想和开发工具上有一些差别,但是大体是相近的,转行的门槛很低。比如,我现在的部门经理之前就是在中兴做IC的,身边的很多同事也有跳槽去做IC的。特别是现在如火如荼的AI产业,很多AI公司想要让自己的产品落地,都选择了人工智能芯片作为落脚点,这也需要很多IC设计的人才。

说到FPGAIC设计领域的应用,大家比较熟悉的就是用于流片前的验证。首先,硬件部门会将FPGA、外设芯片和模拟电路一起做成验证平台。然后将芯片的数字部分在FPGA上实现,软件部门将配套的软件安装上以验证整个系统。当设计的规模比较大时,可能会在多片FPGA上实现(划片),或者涉及到复杂的模数混合器件时,验证平台和方案也会变得很复杂。

最近在看一本关于RISC-V CPU设计的书,其中提到了8051单片机的实现是用状态机实现的,没有使用现代处理器设计中使用的多级流水线,所以性能比较差(原文中提到这一点是想表达流水线不是CPU设计中必须的)。这不禁让我想起了大学时代,陪我度过了无数个日夜的8051单片机。

说起8051单片机绝对是MCU史上的传奇,8051Intel1980年设计的一款嵌入式处理器。Intel之后将8051技术开放,任何公司都可以基于8051架构设计兼容的MCU。这也是为什么会看到各种各样的8051单片机,STC8051AT89C51C8051F等等。可以说8051是应用最广的单片机,但是现在ARM的出现可能会逐渐改变这一情况。ARMM0/M3单片机已经是32位的性能、8位的价格了,相信以后的大学生都会开始使用ARM作为入门的器件而不是8051了。

那么进入今天的主题,8051作为一款经典的8位处理器,到底他是如何实现的呢?有没有一个方式可以让我们进一步的了解和深入研究呢?答案当然是:有!

紫光同创PGL22G开发平台试用连载(3)---在FPGA上实现DW8051 MCU

首先说一下如何获取8051单片机的源码,目前网上可以找到的8051 RTL源代码主要是OpenCores上的OC8051SynopsysDW8051OC8051是开源的,基于Wishbone总线;DW8051Synopsys设计的IP,不是开源的,但是论坛里可以下载到源代码和data_book,但是只有源码没有配套的仿真平台和用例。大厂出品,编码风格和设计规范值得学习。所以我选择了DW8051,准备在紫光同创平台上实现一个小的demo

紫光同创PGL22G开发平台试用连载(3)---在FPGA上实现DW8051 MCU

DW8051只有一个CPU Core没有连接任何的存储器,需要在外部连接一个数据RAM和指令ROM,并将hex文件作为ROM的初始化文件。现在说一下顶层的必要模块:

紫光同创PGL22G开发平台试用连载(3)---在FPGA上实现DW8051 MCU

开发步骤如下:

(1)    紫光同创PDS软件中例化PLLRAMROM IPPLL输入50Mhz输出10MhzRAM容量是8bit 256字节,ROM8bit 64KB

图1.   PLL/RAM/ROM配置情况图1.   PLL/RAM/ROM配置情况图1.   PLL/RAM/ROM配置情况

图1.   PLL/RAM/ROM配置情况

(2)    连接时钟,复位和RAM/ROM端口到CPUCPU的架构如图所示。在连接端口的时候一定要注意几个点:

1、CPU的复位输入有两个,上电复位por_n和外部复位rst_in_n,都是低电平有效的;

2、CPU的外部总线共有4组,iram_bus必须连接外部的数据RAM,连接的RAM时钟一定要和CPU使用的时钟取反;irom_bus必须连接外部的指令ROMmem_bus是外部扩展内存接口,当只使用内部存储器的时候,端口不连接,且mem_ea_n信号必须连接高;sfr_bus是特殊功能寄存器的扩展接口,8051SFR地址空间是0x80~0xFFDW8051内部只实现了部分SFR的功能,当没有实现的SFR被访问的时候会通过这组总线访问外部的SFR,我们自己扩展的外设模块就是连接在这个端口上的。本demo的目标是实现一个led的闪烁,所以在sfr_bus上增加了一个译码模块,通过P0端口的寄存器0x80实现对板上LED[3:0]的控制;

3、未使用的输入端口需要连接到正确的电平,输出端口悬空。

图2.  DW8051架构图

图2.  DW8051架构图

连接好的RTL视图如下:

图3.  DW8051 SOC顶层视图

图3.  DW8051 SOC顶层视图

(3)    打开Keil软件,新建工程,选择一款兼容的8051 器件,编译如下代码,生成hex文件。生成的hex文件需要作为ROM的初始化文件,PDS中对ROM的初始化文件有一定的格式要求,原文是用户在配置.dat文件时,应根据数据位宽,按照初始化的文件格式每行写入1地址深度的数据,并保证.dat文件中有效数据行数等于地址深度。文件后缀得是.dat,并把其余的存储空间用0xFF填满。我写了一个python脚本来转换hex文件到rom初始化文件。关于hex文件的格式可以参考这篇博文:

图4.   Keil软件代码

图4.   Keil软件代码

(4)    将转换好的.dat文件作为ROM的初始化文件,重新Generate ROM IP,然后开始编译整个FPGA工程。这里需要注意,文件的数据量必须是和ROM的容量相同的,比如864KROM,初始化文件中的数据必须是每行8位数据,并且65536行。这里还有一个小问题是,在配置好PLL后,PDS软件并没有自动的生成输出时钟的约束,这一点和Vivado是不同的;需要自己添加一条时钟约束,我这了使用PLL产生一个10Mhz的时钟给整个系统。最终生成bitstream文件。

(5)    下载编译好bitstream文件到PGL22G开发板中,看到LED1闪烁,证明实验成功。

总结一下

在开发这个demo的整个过程中,还是遇到了一些困难的,比如:

1、IRAM的时钟要使用和CPU反向的以保证CPU可以正确的锁存住数据,这是由于在MCU8051使用的都是异步RAM,而FPGA中的都是同步RAM,为了满足时序要禁止掉输出寄存器(否则数据会在两拍之后输出);这个通过仿真可以看到具体的时序问题。

2、Hex文件的格式一定要注意,我第一次下载到FPGA中时,8051并没有正确的工作,我反复确认FPGA设计没有问题。加入了debug core进去抓IROM的总线信号,发现一直在几条指令之间循环。就去Keil里面看汇编对应的哪几条指令,发现根本对不上,才觉得可能是生成的hex文件不对,去百度了hex文件的格式才知道自己异想天开的以为只要把hex文件的内容直接写成一列就行了,被自己蠢哭。

3、PDS软件的易用性还是有待加强的,PLL生成之后没有输出对应的约束,第一次综合和布局布线竟然有时序不过的情况,我只跑10Mhz啊?加入了PLL输出时钟的约束之后,才消除了时序不过的路径。而且FPGA里实现了一个64KBROMDRM的使用率已经到69%了,所以这个器件真的不大。

图5.  DW8051 MCU在PGLL22G上的资源占用

图5.  DW8051 MCUPGLL22G上的资源占用

注册送8―88的白菜网址相关的文章

Digi-Key