
自己动手写CPU
文章平均质量分 87
leishangwen
而立之年岁开始学硬件——廉颇老矣,尚能饭否!
展开
-
自制处理器OpenMIPS移植ucos-II过程之7——DE2上验证ucos-II+OpenMIPS
最后一步了,在Ubuntu中,打开终端,进入我们添加了Makefile、ram.ld后的ucos-II文件夹,输入make all,稍等几秒钟,编译成功,如下: 下面怎么办?直接把ucosii.bin烧录到flash中?no,no,这样可是不行的,小伙伴们还记得在第三步中我们是如何在DE2上验证OpenMIPS的?我们做了一个测试,这个测试模拟了操作系统转载 2014-03-17 13:45:24 · 1989 阅读 · 0 评论 -
自己动手写CPU之第九阶段(6)——修改最小SOPC
前几篇实现了加载存储指令,今天将修改最小SOPC,为其添加数据存储器RAM,用以测试加载存储指令是否实现正确。原创 2014-11-17 23:57:25 · 2550 阅读 · 8 评论 -
自己动手写CPU之第九阶段(9)——修改OpenMIPS以实现ll、sc指令
通过进一步修改OpenMIPS的代码,实现了MIPS指令集中的LL、SC指令。原创 2014-12-15 23:39:52 · 4319 阅读 · 4 评论 -
自制处理器OpenMIPS移植ucos-II过程之6——创建Makefile
已经到了这一步了,前面不远处就是终点,小伙伴们再加把劲。 这一步包括链接脚本、Makefile的建立,主要参考了OR1200平台上移植的ucos-II的相关文件。 第一步:新建链接脚本文件ram.ld,可以参考OR1200源代码中包含的μC/OS-II的ram.ld,内容如下,重点是单独声明一个vectors section,占用低0x80空间,用来存放的异常处理例转载 2014-03-17 13:44:23 · 2153 阅读 · 0 评论 -
自制处理器OpenMIPS移植ucos-II过程之2——OpenMIPS实践版及SOPC搭建
这是第二部分,介绍了OpenMIPS实践版的主要特点、结构、文件组织,同时以OpenMIPS实践版为核心,搭建了一个小型的SOPC,该SOPC具有SDRAM控制器、GPIO控制器、flash控制器、UART控制器等,可以满足我们的验证需要。 1 OpenMIPS实践版主要特点 相对OpenMIPS教学版而言,OpenMIPS实践版最大的特点是引入了Wishbone总线接口,转载 2014-02-25 11:20:08 · 2414 阅读 · 0 评论 -
自己动手写CPU之第七阶段(8)——验证乘累加指令的实现效果
本节将通过一个测试程序验证为OpenMIPS添加的乘累加、乘累减指令是否实现正确原创 2014-09-04 14:13:43 · 1864 阅读 · 0 评论 -
自己动手写处理器开篇介绍
使用Verilog HDL设计实现了一款兼容MIPS32指令集架构的处理器——OpenMIPS。OpenMIPS处理器具有两个版本,分别是教学版和实践版。教学版的主要设想是尽量简单,处理器的运行情况比较理想化,与教科书相似,便于使用其进行教学、学术研究和讨论,也有助于学生理解课堂上讲授的知识。实践版的设计目标是能完成特定功能,发挥实际作用。原创 2014-07-04 11:52:24 · 10039 阅读 · 4 评论 -
自己动手写处理器之第二阶段(2)——Verilog HDL简介
本书实现的OpenMIPS处理器是使用Verilog HDL编写的,所以本章接下来的几节将介绍Verilog HDL的一些基本知识,包括语法、结构等。因为本书并不是一本讲授Verilog HDL的专门书籍,所以此处介绍的内容并不是Verilog HDL的全部,只是一些基础知识,以及在OpenMIPS处理器实现过程中会使用到的知识。读者如果对Verilog HDL有进一步了解的需求,可以参考相关书籍,这方面有许多非常优秀的书籍。笔者推荐《数字系统设计与Verilog HDL(第4版)》,本章关于Verilog原创 2014-07-15 14:28:12 · 5917 阅读 · 0 评论 -
自己动手写处理器之第二阶段(3)——Verilog HDL行为语句
Verilog定义的模块一般包括有过程语句,过程语句有两种:initial、always。其中initial常用于仿真中的初始化,其中的语句只执行一次,而always中语句则是不断重复执行的。此外,always过程语句是可综合的,initial过程语句是不可综合的。原创 2014-07-16 14:19:30 · 5161 阅读 · 0 评论 -
自己动手写处理器之第二阶段(5)——ModelSim电路仿真
上一节实现了一个简化的处理器取指电路,需要通过仿真以验证其功能是否正确,直观的仿真思路就是:给出一个时钟信号,上述电路会在每个时钟信号上升沿将取指地址加1,同时从指令存储器中取出一条指令,观察取指地址是否依次递增,同时观察取出的指令是否是存储器中取指地址对应的指令,如果都符合,那么上述取指电路就实现正确。此处涉及到两个问题。1、如何在指令存储器中存储指令,也就是指令存储器初始化问题。2、如何给出时钟信号?本节将分别解答上述问题,在此基础上,使用ModelSim进行仿真。原创 2014-07-22 13:51:32 · 9688 阅读 · 5 评论 -
自己动手写处理器之第三阶段——教学版OpenMIPS处理器蓝图
从本章开始将一步一步地实现教学版OpenMIPS处理器。本章给出了教学版OpenMIPS的系统蓝图,首先介绍了系统的设计目标,其中详细说明了OpenMIPS处理器计划实现的5级流水线。3.2节给出了OpenMIPS处理器的接口示意图,及各个接口的作用。3.3节简单解释了各个源代码文件的作用。最后描述了OpenMIPS处理器的实现方法,读者将发现本书给出的实现方法与现有书籍的方法完全不同,更加易于理解、便于实践。原创 2014-07-23 13:15:14 · 8040 阅读 · 2 评论 -
自己动手写处理器之第四阶段(1)——第一条指令ori的实现
前面几章介绍了很多预备知识,也描绘了即将要实现的OpenMIPS处理器的蓝图,各位读者是不是早已摩拳擦掌,迫切希望一展身手了,好吧,本章我们将实现OpenMIPS处理器的第一条指令ori,为什么选择这条指令作为我们实现的第一条指令呢?答案就两个字——简单,指令ori用来实现逻辑“或”运算,选择一条简单的指令有助于我们排除干扰,将注意力集中在流水线结构的实现上,当然也可以选择其它类似的指令,只要简单即可。通过这条简单指令的实现,本章在4.2节将初步建立OpenMIPS的五级流水线结构,当我们在后面章节中实现其原创 2014-07-24 13:31:44 · 16322 阅读 · 10 评论 -
自己动手写CPU之第四阶段(2)——验证第一条指令ori的实现效果
将验证我们的OpenMIPS是否实现正确,包含:流水线是否正确、ori指令是否实现正确。在验证之前,需要首先实现指令存储器,以便OpenMIPS从中读取指令。原创 2014-07-25 12:58:59 · 8193 阅读 · 16 评论 -
自己动手写CPU之第四阶段(3)——MIPS编译环境的建立
OpenMIPS处理器在设计的时候就计划与MIPS32指令集架构兼容,所以可以使用MIPS32架构下已有的GNU开发工具链。本节将说明如何安装使用GNU开发工具链以及如何制作Makefile文件,从而以更加方便、快捷、自动的方式对测试程序进行编译,并得到指令存储器ROM的初始化文件inst_rom.data。原创 2014-07-28 13:32:20 · 11113 阅读 · 13 评论 -
自己动手写CPU之第九阶段(5)——实现加载存储指令4(修改OpenMIPS顶层模块)
修改OpenMIPS的访存阶段,以实现加载存储指令。原创 2014-11-06 14:09:10 · 2455 阅读 · 0 评论 -
自己动手写CPU之第九阶段(5)——实现加载存储指令3(修改访存阶段)
修改OpenMIPS的访存阶段,以实现加载存储指令。...原创 2014-10-26 23:47:22 · 3903 阅读 · 3 评论 -
自己动手写CPU之第九阶段(5)——实现加载存储指令2(修改执行阶段)
修改OpenMIPS的执行阶段,以实现加载存储指令。原创 2014-10-23 21:49:57 · 1872 阅读 · 0 评论 -
自制处理器OpenMIPS移植ucos-II过程之5——修改ucos-II源代码
好了我们前面已经建立了移植ucos-II所需的目录,很整齐是吧,现在开始了移植中艰难的一段旅程,需要修改ucos-II的部分代码,主要是port目录下的,这个目录下的文件才是和移植有关的,要修改这么几个方面:去掉与MIPS M14K特点有关的代码。 将一些MIPS M14K具有的指令,而OpenMIPS没有的指令,使用OpenMIPS的指令替换,比如:di指令,该指令的作用是禁止中断,转载 2014-03-17 13:43:20 · 2084 阅读 · 0 评论 -
自制处理器OpenMIPS移植ucos-II过程之4——ucos-II文件目录建立
经过前面三步的准备,想必大家对OpenMIPS已经有所了解了,甚至有的小朋友可能已经会使用了(如果真是这样……,啥也别说了,感动的想哭),从本文开始就正式进入ucos-II的移植部分了,本文介绍ucos-II文件目录的建立。 我们的移植思路是:充分借鉴已有的移植经验。 经过搜索,发现目前比较接近的是将ucos-II移植到MIPS M14K,就这个了。另外还借鉴了uc转载 2014-03-17 13:40:35 · 1946 阅读 · 0 评论 -
自制处理器OpenMIPS移植ucos-II过程之3——DE2验证OpenMIPS
在第二部分中,已经介绍了基于OpenMIPS的SOPC的结构,本文介绍如何将该SOPC下载到Altera的DE2上进行验证,我们的验证程序是模拟一个操作系统的启动过程,包括两个部分:BootLoader、SimpleOS,大家一看名字就理解了,前者是用来加载操作系统的,后者当然就是一个简单的操作系统了,这个操作系统有多简单呢?答:非常简单,只是读取串口收到的数据,然后把数据再发送回去。转载 2014-02-25 11:22:22 · 2095 阅读 · 1 评论 -
自制处理器OpenMIPS移植ucos-II过程之1——OpenMIPS介绍
现在都流行自制,搭着这个东风,本人制作了一个32位的处理器,采用MIPS指令级,所以叫做OpenMIPS,它是完全开源的哦,大家可以自由下载讨论,共同提高。 裸奔是危险的,裸机也是不好用的,所以本人颇费周折的为OpenMIPS移植了开源操作系统ucos-II,一方面是为了便于使用,另一方面也是为了验证OpenMIPS是否实现正确。 现在,我宣布,我的OpenMIPS+u转载 2014-01-06 12:25:09 · 5159 阅读 · 0 评论 -
自己动手写处理器之第一阶段(1)——计算机的简单模型、架构、指令集
计算机很复杂,可以听歌、看电影、上网、玩游戏,内部是怎么工作的,这个问题太可怕了,太复杂了。计算机很简单,只有加、减、乘、除、逻辑、移位、转移、存储、加载等几类可以做的操作,太简单了。复杂?简单?其实取决于个人对事物的认识程度,认识的越多,了解的越深刻,那么就越接近本质,而本质往往都是简单的,比如大名鼎鼎的质能方程,一个简单的式子就解释了质量与能量的关系。计算机就是一台计算的设备,而且是一台很基础的计算设备,只能计算小学数学课堂上讲授的四则运算,再加上一些并不复杂的与、或、非等逻辑运算,其余诸如平方、原创 2014-07-07 13:00:41 · 10453 阅读 · 4 评论 -
自己动手写处理器之第一阶段(2)——MIPS指令集架构的演变
MIPS指令集架构自上世纪80年代出现后,一直在进行着更新换代,从最初的MIPS I到MIPS V,发展到可支持扩展模块的MIPS32、MIPS64系列,再到集成代码压缩技术的microMIPS32、microMIPS64。每个MIPS ISA都是其前一个的超集,没有任何遗漏,只有增加新的功能。原创 2014-07-08 13:25:56 · 6545 阅读 · 0 评论 -
自己动手写处理器之第一阶段(3)——MIPS32指令集架构简介
在前文介绍RISC的特点时提到一点:大量使用寄存器。这是因为寄存器的存取可以在一个时钟周期内完成,同时也简化了寻址方式。MIPS32的指令中除加载/存储指令外,都是使用寄存器或立即数作为操作数的。MIPS32中的寄存器分为两类:通用寄存器(GPR:General Purpose Register)、特殊寄存器。原创 2014-07-13 14:02:19 · 20491 阅读 · 5 评论 -
自己动手写处理器之第二阶段(1)——可编程逻辑器件与PLD电路设计流程
FPGA是可编程逻辑器件(PLD:Programmable Logic Device)的一种。PLD是上世纪70年代发展起来的一种新型器件,它的应用和发展不仅简化了电路设计,降低了开发成本,提高了系统可靠性,而且给数字系统的设计方法带来了革命性的变化。截止到现在,出现了多种工艺、不同原理的PLD,如下。 PLA(Programmable Logic Array)可编程逻辑阵列 PAL(Programmable Array Logic)可编程阵列逻辑 GAL(Generic Array Logic原创 2014-07-14 13:24:19 · 6319 阅读 · 0 评论 -
自己动手写处理器之第二阶段(4)——电路设计举例
本节将设计一个简化的处理器取指令电路,通过这个例子体会Verilog HDL的使用。处理器内部一般有一个PC寄存器,其中存储指令地址,正常运行过程中,PC的值会随时间增加,同时从指令存储器中取出对应地址的指令。所以,本节实现的处理器取指令电路,包含两部分:PC模块、指令存储器。原创 2014-07-21 13:44:32 · 4630 阅读 · 0 评论 -
自己动手写CPU之第九阶段(1)——加载存储指令说明1
MIPS32指令集架构中定义的加载存储指令共有14条,其中8条加载指令:lb、lbu、lh、lhu、ll、lw、lwl、lwr,6条存储指令:sb、sc、sh、sw、swl、swr,本文介绍了除lwl、lwr、swl、swl外的10条指令的含义及其作用。原创 2014-10-08 00:03:08 · 8013 阅读 · 0 评论 -
自己动手写CPU之第九阶段(3)——加载存储指令说明2(swl、swr)
今天继续对MIPS32中加载存储指令进行说明(主要是swl、swr),上次已经介绍一些其他的加载存储指令,大家可以回顾。原创 2014-10-14 00:23:11 · 4761 阅读 · 1 评论 -
自己动手写CPU之第九阶段(4)——加载存储指令实现思路
介绍除ll、sc之外的加载存储指令的实现思路1、加载指令实现思路加载指令在译码阶段进行译码,得到运算类型alusel_o、aluop_o,以及要写的目的寄存器信息。这些信息传递到执行阶段,然后又传递到访存阶段,访存阶段依据这些信息,设置对数据存储器RAM的访问信号。从RAM读取回来的数据需要按照加载指令的类型、加载地址进行对齐调整,调整后的结果作为最终要写入目的寄存器的数据。2、存储指令实现思路存储指令在译码阶段进行译码,得到运算类型alusel_o、aluop_o,以及要存储的数据。这些信息传递到原创 2014-10-16 23:41:10 · 2956 阅读 · 1 评论 -
《自己动手写CPU》写书评获赠书活动结果
《自己动手写CPU》写书评获赠书活动最终名单出炉了,出版社已经寄出赠书,各位童鞋注意查收呵!原创 2014-10-21 23:41:01 · 1681 阅读 · 0 评论 -
自己动手写CPU之第四阶段(4)——Makefile文件建立
为了得到指令存储器初始化文件,我们需要输入4条命令,有点麻烦,最好只输入一条命令就可以了,这需要使用到Makefile文件。原创 2014-07-29 13:01:58 · 3508 阅读 · 1 评论 -
自己动手写CPU之第五阶段(1)——流水线数据相关问题
我们在第4章实现的五级流水线结构很简单,如果按照“简单即美(Simple is Beautiful)的标准,那么我们的流水线是美的,但是不完美,因为现实往往是复杂的,一个简单的流水线是解决不了如此多的现实问题的,本节探讨的数据相关问题就是其中一个问题。在我们实现逻辑、移位操作等其它指令之前,必须先讨论这个问题,因为这个问题已经影响到测试程序的编写了。流水线中经常有一些被称为“相关”的情况发生,它使得指令序列中下一条指令无法按照设计的时钟周期执行,这些“相关”会降低流水线的性能。流水线中的相关分为三种类型。原创 2014-07-30 13:16:33 · 12272 阅读 · 2 评论 -
自己动手写CPU之第七阶段(7)——乘累加指令的实现
完善补充了OpenMIPS的代码,实现了MIPS32指令集中的乘累加、乘累减指令,共有四条:madd、maddu、msub、msubu原创 2014-09-03 13:40:33 · 3040 阅读 · 0 评论 -
自己动手写CPU之第七阶段(9)——除法指令说明及实现思路
OpenMIPS设计采用试商法实现除法运算,对于32位的除法,需要至少32个时钟周期才能得到除法结果。本节介绍试商法的一般过程。原创 2014-09-05 13:23:37 · 5991 阅读 · 0 评论 -
自己动手写CPU之第七阶段(10)——除法指令实现过程1
DIV模块的主要部分是一个状态机,共有四个状态,如下,状态转换如图7-18所示。 DivFree:除法模块空闲 DivByZero:除数是0 DivOn:除法运算进行中 DivEnd:除法运算结束原创 2014-09-09 14:19:47 · 4363 阅读 · 4 评论 -
自己动手写CPU之第七阶段(11)——除法指令实现过程2
通过修改OpenMIPS译码阶段、执行阶段的代码,实行了除法指令原创 2014-09-10 12:28:29 · 2725 阅读 · 0 评论 -
福利来了,晒书评送书活动启动了
小伙伴们,福利来了,从今天开始,《自己动手写CPU》开展晒书评送书活动,在亚马逊、京东、当当三大图书网站上,发表《自己动手写CPU》书评的前十名读者,均可获赠《步步惊芯——软核处理器内部设计分析》一书,大家踊跃参与吧!原创 2014-09-11 23:33:30 · 1910 阅读 · 5 评论 -
自己动手写CPU之第七阶段(12)——检验除法指令实现效果
通过一个测试程序验证为OpenMIPS添加的除法指令是否实现正确原创 2014-09-12 13:23:09 · 2271 阅读 · 2 评论 -
自己动手写CPU之第八阶段(1)——转移指令介绍
本章将为OpenMIPS处理器添加转移指令,转移指令包括跳转、分支两种,区别在于前者是绝对转移,后者是相对转移,但实现方法是相似的。转移指令涉及延迟槽,所以首先在8.1节介绍了延迟槽的概念,接着在8.2节对MIPS32指令集架构中定义的所有转移指令的格式、作用、用法进行了说明。在8.3节介绍了OpenMIPS实现转移指令的思路,以及对数据流图、系统结构的修改。8.4节通过修改代码实现了转移指令,最后通过两个测试程序,验证转移指令是否实现正确。原创 2014-09-15 00:08:41 · 10127 阅读 · 9 评论 -
自己动手写CPU之第八阶段(2)——转移指令实现思路
为了尽量减少转移指令带来的损失,OpenMIPS在译码阶段进行转移条件的判断,如果满足转移条件,那么修改PC为转移目标地址。在译码阶段多了转移判断的步骤,此外,PC的取值变为三种情况。情况一:PC等于PC+4。这属于一般情况,每个时钟周期PC加4,指向下一条指令。情况二:PC保持不变。当流水线暂停的时候,就会发生这种情况,参考第7章中流水线暂停的实现。情况三:PC等于转移判断的结果。如果是转移指令,且满足转移条件,那么会将转移目标地址赋给PC。原创 2014-09-18 14:12:07 · 2949 阅读 · 2 评论