简化RISC_CPU设计

  • Post author:
  • Post category:其他


一、什么是CPU?

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

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

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

  1. 取指令:当程序已在存储器中时,首先根据程序入口地址取出一条程序,为此要发出指令地址及控制信号。
  2. 分析指令:即指令译码。是对当前取得的指令进行分析,指出它要求什么操作,并产生相应的操作控制命令。
  3. 执行指令:根据分析指令时产生的“操作命令”形成相应的操作控制信号序列,通过运算器,存储器及输入/输出设备的执行,实现每条指令的功能,其中包括对运算结果的处理以及下条指令地址的形成。

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

  1. 能对指令进行译码并执行规定的动作;
  2. 可以进行算术和逻辑运算;
  3. 能与存储器,外设交换数据;
  4. 提供整个系统所需要的控制;

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

  1. 算术逻辑运算部件(ALU),
  2. 累加器,
  3. 程序计数器,
  4. 指令寄存器,译码器,
  5. 时序和控制部件。

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

二、RISC CPU结构

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

  1. 时钟发生器
  2. 指令寄存器
  3. 累加器
  4. RISC CPU算术逻辑运算单元
  5. 数据控制器
  6. 状态控制器
  7. 程序计数器
  8. 地址多路器

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

1. 时钟发生器

时钟发生器 CLKGEN 利用外来时钟信号clk 来生成一系列时钟信号clk1、fetch、alu_ena 送往CPU的其他部件。

其中fetch是控制信号,clk 的8分频信号。当fetch高电平时,使CLK能出发CPU控制器开始执行一条指令,同时fetch信号还将控制地址多路器输出指令地址和数据地址。clk信号用作指令寄存器、累加器、状态控制器的时钟信号。alu_clk 则用于触发算术逻辑运算单元。时钟发生器clkgen的波形见下图所示:

//clk_gen.v
'timescale 1ns/1ns

module (    
        input  wire      clk,
        input  wire      reset,
        output reg       fetch,
        output reg       alu_ena
        );

reg        [7:0]         state;

parameter                S1 = 8'b00000001,
                         S2 = 8'b00000010,
                         S3 = 8'b00000100,
                         S4 = 8'b00001000,
                         S5 = 8'b00010000,
                         S6 = 8'b00100000,
                         S7 = 8'b01000000,
                         S7 = 8'b10000000,
                       idle = 8'b00000000;

always @(posedge clk)
        if(reset)//高电平复位
            begin
                fetch <= 0;
                alu_ena <= 0;
                state <= idle;
            end
        else
            begin
                case(state)
                    S1:
                        begin
                            alu_ena <= 1;
                            state <= S2;
                        end
                    S2:
                        begin
                            alu_ena <= 0;
                            state <= S3;
                        end
                    S3:
                        begin
                            fetch <= 1;
                            state <= S4;
                        end
                    S4:
                        begin
                            state <= S5;
                        end
                    S5:
                        begin
                            state <= S6;
                        end
                    S6:
                        begin
                            state <= S7;
                        end
                    S7:
                        begin
                            fetch <= 0;
                            state <= S8;
                        end
                    S8:
               



版权声明:本文为m0_58413328原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。