从零开始设计RISC - CPU——001

这是为了记录我学习Verilog而创立的栏目,如有问题可以讨论

参考书目:Verilog数字系统设计教程 第【4】版,夏宇闻 韩彬 著

开展RISC——CPU设计达到的四个目的:

1.学习RISC——CPU的基本结构和原理

2.了解Verilog HDL仿真和综合工具的潜力

3.展示Verilog设计方法对软/硬件联合设计和验证的意义

4.学习并掌握一些常用的Verilog语法和验证方法

关于RSIC的介绍:

英文全称为(Reduced Instruction Set Computer)中文名:精简指令集计算机。与其他指令集(如复杂指令集计算机,典型的代表就是英特尔的酷睿芯片)相比,这是一种简化了指令系统。其具有的优点是结构简单合理,能够提高运算速度(比如现在最为火热的开源RISC—V)。在实现的途径来看,他的时序控制信号实现的部件采用硬布线逻辑实现而非微程序控制的方式。硬布线逻辑可以理解为是由触发器和逻辑门所构成的状态机和组合逻辑形成的,相比于微程序(需要额外消耗读取微指令的时间而言)产生控制序列更快。

CPU的介绍:

CPU的基本功能:

1.取指令:从已存在存储器中的程序入口地址出发,取出一条指令。

2.分析指令:对取出的指令进行分析,通过此步骤可以判断该指令具有什么样的功能,并且由此产生操作命令。

3.执行指令:根据分析指令的分析结果对CPU内部的运算器,存储器和输入输出设备进行执行,将每一条取出的指令根据分析指令分析的结果进行执行。这里也包括对运算结果的执行和下一条指令地址的形成。

CPU功能细化可以分为:

1.能对指令进行译码并执行规定的动作;

2.可以进行算数和逻辑运算;

3.能与存储器和和外设交换数据;

4.提供整个系统所需的控制。

由以上细化可知CPU必须包含的部分为:

1.算数逻辑运算部件即ALU;

2.累加器;

3.程序计数器(可以方便指令的逐条取出);

4.指令寄存器和译码器;

5.时序和控制部件;

RISC—CPU结构

可以分为以下八个部分:

1.时钟发生器

2.指令寄存器

3.累加器

4.算术逻辑运算单元

5.数据控制器

6.状态控制器

7.程序控制器

8.地址多路器

接下来对八个器件进行逐个分析:

1.时钟发生器

时钟发生器可以利用外来的时钟信号clk进行分频或者倍频的处理生成一系列时钟信号如:clk1,fetch,clk_en。然后将这些信号供给CPU的其他模块使用。

Verilog代码

‘timescale 1ns/1ns
module clk_gen(clk,reset,fetch,alu_clk);/*这里是采用时钟状态机的设计方法时钟模块*/
input clk,reset; /*可以被综合,而且增强了alu_clk,与fetch的同步性*/
output fetch,alu_clk;/*fetch为控制信号,和alu_clk同为8分频信号,当fetch为高电平时,在clk的作用下可以控制一条指令的执行,alu_clk 用于控制算术逻辑单元,clk同样可以作用于指令寄存器累加器状态控制器*/
wire clk,reset;
reg fetch,alu_clk;
reg[7:0] state;
 S1=8’b00000001;
 S2=8’b00000010;
 S3=8’b00000100;
 S4=8’b00001000;
 S5=8’b00010000;
 S6=8’b00100000;
 S7=8’b01000000;
   S8=8’b10000000;
idle=8’b00000000;
always @(poseclk clk)
if (reset)
  begin
   fetch<=0;
   alu_clk<=0;
   state<=idle;
  end
else  /*只要没有复位信号,下面的语句随着clk的上升沿,持续执行*/
  begin/*这里要表达的意思让输出端口的时钟(alu_clk,fetch)信号进行周期性翻转*/
   case(state)
    S1:
     begin
       alu_clk<=1;/*分析可得这里周期是8个clk周期*/
         state<=S2;
     end
    S2:
     begin
       alu_clk<=0;
         state<=S3;
     end
    S3:
     begin
       fetch<=1; /*分析可得这里周期是8个clk周期*/
         state<=S4;
     end
    S4:      state<=S5;
    S5:      state<=S6;
    S6:      state<=S7;
    S7:
     begin
       fetch<=0;
         state<=S8;
     end
    S8:      state<=S1;
    idle:     state<=S1;
    default:  state<=idle;
  endcase
end
endmodule

剩下的7个模块放到下一节

你可能感兴趣的:(硬件工程,dsp开发,fpga开发,mcu)