0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于状态机的简易RISC CPU设计

电子工程师 来源:fqj 2019-05-06 09:12 次阅读

一、什么是CPU

CPU即中央处理单元的英文缩写,它是计算机的核心部件。计算机进行信息处理可分为两个步骤:

将数据和程序(即指令序列)输入到计算机的存储器中。

从第一条指令的地址起开始执行该程序,得到所需结果,结束运行。CPU的作用是协调并控制计算机的各个部件执行程序的指令序列,使其有条不紊地进行。因此它必须具有以下基本功能:

a)取指令:当程序已在存储器中时,首先根据程序入口地址取出一条程序,为此要发出指令地址及控制信号

b)分析指令:即指令译码。是对当前取得的指令进行分析,指出它要求什么操作,并产生相应的操作控制命令。

c)执行指令:根据分析指令时产生的“操作命令”形成相应的操作控制信号序列,通过运算器,存储器及输入/输出设备的执行,实现每条指令的功能,其中包括对运算结果的处理以及下条指令地址的形成。

将其功能进一步细化,可概括如下:

能对指令进行译码并执行规定的动作;

可以进行算术和逻辑运算;

能与存储器,外设交换数据;

提供整个系统所需要的控制;

尽管各种CPU的性能指标和结构细节各不相同,但它们所能完成的基本功能相同。由功能分析,可知任何一种CPU内部结构至少应包含下面这些部件:

算术逻辑运算部件(ALU),

累加器,

程序计数器,

指令寄存器,译码器,

时序和控制部件。

RISC即精简指令集计算机(ReducedInstructionSetComputer)的缩写。它是一种八十年代才出现的CPU,与一般的CPU相比不仅只是简化了指令系统,而且是通过简化指令系统使计算机的结构更加简单合理,从而提高了运算速度。从实现的途径看,RISC_CPU与一般的CPU的不同处在于:它的时序控制信号形成部件是用硬布线逻辑实现的而不是采用微程序控制的方式。所谓硬布线逻辑也就是用触发器和逻辑门直接连线所构成的状态机和组合逻辑,故产生控制序列的速度比用微程序控制方式快得多,因为这样做省去了读取微指令的时间。RISC_CPU也包括上述这些部件,下面就详细介绍一个简化的用于教学目的的RISC_CPU的可综合VerilogHDL模型的设计和仿真过程。

二、RISC CPU结构

RISC_CPU是一个复杂的数字逻辑电路,但是它的基本部件的逻辑并不复杂。可把它分成八个基本部件:

时钟发生器

指令寄存器

累加器

RISC CPU算术逻辑运算单元

数据控制器

状态控制器

程序计数器

地址多路器

其中时钟发生器利用外来时钟信号进行分频生成一系列时钟信号,送往其他部件用作时钟信号。各部件之间的相互操作关系则由状态控制器来控制。下面逐一介绍各部件的具体结构和逻辑关系。

1 时钟发生器

基于状态机的简易RISC CPU设计

时钟发生器clkgen利用外来时钟信号clk来生成一系列时钟信号clk1、fetch、alu_clk送往CPU的其他部件。其中fetch是外来时钟clk的八分频信号。利用fetch的上升沿来触发CPU控制器开始执行一条指令,同时fetch信号还将控制地址多路器输出指令地址和数据地址。clk1信号用作指令寄存器、累加器、状态控制器的时钟信号。alu_clk则用于触发算术逻辑运算单元。时钟发生器clkgen的波形见下图所示:

基于状态机的简易RISC CPU设计

其VerilogHDL程序见下面的模块:

由于在时钟发生器的设计中采用了同步状态机的设计方法,不但使clk_gen模块的源程序可以被各种综合器综合,也使得由其生成的clk1、clk2、clk4、fetch、alu_clk在跳变时间同步性能上有明显的提高,为整个系统的性能提高打下了良好的基础。

2 指令寄存器

基于状态机的简易RISC CPU设计

顾名思义,指令寄存器用于寄存指令。指令寄存器的触发时钟是clk1,在clk1的正沿触发下,寄存器将数据总线送来的指令存入高8位或低8位寄存器中。但并不是每个clk1的上升沿都寄存数据总线的数据,因为数据总线上有时传输指令,有时传输数据。什么时候寄存,什么时候不寄存由CPU状态控制器的load_ir信号控制。load_ir信号通过ena口输入到指令寄存器。复位后,指令寄存器被清为零。每条指令为2个字节,即16位。高3位是操作码,低13位是地址。(CPU的地址总线为13位,寻址空间为8K字节。)本设计的数据总线为8位,所以每条指令需取两次。先取高8位,后取低8位。而当前取的是高8位还是低8位,由变量state记录。state为零表示取的高8位,存入高8位寄存器,同时将变量state置为1。下次再寄存时,由于state为1,可知取的是低8位,存入低8位寄存器中。

