【verilog】单周期MIPS CPU设计

一、    实验要求

设计一个单周期MIPS CPU,依据给定过的指令集,设计核心的控制信号。依据给定的数据通路和控制单元信号进行设计。

 

二、    实验内容

1.数据通路设计:mips指令格式只有三种:

1)R类型  从寄存器堆中取出两个操作数,计算结果写回寄存器堆

2)I类型  用一个16位的立即数作为一个源操作数

3)J类型  用一个26位的立即数作为跳转的目标地址

根据以上三种类型可以设计相应的数据通路。基本原理如下

 

下面是实现之后的效果

 

 

2.相应模块设计

首先明确应该有哪些主要功能模块

逻辑电路:控制单元,选择器,ALU,符号位扩展单元,branch加法器等

时序电路:PC寄存器,指令/数据存储器,寄存器文件

 

 

对应的主要代码如下:

(1)top模块对各部分的例化:

 

 

下面是具体的主要模块的实现

(2)控制单元

module controlunit(

 input [5:0] opcode,

 input [5:0] funct,          //本实验只考虑add所以暂时用不到这个字段

 

 output reg mem_write,

 output reg mem_toreg,

 output reg branch,

 output reg alu_src,

 output reg reg_dst,

 output reg reg_write,

 output reg [2:0] alu_op,

 output reg jump

 

 );

 

 always@(*)

       case(opcode)

              6'b000000:                        //add

                     begin

                            reg_dst=1;

                            alu_src=0;

                            mem_toreg=0;

                            reg_write=1;

                            mem_write=0;

                            branch=0;

                            alu_op=3'b001;

                            jump=0;

                     end

              6'b001000:                          //addi

                     begin

                            reg_dst=0;

                            alu_src=1;

                            mem_toreg=0;

                            reg_write=1;

                            mem_write=0;

                            branch=0;

                            alu_op=3'b001;

                            jump=0;

                     end

              6'b100011:                        //lw

                     begin

                            reg_dst=0;

                            alu_src=1;

                            mem_toreg=1;

                            reg_write=1;

                            mem_write=0;

                            branch=0;

                            alu_op=3'b001;

                            jump=0;

                     end

              6'b101011:                            //sw

                     begin

                            reg_dst=0;

                            alu_src=1;

                            mem_toreg=0;

                            reg_write=0;

                            mem_write=1;

                            branch=0;

                            alu_op=2'b001;

                            jump=0;

                     end

              6'b000010:                            //jump

                     begin

                            reg_dst=1;

                            alu_src=0;

                            mem_toreg=0;

                            reg_write=0;

                            mem_write=0;

                            branch=1;

                            alu_op=2'b001;

                            jump=1;

                     end

             

              6'b000111:    //bgtz

                     begin

                            reg_dst=1;

                            alu_src=0;

                            mem_toreg=0;

                            reg_write=0;

                            mem_write=0;

                            branch=1;

                            alu_op=2'b001;

                            jump=0;

                     end

                    

                    

              default:

                     begin

                            reg_dst=1;

                            alu_src=0;

                            mem_toreg=0;

                            reg_write=1;

                            mem_write=0;

                            branch=0;

                            alu_op=2'b10;

                     end

       endcase

endmodule

(3)符号位扩展单元

module signextension(num_in,num_out);

 input wire[15:0] num_in;

 output reg[31:0] num_out;

 initial begin

   num_out = 0;

 end

 always @(num_in) begin

      num_out<= {{16{num_in[15]}},num_in[15:0]};

  end

 

endmodule

(4)branch加法器模块

       这里不进行左移操作,与至指令寄存器的设置相关,本实验中指令集寄存器每次读取32位数据,所以不需要像8位那样进行左移。

 

(5)pc自增模块

 

(6)选择器

这里是32位的,还有5位的型号,原理一致较为简单,此不赘述

 

(7)列一下关于两个ram的接口

                    

 

(8)ALU,regfile参见前面几次实验,这里不作分析

 

 

三、    实验验证

1.编写coe文件

根据实验的要求以及个人设计的情况,测试代码如下:

(主要是因为pc寄存器指向的地址是32位而不是8位,所以做了修改,无关算法)

MEMORY_INITIALIZATION_RADIX=16;

MEMORY_INITIALIZATION_VECTOR=

20080000,

200d0014,

8dad0000,

200b0015,

8d6b0000,

200c0015,

8d8c0001,

ad0b0000,

ad0c0001,

21a9fffe,

8d0b0000,

8d0c0001,

016c5020,

ad0a0002,

21080001,

2129ffff,

1d20fff9,

08000011;

 

 

 

测试数据:

MEMORY_INITIALIZATION_RADIX=10;

