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

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

3天内不再提示

一个简单的8位处理器完整设计过程及verilog代码

FPGA之家 来源:EETOP 作者:EETOP 2023-04-10 11:43 次阅读

一个简单的8位处理器完整设计过程及verilog代码,适合入门学习参考,并含有作者个人写的指令执行过程。

1. CPU定义

我们按照应用的需求来定义计算机,本文介绍一个非常简单的CPU的设计,它仅仅用来教学使用的。我们规定它可以存取的存储器为64byte,其中1byte=8bits。所以这个CPU就有6位的地址线A[5:0],和8位的数据线D[7:0]。

我们仅定义一个通用寄存器AC(8bits寄存器),它仅仅执行4条指令如下:

Instruction Instruction Code Operation
ADD 00AAAAAA AC<—AC+M[AAAAAA]
AND 01AAAAAA AC<—AC^M[AAAAAA]
JMP 10AAAAAA GOTO AAAAAA
INC 11XXXXXX AC<—AC+1

除了寄存器AC外,我们还需要以下几个寄存器:

地址寄存器A[5:0],保存6位地址。

程序计数器PC[5:0],保存下一条指令的地址。

数据寄存器D[7:0],接受指令和存储器来的数据。

指令寄存器IR[1:0],存储指令操作码。

2.取指设计

在处理器执行指令之前,必须从存储器取出指令。其中取指执行以下操作:

1〉通过地址端口A[5:0]从地址到存储器

2〉等待存储器准备好数据后,读入数据。

由于地址端口数据A[5:0]是从地址寄存器中读出的,所以取指第一个执行的状态是

Fetch1: AR<—PC

接下来cpu发出read信号,并把数据从存储器M中读入数据寄存器DR中。同时pc加一。

Fetch2: DR<—M,PC<—PC+1

接下来把DR[7:6]送IR,把DR[5:0]送AR

Fetch3: IR<—DR[7:6],AR<—DR[5:0]

eaa987dc-d66e-11ed-bfe3-dac502259ad0.png

3.指令译码

Cpu在取指后进行译码一边知道执行什么指令,对于本文中的CPU来说只有4条指令也就是只有4个执行例程,状态图如下:

eaba69ee-d66e-11ed-bfe3-dac502259ad0.png

4.指令执行

对译码中调用的4个例程我们分别讨论:

4.1 ADD指令

ADD指令需要CPU做以下两件事情:

1〉从存储器取一个操作数

2〉把这个操作数加到AC上,并把结果存到AC

所以需要以下操作:

ADD1:DR<—M

ADD2:AC<—AC+DR

4.2 AND指令

AND指令执行过程和ADD相似,需要以下操作:

AND1:DR<—M

AND2:AC<—AC^DR

4.3 JMP指令

JMP指令把CPU要跳转的指令地址送PC,执行以下操作

JMP1: PC<—DR[5:0]

4.4INC指令

INC指令执行AC+1操作

INC1: AC<—AC+1

总的状态图如下:

eacdc584-d66e-11ed-bfe3-dac502259ad0.png

5 建立数据路径

这一步我们来实现状态图和相应的寄存器传输。首先看下面的状态及对应的寄存器传输:

Fetch1: AR<—PC

Fetch2: DR<—M,PC<—PC+1

Fetch3: IR<—DR[7:6],AR<—DR[5:0]

ADD1:DR<—M

ADD2:AC<—AC+DR

AND1:DR<—M

AND2:AC<—AC^DR

JMP1: PC<—DR[5:0]

INC1: AC<—AC+1

为了设计数据路径,我们可以采用两种办法:

1〉创造直接的两个要传输组件之间的直接路径

2〉在CPU内部创造总线来传输不同组件之间的数据

首先我们回顾一下可能发生的数据传输,以便确定各个组件的功能。特别的我们要注意把数据载入组件的各个操作。首先我们按照他们改变了那个寄存器的数据来重组这些操作。得到如下的结果:

AR:AR<—PC;AR<—DR[5:0]

PC:PC<—PC+1;PC<—DR[5:0]

DR:DR<—M

IR:IR<—DR[7:6]

AC:AC<—AC+DR;

AC<—AC^DR;

AC<—AC+1

现在我们来看每个操作来决定每个组件执行什么样的功能,AR,DR,IR三个组件经常从其他的组件载入数据(从总线),所以只需要执行一个并行输入的操作。PC和AC能够载入数据同时也能够自动加一操作。

下一步我们把这些组件连接到总线上来,如图所示:

eae5e9d4-d66e-11ed-bfe3-dac502259ad0.png

如上图所示,各个组件与总线之间通过三态连接,防止出现总线竞争。AR寄存器送出存储器的地址,DR寄存器用于暂存存数起来的数据。到现在为止我们还没有讨论有关的控制信号,我们现在只是保证了所有的数据传输能够产生,我们将在后面章节来使这些数据传输正确的产生---控制逻辑。

现在我们来看以下者写数据传输中有没有不必要的传输:

1〉 AR仅仅提供数据给存储器,所以他不需要连接到总线上。

2〉 IR不通过总线提供数据给任何组件,所以他可以直接输出到控制单元(后面章节)。

3〉 AC不提供数据到任何的组件,可以不连接到总线上。

4〉总线是8bit宽度的,但是有些传输是6bit或者2bit的,我们必须制定寄存器的那几位送到总线的那几位。

5〉 AC要可以载入AC和DR的和或者逻辑与的值,数据路径中还需要进行运算的ALU。

由此我们做以下工作:

1〉去掉AR,IR, AC与总线的连接。

2〉我们约定寄存器连接是从总线的低位开始的。AR,PC连接到Bus[5:0],由于IR是接受DR[7:6]的,所以可以连接到总线的Bus[7:6]。

3〉我们设定,AC作为ALU的一个输入,另一个输入来自总线Bus。

下面我们检查是否有争用总线的情况,幸运的是这里没有。修改后的CPU内部组织图如下:

eaf6059e-d66e-11ed-bfe3-dac502259ad0.png

6. ALU设计

这个CPU的ALU执行的功能就是两个操作数相加、逻辑与。这里不作详细介绍。电路如如下:

eb0b8720-d66e-11ed-bfe3-dac502259ad0.png

7. 控制单元

现在我们来考虑如何产生数据路径所需的控制信号,有两种方法:硬布线逻辑和为程序控制。这里我们用硬布线逻辑来实现。

这个简单的CPU需要的控制逻辑由三个部件组成:

1〉计数器:用于保存现在的状态

2〉译码器:生成各个状态的控制信号

3〉其他的组合逻辑来产生控制信号

一个通用的控制单元原理图如下:

eb1bd594-d66e-11ed-bfe3-dac502259ad0.png

对于这个CPU来说,一共有9个状态。所以需要一个4bit的计数器和一个4-16的译码器。接下来的工作就是按照前面的状态转换图来对状态进行赋值。

首先考虑如何的对译码输出状态进行赋值才能达到最佳状态。我们按照以下规则:

1〉给Fetch1赋计数器的0值,并用计数器的清零端来达到这个状态。由这个CPU的状态图可以看出,除了Fetch1状态外的状态都只能由一个状态转化而来,Fetch1需要从4个分支而来,这4个分支就可以发出清零信号(CLR)来转移到Fetch1。

2〉把连续的状态赋连续的计数器值,这样就可以用计数器的INC输入来达到状态的转移。

3〉给每个例程的开始状态赋值时,要基于指令的操作码和这个例程的最大状态数。这样就可以用操作码来生成计数器的LD信号达到正确的状态转移。首先,在Fetch3状态发出LD信号,然后要把正确的例程地址放到计数器的输入端。对这个CPU来说,我们考虑以地址1 [IR] 0作为计数器的预置输入。则得到状态编码如下:

Instruction State IR counter
Fetch Fetch1 0000
Fetch2 0001
Fetch3 0010
ADD ADD1 00 1000
ADD2 00 1001
AND AND1 01 1010
AND2 01 1011
INC INC1 10 1100
JMP JMP1 11 1110

如上表所示,下面我们需要设计产生计数器的LD、INC、CLR等信号,总的控制单元的逻辑如下图:

eb30203a-d66e-11ed-bfe3-dac502259ad0.png

下面我们用这些译码信号来产生数据路径控制所必需的AR、PC、DR、IR、M和ALU的控制信号。首先考虑寄存器AR,他在Fetch1状态取PC的值,并在Fetch3状态取DR[5:0]的值,所以我们得到ARLOAD=Fetch1 or Fetch3。以此类推我们可以得到如下结果:

PCLOAD=JMP1

PCINC=Fetch2

DRLOAD=Fetch1or ADD1 or AND1

ACLOAD=ADD2 or AND2

IRLOAD=Fetch3

对于ALU的控制信号ALUSEL是用来控制ALU做逻辑或者算数运算的,所以有:

ALUSEL=AND2

对于片内总线的控制较为复杂,我们先来看DR,对于DR他只在Fetch3、AND2 、ADD2和JMP1状态占用总线进行相信的数据传输,所以有:

DRBUS=Fetch3 or AND2 or ADD2 or JMP1

其他类似有:

MEMBUS=Fetch2or ADD1 or AND1

PCBUS=Fetch1

最后,控制单元需要产生存储器的读信号(READ),它发生在Fetch2、ADD1、AND1三个状态:

READ=Fetch2or ADD1 or AND1

这样我们得到了总的控制逻辑,完成了整个CPU的设计。

8.设计验证

我们执行如下指令进行设计验证,

0:ADD4

1:AND5

2:INC

3:JMP0

4:27H

5:39H

指令执行过程如下(初始化所有寄存器为全零态):

Instruction State Active Signals Operations Next State
ADD 4 Fetch1 PCBUS、ARLOAD AR<—0 Fetch2
Fetch2 READ、MEMBUS
DRLOAD、PCINC
DR<—04H
PC<—PC+1
Fetch3
Fetch3 DRBUS、ARLOAD
IRLOAD
IR<—00
AR<—04H
ADD1
ADD1 READ、MEMBUS
DRLOAD
DR<—27H ADD2
ADD2 DRBUS、ACLOAD AC<—0+27H Fetch1
AND 5 Fetch1
Fetch2
Fetch3
ADD1
ADD2
INC Fetch1
Fetch2
Fetch3
INC1
JMP 0 Fetch1
Fetch2
Fetch3
JMP1

审核编辑:汤梓红

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

    关注

    68

    文章

    19265

    浏览量

    229677
  • 寄存器
    +关注

    关注

    31

    文章

    5336

    浏览量

    120257
  • Verilog
    +关注

    关注

    28

    文章

    1351

    浏览量

    110078
  • 指令
    +关注

    关注

    1

    文章

    607

    浏览量

    35696
  • 代码
    +关注

    关注

    30

    文章

    4780

    浏览量

    68539

原文标题:一个简单的8位处理器完整设计过程及verilog代码