其VerilogHDL程序见下面的模块:

3.累加器

基于状态机的简易RISC CPU设计

累加器用于存放当前的结果,它也是双目运算其中一个数据来源。复位后,累加器的值是零。当累加器通过ena口收到来自CPU状态控制器load_acc信号时,在clk1时钟正跳沿时就收到来自于数据总线的数据。其VerilogHDL程序见下面的模块:

基于状态机的简易RISC CPU设计

4.算术运算器

基于状态机的简易RISC CPU设计

算术逻辑运算单元根据输入的8种不同操作码分别实现相应的加、与、异或、跳转等8种基本操作运算。利用这几种基本运算可以实现很多种其它运算以及逻辑判断等操作。其VerilogHDL程序见下面的模块:

基于状态机的简易RISC CPU设计

5.数据控制器

基于状态机的简易RISC CPU设计

数据控制器的作用是控制累加器数据输出,由于数据总线是各种操作时传送数据的公共通道,不同的情况下传送不同的内容。有时要传输指令,有时要传送RAM区或接口的数据。累加器的数据只有在需要往RAM区或端口写时才允许输出,否则应呈现高阻态,以允许其它部件使用数据总线。所以任何部件往总线上输出数据时,都需要一控制信号。而此控制信号的启、停,则由CPU状态控制器输出的各信号控制决定。数据控制器何时输出累加器的数据则由状态控制器输出的控制信号datactl_ena决定。其VerilogHDL程序见下面的模块:

基于状态机的简易RISC CPU设计

6.地址多路器

基于状态机的简易RISC CPU设计

地址多路器用于选择输出的地址是PC(程序计数)地址还是数据/端口地址。每个指令周期的前4个时钟周期用于从ROM中读取指令,输出的应是PC地址。后4个时钟周期用于对RAM或端口的读写,该地址由指令中给出。地址的选择输出信号由时钟信号的8分频信号fetch提供。其VerilogHDL程序见下面的模块:

基于状态机的简易RISC CPU设计

7.程序计数器

基于状态机的简易RISC CPU设计

程序计数器用于提供指令地址。以便读取指令,指令按地址顺序存放在存储器中。有两种途径可形成指令地址:其一是顺序执行的情况,其二是遇到要改变顺序执行程序的情况,例如执行JMP指令后,需要形成新的指令地址。复位后,指令指针为零,即每次CPU重新启动将从ROM的零地址开始读取指令并执行。每条指令执行完需2个时钟,这时pc_addr已被增2,指向下一条指令。(因为每条指令占两个字节。)如果正执行的指令是跳转语句,这时CPU状态控制器将会输出load_pc信号,通过load口进入程序计数器。程序计数器(pc_addr)将装入目标地址(ir_addr),而不是增2。其VerilogHDL程序见下面的模块:

基于状态机的简易RISC CPU设计

8.状态控制器

基于状态机的简易RISC CPU设计

状态控制器由两部分组成:

状态机(上图中的MACHINE部分)

状态控制器(上图中的MACHINECTL部分)

状态机控制器接受复位信号RST,当RST有效时通过信号ena使其为0,输入到状态机中停止状态机的工作。状态控制器的VerilogHDL程序见下面模块:

基于状态机的简易RISC CPU设计

状态机是CPU的控制核心,用于产生一系列的控制信号,启动或停止某些部件。CPU何时进行读指令读写I/O端口,RAM区等操作,都是由状态机来控制的。状态机的当前状态,由变量state记录,state的值就是当前这个指令周期中已经过的时钟数(从零计起)。指令周期是由8个时钟周期组成,每个时钟周期都要完成固定的操作。

第0个时钟,因为CPU状态控制器的输出:rd和load_ir为高电平,其余均为低电平。指令寄存器寄存由ROM送来的高8位指令代码。

第1个时钟,与上一时钟相比只是inc_pc从0变为1故PC增1,ROM送来低8位指令代码,指令寄存器寄存该8位代码。

第2个时钟,空操作。

第3个时钟,PC增1,指向下一条指令。若操作符为HLT,则输出信号HLT为高。如果操作符不为HLT,除了PC增一外(指向下一条指令),其它各控制线输出为零。

