自己动手写CPU - 1

电脑, 手机, 单片机, 都有一个核心部件: CPU.

今天开始学verilog, 就尝试一下动手写一个可以工作的CPU. 目标就是可以计算从1加到10等于几?

分析一下, 大概需要几个指令: Ldr Add Sub Cmp Jmp

第一步, 先写一个运算部件: ALU.

module alu0(
    input [3:0] op,
    input [7:0]  in1,in2,
    output reg [7:0] out1
);

always @ (*) begin    
    case(op)
        1: out1 = in1 + in2;
        2: out1 = in1 - in2;
        3: out1 = in1 & in2;
        4: out1 = in1 | in2;
        5: out1 = (in1 == in2);
        default: out1 = 0;
    endcase
end

endmodule

输入到vivado中, 看一下分析出来的RTL图长什么样吧:

自己动手写CPU - 1_第1张图片

RTL图

从图中可以看出, in1/in2都是8位的操作数, 两组信号被引入到了加法器, 减法器, 与门, 或门, 比较器, 并且分别有了运算输出, 并引入多路选择器, 由op控制最终输出是哪个结果. 和预期是相符的.


CPU运行的临时结果要放在通用寄存器中, 要给它加一组寄存器才行.

而且进行计算时, 输入可以是任意一个寄存器, 输出也可以存入任意一个寄存器.

代码中加入寄存器组.

module alu(
    input [15:0] op,
    input [7:0]  R0,R1,R2,R3,R4,R5,R6,R7,   //R7:Pc
    output [7:0] out1
);

//op说明: 
// 共16bit:  [15:11]操作码  [10:8]目标寄存器索引  [7:0]源寄存器索引 或 立即数
wire [7:0] R[7:0];  // R0-R7组织成寄存器组,  方便用寄存器索引 选择
assign R[0] = R0;
assign R[1] = R1;
assign R[2] = R2;
assign R[3] = R3;
assign R[4] = R4;
assign R[5] = R5;
assign R[6] = R6;
assign R[7] = R7;

reg [7:0] in1,in2, out1;
always @ (*) begin
    in1 = R[op[10:8]];
    in2 = op[11]? R[op[2:0]] : op[7:0];
end

always @ (*) begin 
    case(op[15:12])
        0: out1 = in2;          // ldr
        1: out1 = in1 + in2;    // add
        2: out1 = in1 - in2;    // sub
        3: out1 = in1 & in2;    // and
        4: out1 = in1 | in2;    // or
        5: out1 = (in1 == in2);  // cmp
        default: out1 = 0;
    endcase
end

endmodule

定义了8个寄存器, R0,R1,R2,R3,R4,R5,R6,R7, 并且编成组.

op也变宽了, 里面[15:11]存操作码, 4位共支持16条指令, [10:8]放目标寄存器索引, [7:0]放源寄存器索引 或 立即数.

先根据 [10:8]和[7:0]从寄存器组中取出操作数in1和in2, 后面的代码不变.

输入Vivado, 生成RTL如下图:

自己动手写CPU - 1_第2张图片

从图上可以看出, 上面的MUX是8选1, 选中源操作数, 连接到后面的MUX是2选1, 因为这一路也可能是立即数. 立即数是从op解出来的, 即op[7:0].

下面的MUX是8选1, 选中另一个操作数.

两个操作数进入计算逻辑, 分别有计算结果, 最终输出选哪一个, 由最右边的MUX根据op[15:12]决定.

目标寄存器, 这里还没有体现, 因为目前代码全部是组合逻辑. 存入目标寄存器是根据op[10:8]将out1存入相应寄存器, 还需要有clk信号. 后面会加入.

已更新:

自己动手写CPU - 2-CSDN博客icon-default.png?t=O83Ahttps://blog.csdn.net/weixin_46766770/article/details/144935050

自己动手写CPU - 3-CSDN博客icon-default.png?t=O83Ahttps://blog.csdn.net/weixin_46766770/article/details/144935080

你可能感兴趣的:(自己动手写CPU,fpga开发)