实验十二—寄存器及寄存器堆设计

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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

相关文档
最新文档