第4个时钟,若操作符为AND、ADD、XOR或LDA,读相应地址的数据;若为JMP,将目的地址送给程序计数器;若为STO,输出累加器数据。

第5个时钟,若操作符为ANDD、ADD或XORR,算术运算器就进行相应的运算;若为LDA,就把数据通过算术运算器送给累加器;若为SKZ,先判断累加器的值是否为0,如果为0,PC就增1,否则保持原值;若为JMP,锁存目的地址;若为STO,将数据写入地址处。

第6个时钟,空操作。

第7个时钟,若操作符为SKZ且累加器值为0,则PC值再增1,跳过一条指令,否则PC无变化。

状态机的VerilogHDL程序见下面模块:

基于状态机的简易RISC CPU设计

9.外围模块

为了对RISC_CPU进行测试,需要有存储测试程序的ROM和装载数据的RAM、地址译码器。下面来简单介绍一下:

地址译码器

基于状态机的简易RISC CPU设计

地址译码器用于产生选通信号,选通ROM或RAM。FFFFH---1800H RAM1800H---0000H ROM

基于状态机的简易RISC CPU设计

ROM用于装载测试程序,可读不可写。RAM用于存放数据,可读可写。

三、RISC CPU中各部件的相互连接关系

基于状态机的简易RISC CPU设计

四、RISC CPU和它的外围电路

基于状态机的简易RISC CPU设计

五、RISC CPU的寻址方式和指令系统

RISC_CPU的指令格式一律为:

基于状态机的简易RISC CPU设计

指令系统仅由8条指令组成:

1)HLT停机操作。该操作将空一个指令周期,即8个时钟周期。

2)SKZ为零跳过下一条语句。该操作先判断当前alu中的结果是否为零,若是零就跳过下一条语句,否则继续执行。

3)ADD相加。该操作将累加器中的值与地址所指的存储器或端口的数据相加,结果仍送回累加器中。

4)AND相与。该操作将累加器的值与地址所指的存储器或端口的数据相与,结果仍送回累加器中。

5)XOR异或。该操作将累加器的值与指令中给出地址的数据异或,结果仍送回累加器中。

6)LDA读数据。该操作将指令中给出地址的数据放入累加器。

7)STO写数据。该操作将累加器的数据放入指令中给出的地址。

8)JMP无条件跳转语句。该操作将跳转至指令给出的目的地址,继续执行。

RISC_CPU是8位微处理器,一律采用直接寻址方式,即数据总是放在存储器中,寻址单元的地址由指令直接给出。这是最简单的寻址方式。

六、RISC CPU的操作和时序

一个微机系统为了完成自身的功能,需要CPU执行许多操作。以下是RISC_CPU的主要操作:

1.系统的复位和启动操作

2.总线读操作

3.总线写操作

下面详细介绍一下每个操作:

1.系统的复位和启动操作

RISC_CPU的复位和启动操作是通过rst引脚的信号触发执行的。当rst信号一进入高电平,RISC_CPU就会结束现行操作,并且只要rst停留在高电平状态,CPU就维持在复位状态。在复位状态,CPU各内部寄存器都被设为初值,全部为零。数据总线为高阻态,地址总线为0000H,所有控制信号均为无效状态。rst回到低电平后,接着到来的第一个fetch上升沿将启动RISC_CPU开始工作,从ROM的000处开始读取指令并执行相应操作。波形图如下图所示。虚线标志处为RISC_CPU启动工作的时刻。

基于状态机的简易RISC CPU设计

RISC_CPU的复位和启动操作波形

2.总线读操作

每个指令周期的前0--3个时钟周期用于读指令,在状态控制器一节中已详细讲述,这里就不再重复。第3.5个周期处,存储器或端口地址就输出到地址总线上,第4--6个时钟周期,读信号rd有效,数据送到数据总线上,以备累加器锁存,或参与算术、逻辑运算。第7个时钟周期,读信号无效,第7.5个周期,地址总线输出PC地址,为下一个指令做好准备。

基于状态机的简易RISC CPU设计

CPU从存储器或端口读取数据的时序

3 写总线操作

每个指令周期的第3.5个时钟周期处,写的地址就建立了,第4个时钟周期输出数据,第5个时钟周期输出写信号。至第6个时钟结束,数据无效,第7.5时钟地址输出为PC地址,为下一个指令周期做好准备。

基于状态机的简易RISC CPU设计

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 指令
    +关注

    关注

    1

    文章

    579

    浏览量

    35372
  • 编程
    +关注

    关注

    88

    文章

    3440

    浏览量

    92383
  • RISC CPU
    +关注

    关注

    0

    文章

    3

    浏览量

    7077

