您的位置 首页 IOT

零根底学FPGA(十四)榜首片IC——精简指令集RISC_CPU规划精讲

不得不说,SDRAM的设计是我接触FPGA以来调试最困难的一次设计,早在一个多月以前,我就开始着手想做一个SDRAM方面的教程,受特权同学影响,开始学习《高手进阶,终极内存技术指南》这篇论文,大家

  不得不说,SDRAM的规划是我触摸FPGA以来调试最困难的一次规划,早在一个多月曾经,我就开端着手想做一个SDRAM方面的教程,受特权同学影响,开端学习《高手进阶,终极内存技能攻略》这篇论文,咱们都知道这篇文章是学习内存入门的必读文章,小墨同学花了一些时刻在这上面,说实话看懂这篇文章是没什么问题的,文件讲的比较直白,通俗易懂,很简略下手。当了解了SDRAM作业方法之后,我便开端写代码,从特权同学的那篇经典教程里边,我仔细研读代码的来龙去脉,总算搞懂了特权同学的规划思维,并花了一些时刻将代码自己敲一遍,并加上自己的注释

  

360桌面截图20141119135138.jpg

 

  可是规划并没有像我幻想的那么简略,代码规划好之后还要通过仿真,时序束缚,仿真整体来说还好,可是时序束缚我触摸的很少,所以又去学时序束缚方面的常识,因为操控SDRAM时钟跑到了100MHZ,时序束缚对这个规划来说能够算是要害部分了,之前的规划因为对时序要求的不高,所以不必束缚就能够完结。学习时序束缚能够算是一个绵长的进程,通过这段时刻的学习,小墨同学也开端反思,是不是自己的跨度有点大,规划SDRAM的进程的确有些费劲,所以,小墨同学决议暂时抛弃SDRAM的教育,等今后发Nios II的文章的时分再来谈SDRAM。

  这次咱们先来学习一个CPU的规划,这个规划看似简略,可是真要一步步做完仍是需关键耐性和精力的。本篇文章咱们首要介绍Risc_CPU的规划进程以及代码剖析,下一篇文章小墨同学首要和咱们共享test bench的书写与仿真测验,协助咱们一步一步学会这个cpu的规划,那么,咱们开端今日的教育吧~

  一、 规划前的预备

  规划开端之前,咱们得先知道什么是CPU,cpu即中央处理器,是核算机的核心部件。cpu的作业进程,小墨同学简略说一下。首要咱们核算机的程序和数据是存在咱们核算机的内存中的,上电后cpu就需求从第一条指令的地址开端取指令,即取指令。取出的指令需求通过指令译码来告知cpu这条指令是用来干什么的,即剖析指令。当得知指令内容今后,cpu需求发生操作指令来完结相应的操作,即履行指令。所以,任何一种CPU内部,至少应该包含下列这些部件:

  1.管用运算器

  2.累加器

  3.指令计数器

  4.指令存放器和译码器

  5.时序操控器

  二. 作业原理

  在本次规划中,咱们假定ROM中装的是咱们的程序指令,等会咱们会往里边装数据,程序指令是16位的,cpu每次读取8位,分两次读完,读出来的数据存到指令存放器中。

  这16位数据的高三位代表指令码

  HLT = 3’b000,

  SKZ = 3’b001,

  ADD = 3’b010,

  AND = 3’b011,

  XOR = 3’b100,

  LDA = 3’b101,

  STO = 3’b110,

  JMP = 3’b111;

  后13位代表地址码,指令存放器将读回来的数据分红指令码opcode[2:0]和地址码ir_addr[12:0],状况操控器读回指令码进行译码,看是什么指令,然后依据指令的内容操作其他部件,若为写数据则翻开RAM进行写数据,若为核算则将数据送到管用运算器进行管用运算,若为跳转指令则地址指向下一地址,下次读取指令的时分就越过一个地址履行等等

  三、各模块精讲

  本次规划的cpu共包含8个模块,下面我来逐个解说

  1.时钟发生器

  

360桌面截图20141119142639.jpg

 

  本模块的用来发生分频信号,外部50M的时钟,做8分频输出,此8分频信号用来操控地址多路器的输出,因为之后咱们要用到8状况的状况机,因而这儿做成8分频,至于详细原因,咱们后边再讲,然后是一个管用运算器的使能信号,每一个8分频信号到来之前有一个算术运算器使能信号的高脉冲,意思便是,每一此状况机循环开端之前做一次运算

  