文章出处:【微信号:zhuyandz,微信公众号:FPGA之家】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    新战局,解析64位处理器以及未来发展趋势

    就目前而言,64位处理器对于用户来说,并没有太大的意义。不过在未来,或许手机真的需要8GBRAM甚至更高的RAM时,64位处理器及系统应用才能真正得到性能上的发挥,让用户真正的体验到64位处理
    发表于 10-03 13:30 1656次阅读

    32嵌入式处理器8位处理器应用开发的区别

    32的RISC嵌入式处理器非常大的优势,为嵌入式设计带来丰富的硬件功能和额外的性能,已经成为嵌入式应用和设计的主流。而8位处理器通常受到的64K软件限制也不存在了,设计者几乎可以任意
    发表于 09-22 10:42 1569次阅读

    详细解析32嵌入式处理器8位处理器应用开发的不同之处

    目前,国内熟悉8位处理器开发的工程师非常多,开发工具和手段也很丰富,并且价格较低。而32位处理器的开发与8位处理器的开发则有着许多明显的不同
    的头像 发表于 02-07 09:14 8495次阅读

    32位处理器可以装64系统吗 32位处理器能否装64系统分析

    32位处理器可以装64系统吗?从威廉希尔官方网站 角度看,32位处理器是不能装64系统的,因为不支持,不确定的用户可以使用下面的两种方法来检查32位处理器
    发表于 06-28 09:57

    32位处理器的开发与8位处理器的开发有哪些明显的不同?

    32位处理器的开发与8位处理器的开发有哪些明显的不同?开发32的嵌入式系统需要哪些工具和环
    发表于 04-19 08:11

    何谓32位处理器

    32位处理器首先处理器都是8的倍数:8/16/32/64。表示时钟周期里,
    发表于 07-13 08:41

    Intel 32位处理器 ,Intel 32位处理器结构原理

    Intel 32位处理器 ,Intel 32位处理器结构原理是什么? 微型计算机中的运算和控制合起来称为CPU,因CPU通常集成在
    发表于 03-26 15:05 1983次阅读

    Intel 64位处理器,Intel 64位处理器结构原理

    Intel 64位处理器,Intel 64位处理器结构原理 现在人们广泛使用的是由32处理器构成的计算系统,但是32的计算和操作系统
    发表于 03-26 15:07 3306次阅读

    AMD 32位处理器,AMD 32位处理器有哪些系列?

    AMD 32位处理器,AMD 32位处理器有哪些系列? AMD,这个成立于1969年、总部位于美国加利福尼亚州桑尼维尔的处理器厂商,经过多年不懈地
    发表于 03-26 15:14 4209次阅读

    8位处理器上实现高效文件系统

    8位处理器上实现fat fat12 fat16 fat32的高效文件系统
    发表于 12-30 15:37 0次下载

    华清远见FPGA代码-使用函数实现简单的八位处理器

    华清远见FPGA代码-使用函数实现简单的八位处理器
    发表于 10-27 18:07 4次下载

    “硬件软件化”,32位处理器的开发与8位处理器的开发资料下载

    电子发烧友网为你提供“硬件软件化”,32位处理器的开发与8位处理器的开发资料下载的电子资料下载,更有其他相关的电路图、源代码、课件教程、中文资料、英文资料、参考设计、用户指南、解决方案
    发表于 04-22 08:55 6次下载
    “硬件软件化”,32<b class='flag-5'>位处理器</b>的开发与<b class='flag-5'>8</b><b class='flag-5'>位处理器</b>的开发资料下载

    到底64位处理器和32位处理器有什么区别呢?资料下载

    电子发烧友网为你提供到底64位处理器和32位处理器有什么区别呢?资料下载的电子资料下载,更有其他相关的电路图、源代码、课件教程、中文资料、英文资料、参考设计、用户指南、解决方案等资料,希望可以帮助到广大的电子工程师们。
    发表于 04-25 08:47 8次下载
    到底64<b class='flag-5'>位处理器</b>和32<b class='flag-5'>位处理器</b>有什么区别呢?资料下载

    VisualDSP++3.5 16位处理器加载手册

    VisualDSP++3.5 16位处理器加载手册
    发表于 05-11 17:11 2次下载
    VisualDSP++3.5 16<b class='flag-5'>位处理器</b>加载<b class='flag-5'>器</b>手册

    适用于16位处理器的VisualDSP++3.5入门指南

    适用于16位处理器的VisualDSP++3.5入门指南
    发表于 05-18 12:50 9次下载
    适用于16<b class='flag-5'>位处理器</b>的VisualDSP++3.5入门指南