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

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

3天内不再提示

你们会设计CPU取指执行电路吗?

FPGA之家 来源:数字积木 作者:数字积木 2021-07-27 16:55 次阅读

【前言】

最近手上写了一个练手的小项目,项目的大致要求是实现一个取指,执行电路。取指的指令预存在,从ROM中读取指令后,根据预定的解码规则,对指令进行解码,并执行相对应的操作。发出来和大家共同分享。

该工程的设计要求如下:

ram模块中,储存有初始化的指令数据。我们要设计一个取指电路,并能根据不同的指令执行不同的操作。指令数据为16bit.

指令编码定义如下:

如果指令代码为0,则下一个状态为空闲。如果指令的低位8位为0,高位8位非0,则读取指定高位8位的存储器,并将其写入obuf0。如果指令的低8位非0,且高8位也不是0,则将下8位作为数据,写入地址为上8位的存储器中。

List4显示了指令获取电路。它实例化了五个模块:PC0(程序计数器、8位计数器)、Ir0(指令寄存器、16位计数器)、OBUF0(输出缓冲器、16位计数器)、STATE0(状态机)和RAM0(存储器,8位256字块RAM)。模块pc0用于指定要读取的地址,以便从ram0获取(提取)指令代码。指令代码存储在IR0中。

此指令获取操作在两种状态下执行:fetcha和fetchb。fetcha用于取地址操作,该地址作为读取ram中指令的地址,fetchb用于指令寄存操作,将指令寄存到指令寄存器中。

在execa和execb状态下,执行表1中的操作。如果存储在IR0中的指令代码为0,则下一个状态为空闲。如果指令的低位8位为0,高位8位非0,则读取指定高位8位的存储器,并将其写入obuf0。如果指令的下8位非0,则将下8位写入地址为上8位的存储器。

指令解码列在table1中

顶层代码如图所示:

下面是该工程的测试模块:

1796e308-eb92-11eb-a97a-12bb97331649.jpg

下面的ram模块的代码:

17b49bb4-eb92-11eb-a97a-12bb97331649.jpg

状态控制模块的代码:

17c181d0-eb92-11eb-a97a-12bb97331649.png

计数器模块的代码:

17d38f1a-eb92-11eb-a97a-12bb97331649.png

设计说明

该工程有以下模块组成:

PC0(程序计数器、8位计数器)、

Ir0(指令寄存器、16位计数器)、

OBUF0(输出缓冲器、16位计数器)、

STATE0(状态机)、

RAM0(存储器,8位256字块RAM)。

其中,PC0,IR0,OBUF0是例化计数器模块得到的,该计数器模块拥有计数和寄存数据两个功能,分别由端口 inc 和 端口 load 控制。

当 inc有效时,在下一个时钟,会将计数器内部的计数器自增1,并在q端输出。

当load信号有效时,在下一个时钟会将D端 的数据寄存到该计数器的寄存器中,并在Q端输出。

PC0利用的是计数器的计数功能,用于产生取指令的地址信息

IR0利用的是计数器的寄存功能,用于将ram中取出的指令暂时寄存。

OBUF0利用的是计数器的寄存功能,用于将输出中暂时寄存。

在状态机控制模块中,设置了以下五个状态:

IDLE:空闲态。

FETCHA:取地址状态。同时将程序计数器的内部计数值加一。

FETCHB:取指令,指令寄存状态。将从ram中读出的指令写入到指令寄存器模块中。

EXECA:指令解码模块,判断指令的停止,读,写控制信号。如果为写信号,将指令的低8位作为数据写到高8位对应的地址中。如果为读指令,跳转到EXECB状态,将指令的低8位输出。如果停止信号为真3,跳转到空闲状态。

EXECB:执行状态。用于将指令的低8位输出。

在ram模块中,储存有初始化的指令数据。

编辑:jq

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

    关注

    68

    文章

    10436

    浏览量

    206524

原文标题:简单的CPU取指执行电路设计

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

