计算机组成实验——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)

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
辽B代驾管理系统对代驾订单管理、用户咨询管理、代驾订单评价管理、代驾订单投诉管理、字典管理、论坛管理、公告管理、新闻信息管理、司机管理、用户管理、管理员管理等进行集中化处理。经过前面自己查阅的网络知识,加上自己在学校课堂上学习的知识,决定开发系统选择小程序模式这种高效率的模式完成系统功能开发。这种模式让操作员基于浏览器的方式进行网站访问,采用的主流的Java语言这种面向对象的语言进行辽B代驾管理系统程序的开发,在数据库的选择上面,选择功能强大的Mysql数据库进行数据的存放操作。辽B代驾管理系统的开发让用户查看代驾订单信息变得容易,让管理员高效管理代驾订单信息。 辽B代驾管理系统具有管理员角色,用户角色,这几个操作权限。 辽B代驾管理系统针对管理员设置的功能有:添加并管理各种类型信息,管理用户账户信息,管理代驾订单信息,管理公告信息等内容。 辽B代驾管理系统针对用户设置的功能有:查看并修改个人信息,查看代驾订单信息,查看公告信息等内容。 辽B代驾管理系统针对管理员设置的功能有:添加并管理各种类型信息,管理用户账户信息,管理代驾订单信息,管理公告信息等内容。 辽B代驾管理系统针对用户设置的功能有:查看并修改个人信息,查看代驾订单信息,查看公告信息等内容。 系统登录功能是程序必不可少的功能,在登录页面必填的数据有两项,一项就是账号,另一项数据就是密码,当管理员正确填写并提交这二者数据之后,管理员就可以进入系统后台功能操作区。项目管理页面提供的功能操作有:查看代驾订单,删除代驾订单操作,新增代驾订单操作,修改代驾订单操作。公告信息管理页面提供的功能操作有:新增公告,修改公告,删除公告操作。公告类型管理页面显示所有公告类型,在此页面既可以让管理员添加新的公告信息类型,也能对已有的公告类型信息执行编辑更新,失效的公告类型信息也能让管理员快速删除。新闻管理页面,此页面提供给管理员的功能有:新增新闻,修改新闻,删除新闻。新闻类型管理页面,此页面提供给管理员的功能有:新增新闻类型,修改新闻类型,删除新闻类型。
CPU寄存器CPU中的一个重要组成部分,它用于存储CPU中的数据和指令。在VHDL语言中实现CPU寄存器设计,需要按照以下步骤进行: 1. 定义寄存器的输入输出端口,包括数据输入端口、地址输入端口、读写控制端口和数据输出端口等。 2. 建立寄存器的存储单元,每个存储单元可以用一个D触发器来实现。在VHDL中可以使用“process”语句来实现存储单元的逻辑功能。 3. 编写读写控制逻辑,根据读写控制信号的不同,将数据写入到指定的存储单元中或从指定的存储单元中读取数据。在VHDL中可以使用“if-else”语句或“case”语句来实现读写控制逻辑。 4. 将所有的存储单元按照地址进行编址,形成一个寄存器。在VHDL中可以使用数来实现寄存器的编址。 5. 对寄存器进行仿真测试,验证其功能是否正确。 下面是一个使用VHDL语言实现CPU寄存器的示例代码: ``` entity register_file is port ( clk : in std_logic; reset : in std_logic; reg_wen : in std_logic; reg_addr: in std_logic_vector(4 downto 0); reg_data_in : in std_logic_vector(31 downto 0); reg_data_out: out std_logic_vector(31 downto 0) ); end entity register_file; architecture rtl of register_file is type register_array is array(0 to 31) of std_logic_vector(31 downto 0); signal registers : register_array; begin process(clk, reset) begin if reset = '1' then for i in 0 to 31 loop registers(i) <= (others => '0'); end loop; elsif rising_edge(clk) then if reg_wen = '1' then registers(to_integer(unsigned(reg_addr))) <= reg_data_in; end if; end if; end process; reg_data_out <= registers(to_integer(unsigned(reg_addr))); end architecture rtl; ``` 在上面的示例代码中,我们使用了一个数来实现寄存器的编址,每个存储单元使用了一个32位的向量来实现。在process语句中,我们实现了存储单元的逻辑功能,当reg_wen为1时,将reg_data_in写入到指定的存储单元中;当reg_wen为0时,则从指定的存储单元中读取数据,并将其输出到reg_data_out端口中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值