系统硬件综合设计-多周期CPU的设计与实现

计算机组成原理 实验五 单周期CPU设计与实现——十条指令CPU

文章目录

  • ALU和寄存器堆
    • 一、实验目的:
    • 二、实验内容:
    • 三、 源代码
  • PC和半导体存储器RAM
    • 一、实验目的:
    • 二、实验内容:
    • 三、源代码
  • 后记

ALU和寄存器堆

一、实验目的:

理解和掌握CPU中的算术逻辑运算部件(ALU)和寄存器堆(Register File)的工作原理,并使用Verilog和ModelSim进行设计和仿真。

二、实验内容:

  1. 使用Verilog完成ALU的设计,并编写测试仿真文件验证其正确性。要求:
     ALU支持16位的加、减、与、或以及移位运算。
  2. 使用Verilog完成通用寄存器堆的设计,并编写测试仿真文件验证其正确性。要求:
    寄存器堆包含8个16位的寄存器;
    寄存器堆有两个读端口和一个写端口。

三、 源代码

MyALU.v

module ALU(input wire [15:0] A_1, //操作数1input wire [15:0] A_2,  //操作数2input wire [3:0] OP,  //操作码output [15:0] result,//  结果//status[0:3] //0: zero, 1: carry, 2: negative, 3: overflow//output reg [3:0] statusoutput zero,output carry,output negative,output overflow
);wire signed [15:0] tmpX = A_1, tmpY = A_2;reg [16:0] res_T = 17'b0;//??????????16??17???????always@* begincase(OP)3'b000: res_T = A_1 + A_2;3'b001:res_T = A_1 -A_2;3'b010:res_T = A_1 & A_2;3'b011:res_T = A_1 | A_2;3'b100:res_T = A_1 >> A_2;3'b101:res_T = A_1 << A_2;default:res_T = 16'b1111111111111111; endcaseendassign ans = res_T[15:0];assign zero = res_T == 16'b0 ? 0 : 1; //判断是否等于0assign negative = res_T[15];            //判断是否为负数assign overflow = res_T[16];             //判断是否溢出endmodule

MyALU_tb.v

module MyALU_tb();reg [15:0] inData_1, inData_2;reg [3:0]  OP [0:7];wire [15:0] result;wire zero, carry, negative, overflow;initial begininData_1 = 16'b0101010101010101;//21845inData_2 = 16'b1010101010101010;//43690#10  OP[0] = 3'b000;#10  OP[1] = 3'b001;#10  OP[2] = 3'b010;#10  OP[3] = 3'b011;#10  OP[4] = 3'b100;#10  OP[5] = 3'b101;#100 $stop;endALU test1(.A_1(inData_1), .A_2(inData_2),.OP( OP[0]),.result(result),.zero(zero),.carry(carry),.negative(negative),.overflow(overflow));ALU test2(.A_1(inData_1), .A_2(inData_2),.OP( OP[1]),.result(result),.zero(zero),.carry(carry),.negative(negative),.overflow(overflow));ALU test3(.A_1(inData_1), .A_2(inData_2),.OP( OP[2]),.result(result),.zero(zero),.carry(carry),.negative(negative),.overflow(overflow));ALU test4(.A_1(inData_1), .A_2(inData_2),.OP( OP[3]),.result(result),.zero(zero),.carry(carry),.negative(negative),.overflow(overflow));ALU test5(.A_1(inData_1), .A_2(inData_2),.OP( OP[4]),.result(result),.zero(zero),.carry(carry),.negative(negative),.overflow(overflow));ALU test6(.A_1(inData_1), .A_2(inData_2),.OP( OP[5]),.result(result),.zero(zero),.carry(carry),.negative(negative),.overflow(overflow));endmodule


registerBank.v

module registerBank(input [2:0] addrA,addrB,inAddr,output wire[15:0] outA,outB,input wire[15:0] inData,input clk,WE
);reg[15:0] regs[0:7];assign outA = regs[addrA];assign outB = regs[addrB];always@(negedge clk)beginif( WE == 1 )regs[inAddr] = inData;end
endmodule

registerBank_tb.v

module registerBank_tb();parameter CYCLE = 2;reg [2:0] addrA, addrB, inAddr;wire [15:0] outA, outB;reg [15:0] inData;reg clk, WE;initial beginclk = 1'b0;//WE = 1'b0;endalways #(CYCLE/2) clk = ~ clk;always #(CYCLE/2) WE = ~ WE;initial begin//assign WE = 1'b0;assign WE = 1'b1;assign inData = 16'h35A1;assign inAddr = 3'b010;assign addrA = 3'b010;assign addrB = 3'b100;#(CYCLE*1) assign WE = 1'b1;assign inData = 16'h1234;assign inAddr = 3'b001;assign addrA = 3'b000;assign addrB = 3'b001;#(CYCLE*2)assign WE = 1'b0;assign inData = 16'h65df;assign inAddr = 3'b101;assign addrA = 3'b101;assign addrB = 3'b010;#(CYCLE*3)assign WE = 1'b1;assign inData = 16'h12ce;assign inAddr = 3'b100;assign addrA = 3'b100;assign addrB = 3'b011;#(CYCLE*2)assign WE = 1'b1;assign inData = 16'hefd3;assign inAddr = 3'b110;assign addrA = 3'b011;assign addrB = 3'b110;#(CYCLE*5)$stop;endregisterBank reg_file(.clk(clk), .WE(WE),.addrA(addrA), .addrB(addrB), .inData(inData),.inAddr(inAddr),.outA(outA), .outB(outB));
endmodule

