总算解决一大心头之患了,比想象中容易,通宵两夜,刷完了十个实验,这个实验就是最后的了。感慨颇多。特地写篇总结。
想做一件事,就立马去做把。你会发现没那么困难,往往最大的困难,是心里的困难。
培养了
HDL(Hardware Description Language)
思维,并行
,串行
混合。它先是一个电路
,再才是一个程序
,电路
为主,程序
为辅,用RTL
的思维去思考。这个实验也不怎么难,就是一个大的模拟题,当年ACM给我良好的代码功底受益颇多。
能硬件级别揣摩CPU的一点点运行方式,但是还有很多疑问,需要看书去解决。
这次的实验只是在心里面扎了一个种子(种子当然很重要啦~),需要看完CSAPP,和硬件/软件接口那两本书才能成长为苍天大树。
实验驱动型+看书解决型,现阶段最好的学习方法了~
以下是本次实验的数据通路
module cpu
module cpu(clk,reset,ALU_OP,inst,rs,rt,rd,rs_data,rt_data,rd_data,ZF,OF,Write_Reg,PC,PC_new,rd_rt_s,W_Addr,imm,W_Data,imm_s,imm_data
,ALU_B,rt_imm_s,Mem_Write,M_R_Data,ALU_Data,alu_mem_s,w_r_s,wr_data_s,PC_s,address);
input wire clk;
input reset;
output [2:0] ALU_OP; //操作符
output [31:0] inst; //指令存放
output [4:0] rs; //rs地址
output [4:0] rt; //rt地址
output [4:0] rd; //rd地址
output [31:0] rs_data; //rs数据
output [31:0] rt_data; //rt数据
output [31:0] rd_data; //rd数据
output [31:0] PC;
output [31:0] PC_new;
output ZF;
output OF;
output Write_Reg; //是否写入
output [31:0] W_Data;
output rd_rt_s; //控制那个作为目的寄存器
output [4:0]W_Addr;//目的操作数地址
output [15:0] imm; //立即数
output [31:0] imm_data;//被扩展的立即数
output imm_s;//是否需要扩展
output rt_imm_s; //B端选择rt或者是imm
output [31:0] ALU_B; //ALU_B端口数据
output Mem_Write; //是否写入数据rom
output [31:0]M_R_Data;//从数据rom读出来的数据
output [31:0]ALU_Data;//ALU运算出来的结果,根据alu_mem_s选择由M_W_Data或者W_Data来赋值
output alu_mem_s;//看上面
output [1:0] w_r_s;
output [1:0] wr_data_s;
output [1:0] PC_s;//PC选择器
output [25:0] address;//地址解析数据
//读指令
ex7 pc (
.clka(clk),
.douta(inst),
.rst(reset),
.PC(PC),
.PC_new(PC_new),
.PC_s(PC_s),
.R_Data_A(rs_data),
.imm_data(imm_data),
.address(address)
//解析指令
);
analysis_inst analysis_inst(
.inst(inst),
.ALU_OP(ALU_OP),
.rs(rs),
.rt(rt),
.rd(rd),
.Write_Reg(Write_Reg),
.imm(imm),
.rd_rt_s(rd_rt_s),
.imm_s(imm_s),
.rt_i