【计算机组成原理】单周期CPU设计与实现-单指令 CPU

(Verilog)单周期CPU设计

单周期CPU设计与实现原理分析

设计和实现一个支持加法指令的单周期 CPU。要求该加法指令(表示为 add r1,r2,
r3)格式约定如下:
采用寄存器寻址,r1,r2,r3 为寄存器编号,r1 和 r2 存放两个源操作数,r3
为目标寄存器,其功能为[r1] + [r2] -> r3;
指令字长 16 位,操作码和地址码字段分配如下所示:

OpCoder1r2r3

PC模块

module PC(clk,rst,y);
input clk,rst;
output y;
reg[7:0] y;
initial y = 0;
always@(posedge clk or negedge rst)begin
    if(!rst)
        y = 0;
    else
        y = y + 1;
end
endmodule

InsMemory

module InsMemory(Addr,Ins);
input[7:0] Addr;
output Ins;
reg[15:0] Ins;

reg [15:0]unit[8'd255:0];//25616位存储单元
integer i,j;
initial begin
    for(i=0;i<256;i=i+1)begin
        j = i % 5;
        unit[i][2:0] = j+2;
        unit[i][5:3] = j+1;
        unit[i][8:6] = j;
        unit[i][15:9] = i%3;
    end
end
always@(*)begin
     Ins = unit[Addr];
 end 
endmodule

RegFile

module RegFile(
    clk,    //  时钟信号
    RegRW,  //读写信号,为1时写入(上升沿有效),为0时,读数据,
    read_reg1,//要读出数据1的地址
    read_reg2,//要读出数据2的地址
    write_reg,//要写入数据的地址
    write_data,//要写入的数据
    reg1,//要读出的数据1
    reg2//要读出的数据2
    );
    input clk,RegRW;
    input[2:0] read_reg1,read_reg2,write_reg;
    input[15:0] write_data;
    output[15:0] reg1,reg2;
    
    integer i;
    reg[15:0] regfile[7:0];//816位的寄存器
    initial begin
        for(i=0;i<8;i=i+1)
            regfile[i] = 2*i+1;
    end
    always@(posedge clk)begin
        if(RegRW == 1)
            regfile[write_reg] = write_data;
    end
    
    assign reg1 = regfile[read_reg1];
    assign reg2 = regfile[read_reg2];
endmodule

DataMemory

module DataMemory(
    DataRW,//读写信号,当为1时,写入;0时,读出
    DAddr, //读或写的地址
    DataIn,//要写入的数据
    DataOut,//要读出的数据

    );
    input DataRW;
    input[5:0] DAddr;
    input[15:0] DataIn;
    output reg[15:0] DataOut;
   
    reg [15:0] memory[6'd63:0];//6416位存储单元
    integer i;
    initial begin
        for(i=0;i<64;i=i+1)
            memory[i] = i*i;
    end
    always@(*)begin
        if(DataRW)
            memory[DAddr] = DataIn;
         else
            DataOut = memory[DAddr];
    end

endmodule

ALU

module ALU(
    alu_op, //ALU操作控制
    A,      //操作数A
    B,      //操作数B
    result  //运算结果
    );
    input[2:0] alu_op;
    input[15:0] A,B;
    output reg[15:0]result;
    
    always@(*)begin
        case(alu_op)
            3'b000 : result = A+B;
            3'b001 : result = A-B;
            3'b010 : result = A * B;
            3'b011 : result = A / B;
            3'b100 : result = A & B;
            3'b101 : result = A | B;
            3'b110 : result = A ^ B;
            3'b111 : result = A << B;
            default:result = 0;
        endcase
    end
endmodule

ControlUnit

module ControlUnit(
    input[5:0] op, //op操作符
    output reg RegOut,//二路选择器,为1时,输出r1,否则输出r3
    output reg M2Reg,//二路选择器,为1时,输出Mem[addr],否则输出[r1]+[r2]
    output reg RegRW,//寄存器堆读写信号,为1时写入,为0时,读出
    output reg DataMemRW,//数据存储器读写信号,为1时写入,为0时,读出
    output reg[2:0] alu_op//ALU的操作控制信号
    );
    initial begin 
        RegOut = 0;
        M2Reg = 0;
        RegRW = 0;
        DataMemRW = 0;
        alu_op = 0;
    end
    always@(*)begin
        case(op)
            //LDA   取数
            6'b000000:begin
                RegOut = 1;
                M2Reg  = 1;
                RegRW  = 1;
                DataMemRW = 0;
                alu_op = 0;
            end
            
            //ADD   加法
            6'b000001:begin
                RegOut = 0;
                M2Reg  = 0;
                RegRW  = 1;
                DataMemRW = 0;
                alu_op = 0;
            end
            
            //STA   存数
            6'b000010:begin
                RegOut = 0;
                M2Reg  = 0;
                RegRW  = 0;
                DataMemRW = 1;
                alu_op = 0;
            end
            
            
        endcase
    end
endmodule

二路选择器

由于不受时钟信号控制,始终会将r1,r2寄存器中的数据作为ALU的操作数输入,将r1寄存器的数据作为DataMemory的要写入的数据,将DataMemory中地址为addr中的数据读出。当要将数据写入寄存器堆时,要有个3线二路选择器,决定是将从数据存储器中读出的数据写入r1,还是将[r1]+[r2]的结果送入r3。由于要写入的数据有可能是从数据寄存器中读出的数据,也有可能是[r1]+[r2]的结果,所以要有个16线二路选择器决定要写入的数据

module Multiplexer3(
    control,//选择信号,当为1时,输出in1,当为0时,输出in0
    in1,
    in0,
    out
    );
    input control;
    input[2:0] in1,in0;
    output[2:0]out;
    assign out = control == 1 ? in1 : in0;
endmodule
module Multiplexer16(
    control, //选择信号,当为1时,输出in1,当为0时,输出in0
    in1,
    in0,
    out
    );
    input control;
    input[15:0] in1,in0;
    output[15:0] out;
    
    assign out = control ? in1:in0;
endmodule

顶层模块

module SignleCPU(
    input clk,
    input rst,
    output[5:0]op,
    output[2:0] r1,
    output[2:0] r2,
    output[2:0] r3,
    output[5:0]addr,
    output[15:0]ReadData1,
    output[15:0]ReadData2,
    output[15:0]WriteData
    );
    wire[15:0] Ins,DataOut,result;
    wire[7:0]InsAddress;
    wire[2:0] WriteReg,alu_op;
    wire RegOut,M2Reg,RegRW,DataMemRW;
    
    PC pc(clk,rst,InsAddress);
    
    InsMemory insmemory(InsAddress,Ins);
    assign op = Ins[15:9];
    assign r1 = Ins[8:6];
    assign r2 = Ins[5:3];
    assign r3 = Ins[2:0];
    assign addr = Ins[5:0];
    
    RegFile regfile(clk,RegRW,r1,r2,WriteReg,WriteData,ReadData1,ReadData2);
    
    ControlUnit cu(op,RegOut,M2Reg,RegRW,DataMemRW,alu_op);
    
    DataMemory datamem(DataMemRW,addr,ReadData1,DataOut);
    
    ALU alu(alu_op,ReadData1,ReadData2,result);
    
    Multiplexer3 mul3(RegOut,r1,r3,WriteReg);
    Multiplexer16 mul16(M2Reg,DataOut,result,WriteData);
endmodule

Test模块

module Test();
    reg clk,rst;
    wire[2:0] r1,r2,r3;
    wire[5:0]addr;
    wire[15:0] ReadData1,ReadData2,WriteData;
    wire[5:0] op;
    SignleCPU f(clk,rst,op,r1,r2,r3,addr,ReadData1,ReadData2,WriteData);
    initial begin
        clk = 0;rst = 1;
        #40 $stop;
    end
    always #5 clk = ~clk;
endmodule

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

代码
Github
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 16
    点赞
  • 119
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
一、 设计目标 设计目的: 设计一个含有36条指令的MIPS单周期处理器,并能将指令准确的执行并烧写到试验箱上来验证 设计初衷 1、理解MIPS指令结构,理解MIPS指令集中常用指令的功能和编码,学会对这些指令进行归纳分类。 2、了解熟悉MIPS体系中的处理器结构 3、熟悉并掌握单周期处理器CPU的原理和设计 4、进一步加强Verilog语言进行电路设计的能力 二、实验设备 1、装有xilinx ISE的计算机一台 2、LS-CPU-EXB-002教学系统实验箱一台 三、实验任务 1.、学习 MIPS 指令集,深入理解常用指令的功能和编码,并进行归纳确定处理器各部件的控制码,比如使用何种 ALU 运算,是否写寄存器堆等。 2、单周期 CPU 是指一条指令的所有操作在一个时钟周期内执行完。设计中所有寄存器和存储器都是异步读同步写的,即读出数据不需要时钟控制,但写入数据需时钟控制。 故单周期 CPU 的运作即:在一个时钟周期内,根据 PC 值从指令 ROM 中读出相应的指令,将指令译码后从寄存器堆中读出需要的操作数,送往 ALU 模块,ALU 模块运算得到结果。 如果是 store 指令,则 ALU 运算结果为数据存储的地址,就向数据 RAM 发出写请求,在下一个时钟上升沿真正写入到数据存储器。 如果是 load 指令,则 ALU 运算结果为数据存储的地址,根据该值从数据存 RAM 中读出数据,送往寄存器堆根据目的寄存器发出写请求,在下一个时钟上升沿真正写入到寄存器堆中。 如果非 load/store 操作,若有写寄存器堆的操作,则直接将 ALU 运算结果送往寄存器堆根据目的寄存器发出写请求,在下一个时钟上升沿真正写入到寄存器堆中。 如果是分支跳转指令,则是需要将结果写入到 pc 寄存器中的。
### 回答1: 头歌计算机组成原理是一种单总线CPU设计七关的理论模型。单总线是一种计算机内部传输数据的结构,它是指计算机内部各个部件共享同一个总线进行数据传输。而CPU则是计算机的核心部件,负责执行各种指令。 头歌计算机组成原理中的七关是指CPU的七个关键部分。这些部分包括指令寄存器、程序计数器、算术逻辑单元、控制单元、数据寄存器、地址寄存器和数据总线。指令寄存器用于存储当前正在执行的指令,程序计数器则用于存储下一条要执行的指令的地址。算术逻辑单元负责进行各种运算操作,控制单元则负责控制整个CPU的工作。数据寄存器和地址寄存器分别用于存储数据和地址,数据总线则负责在各个部件之间传输数据。 头歌计算机组成原理的单总线CPU设计七关可以更好地理解计算机内部各个部分之间的关系,并为计算机的设计提供指导。通过这种设计CPU的各个部分能够有效协调工作,实现指令的执行和数据的传输。这种设计模型在计算机体系结构中起着重要的作用,帮助人们更好地理解计算机的工作原理。同时,它也为计算机的性能和效率提供了一定的设计指导,使得计算机的运行更加快捷高效。 ### 回答2: 头歌计算机组成原理单总线CPU设计七关是指在计算机硬件设计中,通过完成七个关键步骤来设计单总线CPU结构。 首先,我们需要明确计算机的基本组成部分,包括CPU、内存、输入输出设备等。在设计单总线CPU时,关键是确定如何实现指令的执行和数据的传输。 第一关是指令执行周期的设计。在设计CPU时,需要考虑指令的取指、译码、执行等各个阶段的时间长度,以确保指令能够按顺序执行。 第二关是指令寻址方式的设计。在单总线CPU中,我们需要决定如何使用地址来访问内存中的数据。常见的寻址方式有直接寻址、间接寻址、寄存器寻址等,根据具体需求选择合适的方式来实现指令的执行。 第三关是数据传输的设计。在单总线CPU中,需要确定如何将数据从内存传输到寄存器或其他设备中。常见的数据传输方式有直接传输、DMA传输等,在设计过程中需要权衡各种方式的优劣。 第四关是指令流水线设计。为了提高CPU的运行效率,可以通过流水线技术将指令的执行过程划分为多个阶段,并同时执行不同指令的不同阶段,从而实现指令的并行执行。 第五关是中断处理的设计。在计算机使用过程中,可能会发生各种中断事件,需要设计合适的中断处理机制来处理这些事件。这包括中断向量表的设计、中断响应的优先级等。 第六关是异常处理的设计。与中断不同,异常是指计算机内部的错误或非法操作,需要设计相应的异常处理机制来处理这些异常事件。这包括异常向量表的设计、异常处理程序的编写等。 第七关是CPU性能优化的设计。通过优化运算单元、增加缓存、改进总线传输速度等方式,可以提高单总线CPU的运行速度和性能。 综上所述,头歌计算机组成原理单总线CPU设计七关包括指令执行周期设计、指令寻址方式设计、数据传输设计、指令流水线设计、中断处理设计、异常处理设计CPU性能优化设计。通过完成这七个关键步骤,可以设计出高效可靠的单总线CPU结构。 ### 回答3: 头歌计算机组成原理单总线CPU设计七关主要包括:总线的设计、寄存器的设计、指令的设计、微操作的设计、单总线CPU的存储器设计、单总线CPU的运算器设计以及单总线CPU的控制器设计。 首先是总线的设计,总线是连接计算机各个部件的通信媒介,要进行总线的设计需要确定总线的宽度和工作频率。 其次是寄存器的设计,寄存器是CPU中的数据存储单元,设计时需要确定寄存器的数量和功能,如通用寄存器、指令寄存器等。 指令的设计是单总线CPU设计的重要部分,需要确定指令的格式和操作码,以及指令的执行步骤和时序控制。 微操作的设计是指将指令的各个步骤划分为多个微操作,并为每个微操作设计相应的控制信号,以实现指令的执行。 单总线CPU的存储器设计包括指令存储器和数据存储器的设计,确定存储器的大小和存储器地址的映射方式,并设计相应的存储器控制电路。 单总线CPU的运算器设计主要包括算术逻辑单元(ALU)的设计,确定ALU的功能和运算位宽,并设计相应的运算电路。 最后是单总线CPU的控制器设计,控制器是单总线CPU的指挥中枢,需要确定指令的执行步骤和时序,并设计相应的控制电路和状态寄存器。 以上七关涵盖了单总线CPU设计的关键点和各个部分的设计要求,通过逐步完成这些设计关卡,可以成功设计出符合要求的单总线CPU

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值