PC和半导体存储器RAM

一、实验目的:

理解和掌握CPU中程序计数器PC和半导体存储器RAM的工作原理,并使用Verilog和ModelSim进行设计和仿真。

二、实验内容:

  1. 使用Verilog完成程序计数器PC的设计,要求:
     PC为8位计数器
  2. 使用Verilog完成数据存储器的设计,并编写测试仿真文件验证其正确性。要求:
     存储字长16位,存储容量1K字节;
     一根读写控制信号线控制读写,低电平有效。

三、源代码

PC.v

module MyPC(input clk, input rst,output [7:0] PC
);reg [7:0] pc_T = 8'b0;always @(posedge clk or posedge rst) beginif(rst)pc_T = 8'b0;//8'b01011010;elsepc_T = pc_T + 1'b1;endassign PC = pc_T;
endmodule

PC_tb.v

module MyPC_tb();reg clk;reg rst = 1'b0;wire [7:0] initAddr = 8'b10000000;wire [7:0] pcAddr;//wire [9:0] cnt = 10'd0;always #60 assign rst = ~rst;//if(cnt%0==100) clk = ~clk;//assign cnt = cnt + 1'd1; initial begin#0assign clk = 1'b1;//assign rst = 1'b0;#10assign clk = 1'b0;#20assign clk = ~clk;#30assign clk = 1'b1;#40assign clk = 1'b0;#50assign clk = ~clk;/*#50assign clk = 1'b0;#100 clk = ~clk;*/#100 $stop;endMyPC pc1(.clk(clk),.rst(rst),//.initAddr(initAddr),.PC(PC));endmodule


RAM.v

module  MyRAM #( parameter DATA_WIDTH = 16,DEPTH = 1024)(//input;input    wire    clk,input    wire    WE, //write low enable;input    wire    [clogb2(DEPTH)-1:0] address,input    wire    [DATA_WIDTH-1:0] dataIn,//output;output   wire     [DATA_WIDTH-1:0] dataOut
);function integer clogb2 (input integer depth);
beginfor (clogb2=0; depth>1; clogb2=clogb2+1) depth = depth >>1;
end
endfunction (* ramstyle = "M9K" *) reg [DATA_WIDTH-1:0] memory[0:DEPTH-1];
reg [clogb2(DEPTH)-1:0] address_reg;
//read;always @(posedge clk ) beginaddress_reg <= address;
end //alwaysassign dataOut = memory[address_reg];
//write;always @(posedge clk ) beginif(~WE) beginmemory[address] <= dataIn;end
end //alwaysendmodule

RAM_tb.v