收藏 人收藏

    评论

    相关推荐

    verilog中for循环是串行执行还是并行执行

    在Verilog中,for循环是并行执行的。Verilog是一种硬件描述语言,用于描述和设计数字电路和系统。在硬件系统中,各个电路模块是同时运行的,并且可以并行执行多个操作。因此,在V
    的头像 发表于 02-22 16:06 645次阅读

    处理器和cpu是一个东西吗 cpu和主板的区别

    处理器和CPU是一个东西,CPU是指中央处理器(Central Processing Unit)的简称,是计算机的核心部件,负责执行各种计算任务。 CPU是计算机硬件中的一个重要组成部
    的头像 发表于 01-19 09:52 3306次阅读

    secondary cpu执行流程介绍

    secondary cpu执行流程 aarch64架构secondary cpu的内核入口函数为secondary_entry(arch/arm64/kernel/head.S),以下为其执行
    的头像 发表于 12-05 16:12 333次阅读
    secondary <b class='flag-5'>cpu</b><b class='flag-5'>执行</b>流程介绍

    cpu执行程序内部变化

    CPU(Central Processing Unit)是计算机的核心部件之一,它负责执行计算机程序的指令,并进行数据处理和控制操作。CPU执行程序时会经历一系列复杂的内部变化。本文
    的头像 发表于 12-05 11:26 334次阅读

    C语言在单片机中是如何执行

    或许我们平时大多数学习C语言都是在Windows环境下学习的,对于程序执行的底层逻辑了解的不是非常清楚,所以本文在这里给大家介绍一下,C语言在单片机中是如何执行的。 Part1CPU与外设 我们知道
    的头像 发表于 11-24 15:45 1064次阅读
    C语言在单片机中是如何<b class='flag-5'>执行</b>的

    系统复位后单片机从哪个单元开始指令执行程序?

    大佬帮忙解答下,系统复位后单片机从哪个单元开始指令执行程序?
    发表于 10-31 07:10

    请问单片机的main函数是执行一次还是反复执行

    motor = 0;//电机停 } 按程序逻辑,电机应该是运行一就停止的,但是下载到板子之后,电机一直运行。 在程序最后加了while死循环之后,电机才运行一之后停止。 请问,单片机的main函数不是只执行一次吗?难道
    发表于 10-23 06:20

    多周期cpu的设计思想是什么?怎样实现cpu多流水线?

    多周期cpu的设计思想是什么?怎样实现cpu多流水线? 多周期cpu的设计思想是针对传统的单周期处理器在执行每条指令时需要花费大量时间等待内存访问,而提出来一种新型的处理器设计思想。多
    的头像 发表于 10-19 16:53 1399次阅读

    单周期cpu和多周期cpu的区别 多周期cpu和流水线的区别

    单周期cpu和多周期cpu的区别 多周期cpu和流水线的区别  单周期CPU和多周期CPU的区别 单周期
    的头像 发表于 10-19 16:53 5999次阅读

    请问单片机的main函数是执行一次还是反复执行

    请问单片机的main函数是执行一次,还是反复执行
    发表于 10-19 06:25

    什么因素影响MCU的代码执行效率?

    都有什么印象影响MCU的代码执行效率
    发表于 10-11 06:30

    Cortex-R82的预器功能分析

    高性能处理器采用硬件数据预取来减少大的主内存延迟对性能的负面影响。有效的预机制可以显著提高缓存命中率。数据预通过在需要数据之前提取数据来提高执行性能。虽然预大大提高了许多程序的性
    发表于 08-09 06:11

    什么是CPU使用率?如何测量CPU使用率?

    CPU 使用率是 CPU 在计算机上执行各种任务和进程所花费的时间量的度量。
    的头像 发表于 08-06 17:07 3010次阅读

    cpu的性能指标有哪些 cpu工作过程哪四步

    时钟频率是CPU内部时钟的频率,以赫兹(Hz)为单位。它表示CPU每秒钟执行的指令数量。较高的时钟频率通常意味着CPU能够更快地执行指令,因
    发表于 07-21 15:17 2612次阅读

    空闲钩子函数执行执行是怎么回事?

    rt_thread_idle_sethook(根据tick灯变化闪烁);空闲函数跑了一,就不再执行,其他线程正常执行
    发表于 05-11 14:38