MEMORY_INITIALIZATION_VECTOR=

0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,3,3;

 

 

 

2.仿真测试

这里主要是对pc的跳转进行分析,发现跳转无误,我们进入到ram里观察执行的情况,下面是dataram:

正好存储了斐波那契数列的前二十个数,符合要求。

 

四、    分析和总结

本实验实现了一个单周期mipscpu,实现了addi、add、lw、sw、bgtz、j六条指令。

实验的关键在于弄清楚cpu以及每条指令的数据通路,还有相应的控制信号的具体赋值。

在具体实现的时候,最为重要的的是确保指令的跳转正确,在此基础上对各个指令的执行debug就轻而易举。

需要注意的是,在实例化的时候各个对应的接口较为繁杂,应当注意不要出错,命名简单易懂。

 

 

  • 11
    点赞
  • 145
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: Verilog单周期MIPS CPU设计是一种基于MIPS指令集架构的CPU设计,采用单周期的执行方式,包括取指、译码、执行、访存和写回等阶段。该设计需要实现MIPS指令集中的各种指令,包括算术运算、逻辑运算、分支跳转、访存等操作。同时,还需要考虑CPU的时序控制、数据通路设计、寄存器堆、ALU等模块的实现。该设计需要对Verilog语言有一定的掌握和理解,同时需要对计算机组成原理和数字电路等相关知识有一定的了解。 ### 回答2: Verilog单周期MIPS CPU设计,是一种基于MIPS结构的中央处理器的设计,使用Verilog硬件描述语言实现。MIPS架构是一种经典的RISC架构,广泛应用于嵌入式系统中。 MIPS CPU设计可以分为指令集架构、流水线结构以及单周期结构三个方面。在单周期结构中,每个指令都需要一个时钟周期完成。整个CPU由多个单元组成,包括PC计数器、指令存储器、寄存器组、ALU等。 具体来说,Verilog单周期MIPS CPU设计需要考虑以下几个方面: 1. 指令存储器的设计。指令存储器是存储指令的地方,需要按照MIPS架构格式存储指令,同时需要设计好指令计数器(PC)。 2. 控制器的设计。控制器是CPU的核心部件之一,用于根据指令控制各个单元的操作。在单周期CPU中,控制器需要根据指令的类型和操作码生成不同的控制信号。 3. 寄存器组的设计。寄存器组是一个非常重要的部分,需要提供32个通用寄存器,同时需要根据指令设计好数据通路,实现寄存器之间的数据传输。 4. ALU的设计。ALU是完成算术和逻辑运算的核心部件,需要支持基本的加减乘除、移位、与或非等操作。 5. 数据通路的设计。数据通路将各个单元连接在一起,实现了数据的传输和操作。需要根据指令设计好数据通路,保证指令的正确执行。 在完成以上设计后,需要进行仿真和验证。使用Verilog语言的仿真工具进行验证,确保CPU的性能和正确性。最后,完成物理实现后将MIPS CPU与外设进行连接,实现系统的最终功能。 总之,Verilog单周期MIPS CPU设计是一项复杂而重要的工程,需要深入理解MIPS架构,同时也需要综合运用Verilog的各种知识和技术。它的设计和实现对于嵌入式系统的发展有着非常重要的意义。 ### 回答3: Verilog单周期MIPS CPU设计是基于MIPS架构的单周期CPU设计,这种CPU可以实现多种寄存器、指令和内存等常用的微处理器功能。MIPS CPU在计算机硬件领域应用十分广泛。 Verilog单周期MIPS CPU设计可以分为数据通路和控制器两个部分。数据通路包括ALU、存储器、寄存器和地址传输等,控制器则负责产生各种信号来控制CPU的各种行为。 MIPS CPU采用大量寄存器,通过控制器模块控制多路选择器的不同输入,来实现数据传输和指令执行等操作。寄存器制作时需要注意,尽量将读操作和写操作明确分开,避免两者发生竞争引起的问题。 指令的执行则需要根据不同指令的性质进行设置。CPU设计了多路选择器,用于选择正确的指令操作数和操作。再通过ALU进行指令计算,最后将执行结果写回寄存器或者内存中。 总体来说,Verilog单周期MIPS CPU设计需要对MIPS指令集进行深入了解,清楚每条指令的功能和使用方法。然后根据逻辑设计知识,使用Verilog语言编写代码实现具体功能。在设计过程中,要注意各个模块之间的衔接,确保数据和控制信号的流畅处理。 值得注意的是,完成Verilog单周期MIPS CPU设计只是整个设计的开始。接下来需要进行仿真,调试,并将设计映射到硅片上,进行硬件验证和测试。只有这样才能让设计变成可用的CPU,为人们带来实际应用带来便利。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值