【SoCVista】OpenRisc系列教程

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

OpenRISC解剖系列课程【版权说明】本文系作者原创,转载请说明出处和链接,否则将根据《中华人民共和国著作权法》依法追究法律责任。欢迎访问:作者:范国平前言很多朋友都知道,我们同好会的第一个目标是要建立一个最小SoC系统,这个系统只有CPU、总线、存储器和跟踪输出用的UART。这样的一个最小系统,我们已经完成移植了,大家可以访问下载相关的代码和文档。下载地址是:=94&extra=page%3D1完成系统移植后,很多朋友都来信说希望进一步了解OpenRISC的工作机制。为此,我们开设了这个解剖教室,希望有兴趣的朋友们一起来参加学习和讨论。我们争取每两天上一次课,讲义贴出后,请大家通过回帖的形式提问、讨论。我们的讲义摘自网络和书籍,抛砖引玉,更重要的是大家通过回帖提问和讨论来释疑解惑。要说明的一点是,我们都不是OpenRISC的专家,希望通过我们的自主学习和集合讨论,在课程结束后所有人都能真正掌握OpenRISC的结构和用法。001-做好学习前准备【版权说明】本文系作者原创,转载请说明出处和链接,否则将根据《中华人民共和国著作权法》依法追究法律责任。欢迎访问:作者:范国平根据调查发现,x86系列和ARM系列已经成为了桌面系统和嵌入式系统的最常用CPU。但是它们价格昂贵,技术保密,不适合作为我们解剖的对象。我们的目光转移到开源的CPU系列,这样的CPU也有不少,比如OpenRISC和LEON等。由于笔者个人经历的关系,这里我们选择OpenRISC的OR1200作为我们研究的对象。OR1200是OpenCores组织提供的基于GPL协议的开放源代码处理器,有人认为其性能介于ARM7和ARM9之间,适合一般的嵌入式系统使用。最重要的一点是OpenCores组织提供了大量的开放源代码IP核供研究人员使用,因此对于一般的开发单位具有很大的吸引力。OR1200在使用0.18um及6层金属工艺时,主频可以运行在300MHz,可以提供300Dhrystone、2.1MIPS和300次的32x32DSP乘加操作。默认配置下进行流片时约有100万个晶体管,以NAND2为基本单元计算时,相当于25万门的规模。利用Virtex2进行实现时,大约占用7000+Slices,14000+LUT4单元。如果去掉Cache和MMU则可以进一步节省大约1/2的资源。因此这款RISC也可以在大部分FPGA器件上轻松实现。OR1200是32位标量RISC处理器,具有哈佛结构、5级整数流水线、支持MMU和Cache,带有基本的DSP功能。外部数据和地址总线采用Wishbone片上总线标准。----课外作业----1.什么是Dhrystone?试举例说明某类CPU的这个指标大概是多少。2.什么是MIPS?试举例说明某类CPU的这个指标大概是多少。3.如果实现Openrisc需要14000LUT4,那么Xilinx的哪些产品可用,Altera的哪些产品可用?4.什么是哈佛结构?5.整数流水线是什么意思?----参考文献----1.《CPU源代码分析与芯片设计及linux移植》002-OR1200不得不说的那些事【版权说明】本文系作者原创,转载请说明出处和链接,否则将根据《中华人民共和国著作权法》依法追究法律责任。欢迎访问:作者:范国平第一章的习题大家做得不错,足见热情之高。可能有些朋友已经迫不及待想跳进源代码的海洋去畅游一番了吧。不过且慢,汪洋大海进去容易出来难,别忘了带上地图、指南针和救生用具。同样的,在我们一头钻进浩瀚的源代码之前,让我们先来了解一下他的概貌,这样我们才不至于迷路,才不至于在一个大浪打过来的时候就选择放弃。我们要知道这个海洋长什么样,哪里有避风港,哪里有暗礁,如何行船才能一路顺风。为了简化理解,如果不做特别说明,我们讨论的只是OpenRISC的32位实现,不考虑浮点,也不考虑向量和DSP功能,我们就是聚焦一个普通CPU的简单基本功能。--地址与寻址–先来看看OR1200的地址空间和他的寻址方法。32位OR1200采用的是32位地址,所以他的寻址能力就是2^32=4G字节的空间。虽然这个空间十分庞大,但是OR1200只提供了两种简单的寻址模式来对其进行访问。第一种是寄存器间接寻址方式,为什么叫寄存器间接寻址呢?因为这种方式的地址不是直接产生的,首先要从指令指定的寄存器中读出一个基本地址,然后这个地址和指令中的16位偏移地址相加才最终得到一个有效地址。大家可以想象,这种指令的格式简单表示的话就是【指令类型,寄存器ID,16位立即数】这样一个三元组,当然这是我们为了方便理解而简化的一个指令模型,实际指令会较之复杂一些,不过知道这个三元组已经足够了。另外的一种寻址方式叫PC相对寻址。PC是ProgramCounter的简称,指的是当前正在执行的指令的地址。所谓相对寻址,就是在这个PC的基础上增加一个相对偏移,然后得到有效地址。这个相对偏移从哪里来呢?显然是正在执行的指令提供的,这个偏移数是一个有符号的26位立即数,所谓有符号意味着可以取正数也可以取负数,所以这个最终的有效地址可以比当前PC小也可以比当前PC大,从而实现前后双向跳转。那么我们什么时候会需要寻址呢?主要有两类情况。第一类:读写内存中的数据;第二类读取内存中的指令。读写内存数据和PC没有关系,所以显然我们只能采用寄存器间接寻址。读取内存中指令显然和当前的指令地址即PC密切相关,我们只要知道两者偏移即可实现跳转,因此此类寻址就采用PC相对寻址,我们熟知的jump类指令就是这么做的。----寄存器----OR1200的寄存器可以简单分为两大类,一类称作特殊寄存器SPR,另一类叫做通用寄存器GPR。特殊寄存器和CPU硬件相关,用于配置CPU的各个功能并监控其状态。相对的,通用寄存器和CPU硬件管理无关,只是用于当前环境下的运算目的,比如操作数的存储等。特殊寄存器在OR1200中只有一套,但是通用寄存器可以有多套,每一套通用寄存器和特定的上下文环境相关。当异常发生时,一般会发生上下文环境的切换,相应的,我们所使用的通用寄存器也切换到了另一套上面。特殊寄存器虽然只有一套,但是他可以分成32组,每一组对应一种硬件功能的管理,比如第2组负责管理指令MMU,第8组则负责电源管理。每一组特殊寄存器内部又有多个寄存器,具体内容大家可以参考手册,这里就不多做介绍了。----异常处理----当异常发生时,当前的环境被保存,同时CPU跳到指定入口开始异常处理。当异常处理结束时,先前保存的环境被恢复,同时CPU又返回到刚才异常发生前所处的指令地址处。如果要举个不恰当的例子,就好比一个有精神疾患的病人突然接收到一个异常信号,他的大脑瞬间保存当前的环境,然后对异常进行处理,比如大喊大叫、又苦又笑,但是完成这一系列动作后,他又突然恢复先前的记忆,开始正常的行为。关于异常处理的具体细节我们将在后面的课程中用源代码来详细说明。----课外作业----1.阅读openrisc_arch档中的指令部分并回答哪些指令有寻址操作,分别采用了哪一种寻址模式。2.阅读寄存器部分并回答特殊寄存器分成哪几组,通用寄存器中有哪几个是有固定用途的。3.阅读异常处理部分并回答在默认配置下系统启动时从哪个地址开始执行,中断发生时指令跳到哪个地址开始执行。参考文献:openrisc_arch文档=13下载003-惊鸿一瞥:OR1200经典结构【版权说明】本文系作者原创,转载请说明出处和链接,否则将根据《中华人民共和国著作权法》依法追究法律责任。欢迎访问:作者:范国平前面两节课我们描述了OR1200作为一颗嵌入式CPU所被人关注的一般性能和主要特点。从这节课开始我们将带领大家一步步深入其内部构造,直到将其源代码完全解析。今天的任务是OR1200之“惊鸿一瞥”,惊鸿的现代含义比较复杂,不过在古诗里面多用于形容美丽女性的轻盈之态,比如曹植在他的《洛神赋》里就用“翩若惊鸿,婉若游龙”来描绘洛神的美态。出于对OR1200的喜爱,加上其本身结构的简约轻盈,我在这里就把它也比喻成了翩若惊鸿。所谓惊鸿一瞥自然就是匆匆的看美女一眼的意思了,我们的课程为了避免大家产生学习疲劳都尽量简短,因此今天也只会对OR1200简单“一瞥”,让大家在心里留下无限惆怅,这样才能继续后面的课程。----OR1200结构----好了,言归正传。我们来看OR1200的一个通用框架。____________________________________________|__________________||||||Power-Manager--||--IMMU||||||Debug--||--I-Cache|||CPU|||Tick-Timer--||--D-Cache||||||PIC--||--DMMU|||_________________|||___________________________________________|你会惊讶的发现原来OR1200并不是CPU那么简单,CPU其实只是其中的一个部分而已。当然他是最核心的部分,就相当于一个Linux操作系统里面的Kernel,缺了它就跑不起来了。但是如果只有CPU,那这个功能就无趣得很了,就好比linux没有图形界面,没有上网功能,哪还有什么意思。所以设计师又加上了一堆外围的模块,使得OR1200的功能更加完善。我们逐一来介绍这些模块。----CPU----CPU是OR1200的核心,正是在这里发生了著名的5级流水事件。这5级流水是:指令预取-IF、指令译码-ID、运算执行-EX、内存存取-MA、数据回写-WB。流水操作的每一级都对应着一个或者多个内部模块,此外运算所需的通用寄存器和异常处理模块也在这里实现。----Cache----数据缓存D-Cache和指令缓存I-Cache都是可选的,如果希望提高CPU的效率一般会选择加载这两个模块。由于功能类似,我们以数据缓存为例进行介绍。在流水的第4级中将会发生内存存取的操作,比如要从内存读一个数据进来,在没有Cache的情况下,CPU需要通过总线操作将数据从内存读入,这个操作耗费较长周期,因此极大影响CPU的实际性能。为了解决这个问题,工程师们引入了缓存机制。比如在上面的第4级流水操作中,如果要读取内存,则CPU会先到缓存中寻找是否有此数据,如果数据存在则立刻读取,省去了冗长的总线操作,极大的提高了CPU的工作效率。那么如果缓存中没有要找的数据呢?那就没有办法了,当然只能通过总线来读取内存了,不过即便如此,我们的缓存机制也为将来做了缜密的考虑。首先,缓存会执行突发操作,一次读入16个字节,这样不但当前需要的数据读入了,而且将来可能需要的数据也被读入,提高了下一次数据命中的机会;另一个机制是当数据读回来的时候,不但要缓存到Cache中,而且马上转发到CPU中的Load/Store单元,以减小时间损失。所以,对于缓存如果不能很好理解,就想像成在CPU本地创建了一个内存的小镜像,大多数情况下,我们可以直接读这个镜像,但是有时候我们的数据超出了镜像的范围,因此需要等待镜像更新,然后我们才能继续使用这个更新后的镜像。----MMU----内存管理单元有两个作用,一是禁止对受保护空间的访问,二是将应用程序的虚拟地址翻译成物理地址。对于嵌入式系统而言,这两个功能都不是很必要,而且OR1200中MMU的实现对软件的依赖程度很高,因此我们在后面讲到这部分的时候再讨论。可能有些朋友很着急,怎么又不往下说了呢。其实我们的课程重在理解和源代码分析。我的目标是用最浅显的语言给大家勾勒出一个CP

1 / 11
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功