计算机组成实验——CPU寄存器组设计

CPU 寄存器组的设计建议用文本输入方式设计。

寄存器组中包括 4 个 8 位通用寄存器(R0~R3) 和 1 个 8 位专用寄存器 PC。8 位通用寄存器只有读/写功能。8 位专用寄存器 PC 具有预置、加一、减一和清零功能。通用寄存器组和 PC 的控制信号是独立的,这样便于实现并行处理。 程序计数器 PC 的清零操作由复位信号 RST 单独控制。

4 个通用寄存器 R0~R3 的选择通过信号 RA1 和 RA0 控制,由 Wt 和 Rd 分别控制寄存器的读写操作。 PC 寄存器的清零、预置、加一、减一计数均采用同步方式。清零(reset)信号为低电平有 效,计数脉冲(clk)为下降沿有效。M 控制 PC 置数、加一计数、减一计数等不同操作。8 位 PC 寄存器的输出在两个个七段数码管显示,4 个通用寄存器组的输出在另外两个七段数码管显示示。

八位通用寄存器组操作控制方式图

寄存器组结构框图

一、实验分析与设计

CPU寄存器组包括通用寄存器组R0~R3和专用寄存器PC。

通用寄存器由信号RA1、RA0控制选择,由信号Wt、Rd控制读写。当Wr  = 0 且 Rd = 1时,写入输入值 D 到某个寄存器中。当Wr  = 1 且 Rd = 0时,输出某个寄存器的值到R中,显示在数码管上。

专用寄存器由信号M控制置数、加一计数等,由信号reset控制清零。由于需要控制PC加一、减一的速度,此处将高频时钟信号clk分频为低频时钟信号clk1控制PC加减。

通过SEL控制,动态扫描,将PC的值和R的值译码后显示在四个七段数码管上。

二、程序代码

module sy5(clk,D,M,RESET,RA,Wr,Rd,SEL,code);
	input clk;
	input [7:0]D;
	input [1:0]M;
	input RESET;
	input [1:0]RA;
	input Wr,Rd;
	
	output reg[7:0]code = 8'h00;
	output reg[2:0]SEL = 3'b000;
	
	reg [7:0] R = 8'd0,R0,R1,R2,R3;
	reg [7:0] PC = 8'd0;
	//通用寄存器组写入读出
	always@(RA,Wr,Rd)
	begin
		if(!Wr & Rd)	//写入
		begin
			case(RA)
				2'b00 : R0 = D;
				2'b01 : R1 = D;
				2'b10 : R2 = D;
				2'b11 : R3 = D;
			endcase
		end
		else if(Wr & !Rd)	//读出
		begin
			case(RA)
				2'b00 : R = R0;
				2'b01 : R = R1;
				2'b10 : R = R2;
				2'b11 : R = R3;
			endcase
		end
	end
	//分频器,控制PC加一、减一速度
	reg clk1 = 0;
	integer k = 0;
	always@(posedge clk)
	begin
		if(k < 1000) k = k + 1;
		else
		begin
			k = 0;
			clk1 = ~clk1;
		end
	end
	//PC部分
	always@(negedge clk1)
	begin
		if(!RESET) PC = 8'd0;
		else
		begin
			case(M)
				2'b00 : PC = PC;	//维持不变
				2'b01 : PC = PC + 1'b1;	//加一计数
				2'b10 : PC = PC - 1'b1;	//减一计数
				2'b11 : PC = D;	//PC置数
			endcase
		end
	end
	
	//显示部分
	reg[3:0] Data;
	always@(posedge clk)
	begin
		if(SEL < 3'b011) SEL = SEL + 1;
		else SEL = 3'b000;
	end
	//SEL动态扫描
	always@(SEL)
	begin
		case(SEL)
		   3'b000 : Data = PC[7:4];
		   3'b001 : Data = PC[3:0];
		   3'b010 : Data = R[7:4];
		   3'b011 : Data = R[3:0];
		endcase
	end
	//译码
	always @(Data)
	begin
		case(Data)
			4'd0 : code = 8'h3f;
			4'd1 : code = 8'h06;
			4'd2 : code = 8'h5b;
			4'd3 : code = 8'h4f;
			4'd4 : code = 8'h66;
			4'd5 : code = 8'h6d;
			4'd6 : code = 8'h7d;
			4'd7 : code = 8'h07;
			4'd8 : code = 8'h7f;
			4'd9 : code = 8'h6f;
			
			4'd10: code = 8'h77;
			4'd11: code = 8'h7c;
			4'd12: code = 8'h39;
			4'd13: code = 8'h5e;
			4'd14: code = 8'h79;
			4'd15: code = 8'h71;
			default : code = 8'h00;
		endcase
	end

endmodule

三、ModelSim仿真

Test Bench

`timescale 1 ps/ 1 ps
module sy5_vlg_tst();
reg [7:0] D;
reg [1:0] M;
reg [1:0] RA;
reg RESET;
reg Rd;
reg Wr;
reg clk;
// wires                                               
wire [2:0]  SEL;
wire [7:0]  code;

sy5 i1 (
	.D(D),
	.M(M),
	.RA(RA),
	.RESET(RESET),
	.Rd(Rd),
	.SEL(SEL),
	.Wr(Wr),
	.clk(clk),
	.code(code)
);
initial                                                
begin                                                  
	clk = 0;
	RESET = 1;
	M = 2'b00;
	Wr = 0;
	Rd = 1;
	//写入
	D = 8'b00000001;
	RA = 2'b00;
	#10
	D = 8'b00000010;
	RA = 2'b01;
	#10
	D = 8'b00000100;
	RA = 2'b10;
	#10
	D = 8'b00001000;
	RA = 2'b11;
	//读出
	#20
	Wr = 1;
	Rd = 0;
	RA = 2'b00;
	#80
 	RA = 2'b01;
	#80
 	RA = 2'b10;
	#80
 	RA = 2'b11;
	//PC
	#30000
	M = 2'b01;
	#20000
	M = 2'b00;
	#20000
	M = 2'b10;
	#20000
	M = 2'b00;
	#20000
	M = 2'b11;
    #20000
	RESET = 0;             
$display("Running testbench");                       
end                                                    
always  #10 clk = ~clk;                                
endmodule

波形图

通用寄存器的写入读出:R0  =  00000001; R1 = 00000010; R2 = 00000100; R3 = 00001000;

PC寄存器的加一(00000001)、减一(00000000)、置数(00001000)、清零(00000000)

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值