基于状态机的简易 RISC CPU 设计
目录
一、什么是 CPU?
二、RISC CPU 结构
1.时钟发生器
2.指令寄存器
3.累加器
4.RISC CPU 算术逻辑运算单元
5.数据控制器
6.状态控制器
7.程序计数器
8.地址多路器
9.外围模块
10.地址译码器
a.RAM
b.ROM
三、RISC CPU 中各部件的相互连接关系
四、RISC CPU 和它的外围电路
五、RISC CPU 的寻址方式和指令系统
六、RISC CPU 的操作和时序
正文
说明:本文是 Verilog 数字系统设计中
的例程(夏宇闻老师)
一、什么是 CPU?
CPU 即中央处理单元的英文缩写,它是计算机的核心部件。计算机进行信
息处理可分为两个步骤:
1.将数据和程序(即指令序列)输入到计算机的存储器中。
2.从第一条指令的地址起开始执行该程序,得到所需结果,结束运行。
CPU 的作用是协调并控制计算机的各个部件执行程序的指令序列,使其有条不
紊地进行。因此它必须具有以下基本功能:
a)取指令:当程序已在存储器中时,首先根据程序入口地址取出
一条程序,为此要发出指令地址及控制信号。
b)分析指令:即指令译码。是对当前取得的指令进行分析,指出
它要求什么操作,并产生相应的操作控制命令。
c)执行指令:根据分析指令时产生的“操作命令”形成相应的操作控
制信号序列,通过运算器,存储器及输入/输出设备的执行,实现每条指令的功
能,其中包括对运算结果的处理以及下条指令地址的形成。
将其功能进一步细化,可概括如下:
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_clk 送往 CPU 的其他部件。其中 fetch 是外来时钟 clk 的
八分频信号。利用 fetch 的上升沿来触发 CPU 控制器开始执行一条指令,同时
fetch 信号还将控制地址多路器输出指令地址和数据地址。clk1 信号用作指令
寄存器、累加器、状态控制器的时钟信号。alu_clk 则用于触发算术逻辑运算
单元。时钟发生器 clkgen 的波形见下图所示:
其 VerilogHDL 程序见下面的模块:
1. module clk_gen (clk,reset,clk1,clk2,clk4,fetch,alu_clk);
2. inputclk,reset;
3. outputclk1,clk2,clk4,fetch,alu_clk;
4. wireclk,reset;
5. regclk2,clk4,fetch,alu_clk;
6. reg[7:0]state;
7. parameterS1=8'b00000001,
8. S2=8'b00000010,
9. S3=8'b00000100,
10. S4=8'b00001000,
11. S5=8'b00010000,
12. S6=8'b00100000,
13. S7=8'b01000000,
14. S8=8'b10000000,
15. idle=8'b00000000;
16. assignclk1=~clk;
17.
18. always@(negedgeclk)
19. if(reset)
20. begin
21. clk2<=0;
22. clk4<=1;
23. fetch<=0;
24. alu_clk<=0;
25. state<=idle;
26. end