简单的CPU取指执行电路设计

简单的CPU取指执行电路设计

 

原创 巩文宏 数字积木 2019-10-17

 

【前言】最近手上写了一个练手的小项目,项目的大致要求是实现一个取指,执行电路。取指的指令预存在,从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中

顶层代码如图所示:

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

下面的ram模块的代码:

状态控制模块的代码:

计数器模块的代码:

设计说明 该工程有以下模块组成: 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模块中,储存有初始化的指令数据。 仿真结果如下图:

 

关注公众号:“数字积木”,获取更多精彩内容,技术干货。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我会尽力回答你的问题。单周期 CPU取指电路CPU 中非常重要的一部分,它的主要作用是从存储器中读取指令,并将其传递给 CPU 执行。在 Verilog 中实现单周期 CPU取指电路的设计,可以分为以下几个步骤: 1. 定义输入输出端口 根据单周期 CPU 的要求,我们需要定义一个输入端口 PC,以及两个控制信号 Reset 和 Clock,输出端口 instruction。在 Verilog 中,可以使用以下语句来定义输入输出端口: ``` module fetch( input [31:0] PC, input Reset, input Clock, output [31:0] instruction ); ``` 2. 定义内部寄存器 为了实现取指电路的功能,我们需要定义一些内部寄存器来保存中间结果。具体来说,我们需要定义一个寄存器来保存读取的指令地址,以及一个寄存器来保存指令。在 Verilog 中,可以使用以下语句来定义寄存器: ``` reg [31:0] inst_addr; reg [31:0] inst; ``` 3. 实现取指逻辑 在实现取指逻辑时,我们需要根据 PC 寄存器中保存的地址,从存储器中读取指令。具体来说,我们可以使用以下语句实现取指逻辑: ``` always @(posedge Clock) begin if (Reset) begin // 复位指令地址寄存器和指令寄存器 inst_addr <= 0; inst <= 0; end else begin // 从存储器中读取指令 inst_addr <= PC; inst <= mem[inst_addr]; end end ``` 在上述代码中,我们使用了 always@(posedge Clock) 的语句块来实现时钟上升沿触发的逻辑,根据 Reset 信号的值来进行复位操作。当 Reset 为 1 时,我们需要将指令地址寄存器和指令寄存器的值都清零;当 Reset 为 0 时,我们从存储器中读取对应的指令。 4. 输出指令 最后,我们需要将读取的指令输出到端口 instruction 上。可以使用以下语句实现: ``` assign instruction = inst; ``` 这样,我们就完成了单周期 CPU取指电路的设计。在单周期 CPU 中,取指电路只需要读取指令并将其传递给下一级处理器即可。其它的功能,如译码、执行等,需要在后续的阶段中实现。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值