单周期cpu设计与实现

来源:互联网 发布:linux设置后不为中文 编辑:程序博客网 时间:2024/05/18 04:54

单周期cpu设计与实现:

    1、原理:

单周期CPU指的是一条指令的执行在一个时钟周期内完成,然后开始下一条指令的执行,即一条指令用一个时钟周期完成

CPU在处理指令时,一般需要经过以下几个步骤:

    (1) 取指令(IF):根据程序计数器PC中的指令地址,从存储器中取出一条指令,同时PC根据指令字长度自动递增产生下一条指令需要的指令地址,但遇到“地址转移”指令时,则控制器把“转移地址”送入PC,当然得到的“地址”需要做些变换才送入PC。

    (2) 指令译码(ID):对取指令操作中得到的指令进行分析并译码,确定这条指令需要完成的操作,从而产生相应的操作控制信号,用于驱动执行状态中的各种操作。

    (3) 指令执行(EXE):根据指令译码得到的操作控制信号,具体地执行指令动作,然后转移到结果写回状态。

    (4) 存储器访问(MEM):所有需要访问存储器的操作都将在这个步骤中执行,该步骤给出存储器的数据地址,把数据写入到存储器中数据地址所指定的存储单元或者从存储器中得到数据地址单元中的数据。

    (5) 结果写回(WB):指令执行的结果或者访问存储器中得到的数据写回相应的目的寄存器中。

每条指令由不同模块功能相互组合而成,模块主要有程序计数器(PC),指令寄存器(rom),寄存器组(register),控制单元(control unit),ALU运算器(ALU),数据存储器(ram),符号或者零拓展模块(extend)以及加法器,移位器和几个二选一数据选择器。

在处理指令时,由PC发出地址,在指令寄存器中寻找相对应的指令,将32位指令分为OP(操作码),rs,rt,rd以及immediate分别传到控制单元,寄存器组以及拓展模块中,根据处理单元发出的aluop,alusrcb等信号,ALU进行运算,数据存储器进行读写,而加法器和移位器则用于给PC下一个地址,进行跳转或者到下一条指令地址。每条指令由这些模块合作执行直到出现指令为halt停机。

2、数据通路图:

3、实验步骤:

(1)在ise中将数据通路图中所有的模块,用.v文件逐一实现。

 以下是部分主要的模块代码:

 pc:(程序计数器)

 

 rom:(指令存储器)仅显示出初始化内容

 

 register:(寄存器组)

 

 ALU:(运算器)

 

 ram:(数据存储器)

 controller:(控制器)case只显示出一部分的代码

 

 此外,模块还需要add(加法器),extend(符号扩展或扩展),mux(选择器),shift(移位器)等等,实现比较容易,不在这里阐述。


(2)创建一个总的.v文件(我将其命名为cpu.v)将步骤(1)中的.v文件一一调用,此步骤相当于用线将各个模块连接起来。

 如图:(只显示出连接部分代码,定义声明出没有显示)

 


(3)创建一个测试文件,调用cpu.v,在文件中对传入cpu的参数进行初始化。

如图:

 

(4)用Simulate Behavioral Model打开波形图进行观察和调试。

 下图为单步执行中看到的波形,以及其中得到的寄存器的数据

 

 



4、实验心得:

   通过本次实验,掌握了单周期cpu数据通路图的构成、原理及其设计方法,利用ISE将每一个模块实现了一遍,对于每一个模块的实现和运作有了更深的理解,掌握了对于cpu的检测方法,熟悉了从cpu的组合到测试到结果的每一个过程。

   在实验过程中,遇到了在always@()中括号里的值的问题,出现了突然触发效果或者一直没有触发效果的情况。对于这个问题,认真的查找了网上的资料,并通过不断的更改其中的值做尝试,解决了问题。

   收获:对于ISE及verilog语言的使用更加熟悉,对于单周期cpu设计,原理等都比只在理论课上听来的更加清晰明白。


5、遗留的问题:

(1)在指令存储器中,每一个单位直接存储了32位数据,按照cpu的真实运作,每一个单位应该存储8位数据即一个字节数据。

(2)传入cpu的参数只有clk和clrn即只有时钟端以及清零端,而真实情况应该是cpu允许传入几乎每一个参数,即接口过少,导致cpu只能做一件事情,那时不合理的,应当有更多的接口。


6、后续:

过几周,我们会有多周期cpu的设计与实现,遗留的问题将在那时候进行改进和解决。















1 0