实验十二—寄存器及寄存器堆设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验十二寄存器及寄存器堆设计
姓名:洪至远学号:3100104624 专业:工信1015
课程名称:逻辑与计算机设计基础实验同组学生姓名:谢志聪
实验时间:2011年12月13日实验地点:紫金港东4-509 指导老师:蒋方炎,陆汉权一、实验目的和要求
●掌握寄存器、锁存器的工作原理及设计方法
●掌握寄存器堆的工作原理及设计方法
●了解计算机中寄存器及寄存器堆的概念
二、实验内容和原理
实验内容:
实现含由16个16位寄存器构成的寄存器堆,要求:
•支持寄存器地址选择
•支持写入任意16位值
•支持读取寄存器的值
增加到xCal中。
12.1 寄存器
寄存器是计算机常用的基本器件,结构如下图:
D0D1D2D3D4D5D6D7
1、 由同一信号控制的一组相互并联的触发器构成
2、 包含存储、处理和传输,可构成寄存器组使用
3、上图所示,为边沿D 触发器构成的8位基本寄存器的结构
12.2 锁存器
锁存器由多个一位锁存器/触发器并联构成,它:
1、 一般采用电平控制锁存:
2、 高电平时置入数据
3、 低电平时锁存数据,并指示数据稳定
4、 带使能端的RS 触发器实现的锁存器
12.3 寄存器组
寄存器组是多个寄存器组成的集合 1、寄存器写:寄存器地址→变量译码器
2、寄存器读:寄存器地址→数据选择器
三、主要仪器设备
1. 装有ISE 的计算机系统 1台
2. Spartan III 实验板 1套
锁存
2锁存器波形图
数据选择器
变量译码器
m 01
n -2n -1
3寄存器组结构
四、操作方法与实验步骤
实验步骤:
(1)、设计16个16位寄存器构成的寄存器堆。
(2)、修改相关代码。
(3)、修改ucf文件。
(4)、下载并验证。
实验代码如下:
module top(
input wire clk,
input wire [3:0]btn_in,
input wire[7:0]switch,
output wire [3:0]anode,
output wire [7:0]segment,
output wire Rc
);
//variable definition: op1, op2,disp_num…
reg [15:0]display_num;
wire [15:0]op1,op2;
wire [3:0]btn_out;
wire [15:0] result, reg_out;
wire [15:0] disp_counter,disp_clock;
wire clk_1s;
initial begin
display_num=16'b0000_0000_0000_0000;
end
display m0(clk,display_num, anode, segment);//display module
calculate_result m1(btn_out[3:0], op1, op2, result); //calculate result
create_oprands m2(switch[3:0], btn_out[3:0], switch[7:4], result, op1, op2, reg_out);
pbdebounce b0(clk, btn_in[0], btn_out[0]);
pbdebounce b1(clk, btn_in[1], btn_out[1]);
pbdebounce b2(clk, btn_in[2], btn_out[2]);
pbdebounce b3(clk, btn_in[3], btn_out[3]);
clock_1s m4(clk, clk_1s);
counter_16_rev m5((clk_1s & btn_out[0]), switch[2], disp_counter, Rc); clock_24h m6(clk_1s, disp_clock);
always @* begin
case (switch[1:0])
2'b01:begin //operand 1
display_num = op1;
end
2'b10:begin //operand 2
display_num = op2;
end
2'b00:begin //result
if(btn_out[1]==1 && switch[3] == 1)
display_num = reg_out;
else
display_num = result;
end
2'b11:begin //counter & clock
if(btn_out[1:0] == 2'b01)
display_num = disp_counter;
else if(btn_out[1:0] == 2'b10)
display_num = disp_clock;
end
endcase
end
endmodule
module create_oprands
(input wire [3:0]switch,input wire [3:0]btn_out,input wire [3:0]address,input wire[15:0]reg_in3,output reg [15:0]op_out1,
output reg [15:0]op_out2,output wire [15:0]reg_out3);
reg [15:0]op1;
reg [15:0]op2;
wire [15:0] out_shift1,out_shift2,reg_out1,reg_out2;
reg[15:0] reg_in1,reg_in2;
initial op1 <= 16'b0000_0000_0000_0000;
initial op2 <= 16'b0000_0000_0000_0000;
always @(posedge btn_out[0])begin
if(switch == 2'b01) op1[3:0]<= op1[3:0] + 4'd1;
else if(switch == 2'b10) op2[3:0]<= op2[3:0] + 4'd1;
end
always @(posedge btn_out[1])begin
if(switch == 2'b01) op1[7:4]<= op1[7:4] + 4'd1;
else if(switch == 2'b10) op2[7:4]<= op2[7:4] + 4'd1;
end
always @(posedge btn_out[2])begin
if(switch == 2'b01) op1[11:8]<= op1[11:8] + 4'd1;
else if(switch == 2'b10) op2[11:8]<= op2[11:8] + 4'd1;
end
always @(posedge btn_out[3])begin
if(switch == 2'b01) op1[15:12]<= op1[15:12] + 4'd1;
else if(switch == 2'b10) op2[15:12]<= op2[15:12] + 4'd1;
end
shift_reg_16 m1(btn_out[2:0], switch[3:0], address, out_shift1, out_shift2);
regfile_16 m2(btn_out[0], btn_out[1], switch[1:0], address, reg_in1, reg_in2, reg_in3, reg_out1, reg_out2, reg_out3);
always @* begin
if(switch[1:0] == 2'b01)begin
case(switch[3:2])
2'b00:op_out1 = op1;
2'b01:op_out1 = out_shift1;
default: if(btn_out[1] == 1'b1) op_out1 = reg_out1;
endcase
reg_in1 = op_out1;
end
else if(switch[1:0] == 2'b10) begin
case(switch[3:2])
2'b00:op_out2 = op2;
2'b01:op_out2 = out_shift2;
default:
if(btn_out[1] == 1'b1) op_out2 = reg_out2;
endcase
reg_in2 = op_out2;
end
end
endmodule