360桌面截图20141119143436.jpg

 

  

360桌面截图20141119143528.jpg

 

  才有状况机的方法来规划分频信号避免了运用计数器计数的方法来延时,提高了程序的可读性和速度

  2.指令存放器

  

360桌面截图20141119143810.jpg

 

  本模块的作用是将来自ROM的16位数据存放并分为高三位的指令码和低13位的地址码

  

360桌面截图20141119144948.jpg

 

  指令存放器分两次读取ROM中的数据

  3.累加器

  

360桌面截图20141119145119.jpg

 

  管用运算器的初值位0,来自ROM的数据经管用运算器处理之后输出到累加器,累加器使能信号到来时,再将这份数据送到管用运算器作为初值,与下次从ROM中读回的数据进行管用运算

  

360桌面截图20141119145644.jpg

 

  4.管用运算器

  

360桌面截图20141119145855.jpg

 

  算术运算器先判别来自ROM的高三位指令码是何种指令,然后将来自ROM中的数据和来自累加器中的数据进行管用运算,并将成果输出。假如管用运算器中的数据是0的话,那么有一个高脉冲zero输出

  

360桌面截图20141119150218.jpg

 

  5.数据操控器

  

360桌面截图20141119150409.jpg

 

  假如想将管用运算器的成果保存起来,输出到RAM,那么能够选通数据操控器,将数据输出到RAM,合作指令STO

  

360桌面截图20141119150617.jpg

 

  6.地址多路器

  

360桌面截图20141119150723.jpg

 

  8分频时钟的前半周期用来读取ROM中指定地址的数据,后半周期用来进行指令操作,所曾经半个周期需求从指定ROM中读数据,所以输出地址应为pc_addr,后半个周期用来处理指令,那么要操作的肯定是从ROM中读回的13位地址,即ir_addr,并将其输出

  

360桌面截图20141119151231.jpg

 

  7.程序计数器

  

360桌面截图20141119151320.jpg

 

  刚开端从ROM中读取数据的地址是pc_addr,是0地址,若为跳转指令,则需求将从ROM中读回的13位地址码作为新地址给pc_addr,等下一个8分频时钟到来时就读取该地址的指令,完结跳转指令的意图。假如不是跳转指令,那么pc_addr加1指向下一地址,持续履行

  

360桌面截图20141119151727.jpg

 

  8.状况操控器

  

360桌面截图20141119151905.jpg

 

  状况操控器,即咱们的状况机,使咱们本次规划的核心部件,状况机共用了8个状况

  前两个状况用来读取ROM中的16位数据,需求两个时钟,也便是需求两个状况。

  第三个状况等候一个时钟周期,意图是要凑够8个状况,因为8分频时钟的后半个周期需求4个状况来完结,故前半周期也需求4个状况,因为前半周期只需求读取数据和地址指向下一地址即可,故需凑一个状况

  第四个状况地址加1 ,指向下一地址

  第五到八个状况用来剖析指令和履行指令,若为跳转指令,则操控程序计数器改动方针地址,若为越过下一条指令,则操控程序计数器pc_addr地址加4,若为运算指令,则将控管用运算器进行相应的逻辑运算,若为LDA写入指令,则将读回的数据放入累加器中等等,详细操作指令的意义见下图

  

360桌面截图20141119152940.jpg

 

  各个模块规划好之后将其拼装便完结了咱们的cpu规划,拼装后的顶层模块见下图

  

360桌面截图20141119153255.jpg

 

  这样,咱们的cpu就规划完结了,当然规划完结之后还要进行仿真,要仿真就还需求外围电路,包含存期指令程序ROM,存取数据的RAM,地址译码器等,因为ROM和RAM是不行归纳的,可是咱们能够在仿真的时分模仿。

  因为每篇文章最多只能上传20张图片,所以今日的教程就到此为止吧,详细的仿真进程和ROM、RAM的规划小墨同学将在下一篇文章中介绍,下一篇文章中将会说到modolsim SE的运用,test bench的书写,前面的博客中尽管也略有提及,但并不体系,下一篇文章将会以本次规划为例,给咱们介绍仿真的全进程,期望咱们大力支撑,下面附上部分仿真的图片和测验成果供咱们参阅

  波形仿真

  

360桌面截图20141119154152.jpg

 

  谢谢各位大神的支撑,这篇文章写了几个小时,纯手打~

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/yingyong/iot/116962.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部