赞
踩
开发环境:Vivado
语言:Verilog
cpu框架:Mips
控制器:组合逻辑
按照预先设计好的数据通路图将各个模块连接起来
- `timescale 1ns / 1ps
- module cpu(
- input clk,
- input reset,
- input [31:0] inst,
- input [31:0] rdata,
- output [31:0] pc,
- output [31:0] addr,
- output [31:0] wdata,
- output IM_R,
- output DM_CS,
- output DM_R,
- output DM_W
- );
- //--------------------------------//控制信号(除有关存储器)
- wire PC_CLK; //
- wire PC_ENA; //
- wire M1; //
- wire M2; //
- wire M3; //
- wire M4; //
- wire M5; //
- wire M6; //
- wire M7; //
- wire M8; //
- wire M9; //
- wire M10; //
- wire M11; //
- wire [3:0] ALUC; //
- wire RF_W; //
- wire RF_CLK; //
- wire C_EXT16; //
- //--------------------------------//运算标志位
- wire zero; //
- wire carry; //
- wire negative; //
- wire overflow; //
- wire add_overflow; //
- //--------------------------------//
- wire [31:0] INS; //译码后指令
- //--------------------------------//数据通路(除有关存储器)
- wire [31:0] D_ALU; //
- wire [31:0] D_PC; //
- wire [31:0] D_RF; //
- wire [31:0] D_Rs; //
- wire [31:0] D_Rt; //
- wire [31:0] D_IM; //
- wire [31:0] D_DM; //
- wire [31:0] D_Mux1; //
- wire [31:0] D_Mux2; //
- wire [31:0] D_Mux3; //
- wire [4:0] D_Mux4; //
- wire [4:0] D_Mux5; //
- wire [31:0] D_Mux6; //
- wire [31:0] D_Mux7; //
- wire [31:0] D_Mux8; //
- wire [31:0] D_Mux9; //
- wire [31:0] D_Mux10; //
- wire D_Mux11; //
- //
- wire [31:0] D_EXT1; //
- wire [31:0] D_EXT5; //
- wire [31:0] D_EXT16; //
- wire [31:0] D_EXT18; //
- wire [31:0] D_ADD; //
- wire [31:0] D_ADD8; //
- wire [31:0] D_NPC; //
- wire [31:0] D_ii; //
- assign PC_ENA = 1;
- //--------------------------------//外部通路连接
- assign pc = D_PC;
- assign addr = D_ALU;
- assign wdata = D_Rt;
-
- //--------------------------------//指令译码
- instr_dec cpu_ins (inst, INS);
- operation cpu_opcode (clk,zero,INS,PC_CLK,IM_R,M1,M2,M3,M4,M5,M6,M7,M9,M10,ALUC,RF_W,RF_CLK,DM_W,DM_R,DM_CS,C_EXT16);
- //--------------------------------//部件
- pcreg pc_out (PC_CLK, reset, PC_ENA, D_Mux1, D_PC);
- alu cpu_alu (D_Mux9, D_Mux10, ALUC[3:0], D_ALU, zero, carry, negative, overflow);
- regfile cpu_ref (RF_CLK, reset, RF_W, overflow, inst[25:21], inst[20:16], D_Mux5, D_Mux6,D_Rs, D_Rt);
- mux cpu_mux1 (D_Mux3, D_Mux2, M1, D_Mux1);
- mux cpu_mux2 (D_NPC, D_ADD, M2, D_Mux2);
- mux cpu_mux3 (D_ii, D_Rs, M3, D_Mux3);
- mux5 cpu_mux4 (inst[10:6], D_Rs[4:0], {INS[30],M4},D_Mux4);
- mux5 cpu_mux5 (inst[15:11],inst[20:16],{INS[30],M5},D_Mux5);
- mux cpu_mux6 (D_Mux7, D_ADD8, M6, D_Mux6);
- mux cpu_mux7 (D_ALU, rdata, M7, D_Mux7);
- mux cpu_mux9 (D_EXT5, D_Rs, M9, D_Mux9);
- mux cpu_mux10 (D_Rt, D_EXT16, M10, D_Mux10);
- extend5 cpu_ext5 (D_Mux4, D_EXT5);
- extend16 cpu_ext16 (inst[15:0], C_EXT16, D_EXT16);
- extend18 cpu_ext18 (inst[15:0], D_EXT18);
- add cpu_add (D_EXT18, D_NPC, D_ADD, add_overflow);
- add8 cpu_add8 (D_PC, D_ADD8);
- npc cpu_npc (D_PC, reset, D_NPC);
- II cpu_ii (D_PC[31:28],inst[25:0], D_ii);
-
- endmodule
总算把鸽的写完了,我觉得这个系列的重点在前面的设计部分,后面的代码可以自己写,只要掌握了整个流程写起来还是挺简单的,就是工作量很大,如果想要自己写的话就看前面几篇即可,代码部分可以不看了。
31条指令单周期cpu设计(Verilog)-(一)相关软件
31条指令单周期cpu设计(Verilog)-(二)总体设计
31条指令单周期cpu设计(Verilog)-(三)指令分析
31条指令单周期cpu设计(Verilog)-(四)数据输入输出关系表
31条指令单周期cpu设计(Verilog)-(五)整体数据通路图设计
31条指令单周期cpu设计(Verilog)-(六)指令操作时间表设计
31条指令单周期cpu设计(Verilog)-(七)整体代码结构
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。