`timescale 1ns/1ns
module MyRAM_tb ();
parameter CYCLE = 8;
parameter ADDR_WIDTH = 10;
parameter DATA_WIDTH = 16;reg clk;
reg WE;
reg [ADDR_WIDTH-1:0] address;
reg [DATA_WIDTH-1:0] dataIn;wire [DATA_WIDTH-1:0] dataOut;MyRAM  tb_u1(.clk                (clk),.WE              (WE),.address          (address),.dataIn             (dataIn),.dataOut                (dataOut)
);initial beginclk = 1'b0;
end
always #(CYCLE/2) clk = ~ clk;
always #(CYCLE/2) WE = ~ WE;initial beginWE = 1'b1;address = 10'd0;dataIn = 0;#(CYCLE*2)      WE = 1'b0;address = 10'd1;dataIn = 16'habcc;#(CYCLE*3)      WE = 1'b0;address = 10'd2;dataIn = 16'hbbdd;#(CYCLE*4)      WE = 1'b0;address = 10'd3;dataIn = 16'hccee;//#(CYCLE*5)      WE = 1'b0;address = 10'd4;dataIn = 16'h1234;#(CYCLE*6)      WE = 1'b0;address = 10'd1;dataIn = 16'h568f;//#(CYCLE*100) //$stop;#(CYCLE*7)      WE = 1'b0;address = 10'd2;dataIn = 16'h568e;#(CYCLE*8) WE = 1'b0;address = 8'd3;dataIn = 16'h568c;#(CYCLE*9) WE = 1'b0;address = 10'd4;dataIn = 16'h568a;#(CYCLE*10)$stop;endendmodule

后记

既来之 则赞之
若有疑问,欢迎评论
本文仅供参考,务必独立思考

CPU部件实现之ALU、寄存器堆、PC、RAM相关推荐

  1. 实验二 CPU 部件实现之 ALU 和寄存器堆

    1.1设计要求 理解和掌握 CPU 中的算术逻辑运算部件(ALU)和寄存器堆(Register File)的工作原理,并使用 Verilog 和 ModelSim 进行设计和仿真. 1. 使用 Ver ...

  2. 【此后无良辰】实验二 CPU部件实现之ALU和寄存器堆

    一. 实验目的 理解和掌握CPU中的算术逻辑运算部件(ALU)和寄存器堆(Register File)的工作原理,并使用Verilog和ModelSim进行设计和仿真. 二. 实验内容 使用Veril ...

  3. (转)【CPU微架构设计】分布式多端口(4写2读)寄存器堆设计

    寄存器堆(Register File)是微处理的关键部件之一.寄存器堆往往具有多个读写端口,其中写端口往往与多个处理单元相对应.传统的方法是使用集中式寄存器堆,即一个集中式寄存器堆匹配N个处理单元.随 ...

  4. 寄存器堆计算机组成实验,《计算机组成原理》实验报告——寄存器堆

    资料简介 南通大学信息科学技术学院 <计算机组成实验> 实验报告 实验名称 寄存器堆的设计与实现 班级 物联网工程 192 学生姓名 谢焘 学号 1930110689 指导教师 成耀 日 ...

  5. 杭电 2016 计算机组成原理,杭电计算机组成原理寄存器堆设计实验4.doc

    杭州电子科技大学计算机学院 实验报告 课程名称:计算机组成原理 实验项目:寄存器堆设计实验 指导教师 实验位置: 姓 班 级: 学 号: 日 期:2015年5月7日 实验目的学习和使用Verlilog ...

  6. 计算机组成原理实验——寄存器堆实现

    这次要做的是用Verilog代码写一个寄存器堆,此寄存器堆共有32个寄存器,每个寄存器可存储32个二进制位.要求有一个写端口,两个读端口,本次实验设计为异步读同步写的寄存器堆,即读寄存器不需要时钟控制 ...

  7. 杭电计算机组成实验4(四)寄存器堆设计实验

    已开源在GitHub上,欢迎各位大佬给Star 仓库地址 实验内容 1. 学习使用Verilog HDL 进行时序电路的设计方法 2. 掌握灵活运用Verilog HDL进行各种描述与建模的技巧和方法 ...

  8. 计算机组成原理——寄存器堆

    MIPS有个32寄存器,每个寄存器32位 由display编写可知input_sel控制输入情况 input_sel= 00:读地址1,01:读地址2 10:写地址,11写数据 读寄存器不需要时钟控制 ...

  9. CPU运算器、控制器、寄存器

    CPU内部主要由运算器.控制器.寄存器三大部分组成. 运算器 负责算术运算(+ - * / 基本运算和附加运算)和逻辑运算(包括 移位.逻辑测试或比较两个值等). 控制器 负责应对所有的信息情况,调度 ...

最新文章

  1. deeplearning 重要调参参数分析
  2. latex二元关系符号
  3. 使用 yo 命令行向导给 SAP UI5 应用添加一个新的视图
  4. 浅论ViewState及其与Session的关系
  5. python内置的集成开发工具是什么_python内置的集成开发工具是什么_后端开发
  6. bzoj5108 数据_成都day3t3
  7. Activity生命周期方法的调用顺序project与測试日志
  8. wndows make images
  9. Java爬坑 -- 解决redis序列化java8 LocalDateTime错误的问题
  10. linux下 卸载qt_Windows 下 Qt creator安装和使用
  11. 将图像分成m×n的小子块
  12. 【机器学习】主成分分析 (PCA)、无监督特征提取
  13. 备战数学建模22-数学建模论文写作规范总结
  14. spss20安装许可证代码_SPSS23安装教程
  15. 计算机显示c盘的文件被损坏,无法读取,怎么办?,电脑提示损坏文件怎么办
  16. 孤独星球android app,孤独星球免费版
  17. 浅析经典JVM垃圾收集器-Serial/ParNew/Parallel Scavenge/Serial Old/Parallel Old/CMS/G1
  18. 计算机保研个人简介,保研个人简历模板
  19. 运用frame、frameset框架不显示问题
  20. 准备学python用什么电脑_001-小白学python-初入python世界

热门文章

  1. 创建Blend动画中 Additive Settings的作用
  2. 家人们接受DAO,拥抱DAO,DeFI崛起?
  3. 使用Easyx图形库制作的2048游戏
  4. android qq聊天窗口切换,手机QQ重磅更新!新增聊天多窗口模式,希望微信也能有...
  5. 安卓下调用python(并调用C库暂时失败)暂时使用JNI方式
  6. JAVA根据IP确定时区_2019-05-23 Java根据地址计算日出日落时间(百度地图API)
  7. 动态建树加深搜之——模仿手机九键输入法
  8. ANSA—外流场网格生成
  9. 示波器数据导入MATLAB进行后续分析
  10. AmazeUI 点击元素显示全屏