原文标题:基于状态机的简易RISC CPU设计(看完你也可以设计CPU了!)

文章出处:【微信号:wc_ysj,微信公众号:旺材芯片】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    状态机编程

    状态机编程基于状态机的按键输入软件接口设计一般的教课书中给出的按键输入软件接口程序通常非常简单,在程序中一旦检测到按键输入口为低电平时(图9-2),便采用(调用)软件延时程序延时10ms。然后再
    发表于 07-10 18:00

    如何写好状态机

    一篇经典文献,详细讲解了一段、两段、三段式状态机的实现,效率、优缺点。看完后相信会对状态机有一个详细的了解。 状态机是逻辑设计的重要内容,状态机的设计水平直接反应工程师的逻辑功底,所以
    发表于 10-24 11:43

    状态机

    控制状态机控制状态机的初始化和状态转换的最佳方法是使用枚丽型输入控件。一般使用自定义类型的枚丽变量。使用子定义类型的枚丽变量可以是控件和实例乊间存在关联,使得添加或删除状态时所有的枚丽
    发表于 02-13 12:39

    状态机如何暂停

    程序一运行 就开始自动运行程序 状态机各种各种状态开始执行 我这里是布尔变量 每一秒点亮一个布尔按钮。我现在想在界面增加一个暂停按钮 当点暂停时候 此时暂停按钮文字成为继续 如果 状态机执行第二步
    发表于 04-09 09:23

    状态机是什么?什么是消息触发类型的状态机

    状态机可归纳为哪几个要素?状态机可分为哪几种?什么是消息触发类型的状态机
    发表于 04-19 06:02

    什么是状态机状态机是如何编程的?

    什么是状态机状态机是如何编程的?
    发表于 10-20 07:43

    什么是状态机状态机的三种实现方法

    文章目录1、什么是状态机?2、状态机编程的优点(1)提高CPU使用效率(2) 逻辑完备性(3)程序结构清晰3、状态机的三种实现方法switch—case 法表格驱动法函数指针法小节摘要
    发表于 12-22 06:51

    什么是状态机

    一. 什么是状态机我们以生活中的小区的停车系统为例:停车杆一般没车的是不动的(初态),有车来的时候需要抬杆(状态1),车通过需要放杆(状态2),如果在放杆的过程中突然有车,又需要抬杆(状态
    发表于 01-06 08:01

    什么是状态机

    目录1 前言2 状态机2.1 什么是状态机2.2 状态机的概念2.3 使用状态机写键盘的思路3 代码实例3.1 使用软件3.2 protues电路图3.2
    发表于 01-24 06:23

    状态机原理及用法

    状态机原理及用法状态机原理及用法状态机原理及用法
    发表于 03-15 15:25 0次下载

    状态机概述 如何理解状态机

    本篇文章包括状态机的基本概述以及通过简单的实例理解状态机
    的头像 发表于 01-02 18:03 9996次阅读
    <b class='flag-5'>状态机</b>概述  如何理解<b class='flag-5'>状态机</b>

    FPGA:状态机简述

    本文目录 前言 状态机简介 状态机分类 Mealy 型状态机 Moore 型状态机 状态机描述 一段式
    的头像 发表于 11-05 17:58 6229次阅读
    FPGA:<b class='flag-5'>状态机</b>简述

    什么是状态机状态机5要素

    玩单片机还可以,各个外设也都会驱动,但是如果让你完整的写一套代码时,却无逻辑与框架可言。这说明编程还处于比较低的水平,你需要学会一种好的编程框架或者一种编程思想!比如模块化编程、状态机编程、分层思想
    的头像 发表于 07-27 11:23 1.9w次阅读
    什么是<b class='flag-5'>状态机</b>?<b class='flag-5'>状态机</b>5要素

    状态模式(状态机)

    以前写状态机,比较常用的方式是用 if-else 或 switch-case,高级的一点是函数指针列表。最近,看了一文章《c语言设计模式–状态模式(状态机)》(来源:embed linux
    发表于 12-16 16:53 7次下载
    <b class='flag-5'>状态</b>模式(<b class='flag-5'>状态机</b>)

    什么是状态机状态机的种类与实现

    状态机,又称有限状态机(Finite State Machine,FSM)或米利状态机(Mealy Machine),是一种描述系统状态变化的模型。在芯片设计中,
    的头像 发表于 10-19 10:27 4978次阅读