杭电计组实验四
0000_0003
0000_0003
$00011
7FFF_FFFF
7FFF_FFFF
$00111
7FFF_FFFF
7FFF_FFFF
$01111
0000_0000
0000_0000
$11111
000ቤተ መጻሕፍቲ ባይዱ_0003
0000_0003
$10000
7FFF_FFFF
7FFF_FFFF
$11000
7FFF_FFFF
input [4:0] W_Addr;
input [31:0] W_Data;
input Write_Reg;
input Clk;
input Reset;
output [31:0] R_Data_A;
output [31:0] R_Data_B;
integer i;
reg[31:0] REG_Files[31:0];//定义寄存器
实验报告
2016年4月22日成绩:
姓名
学号
班级
专业
信息安全
课程名称
《计算机组成原理课程设计》
任课老师
曾虹
指导老师
曾虹
机位号
实验序号
实验名称
寄存器堆
实验时间
2016、4、22
实验地点
1教南
实验设备号
一、实验程序源代码
module Reg(LED,RW_SW,AB,Reg_Addr_A,Reg_Addr_B,Write_Reg,clk,rst);
NET "Add[3]" LOC = "V8";
NET "Add[2]" LOC = "U8";
NET "Add[1]" LOC = "N8";
NET "Add[0]" LOC = "M8";
NET "WR" LOC = "V9";
NET "C[1]" LOC = "T9";
NET "C[0]" LOC = "T10";
wire[31:0] W_Data2 = 32'h0000000A;
wire[31:0] W_Data3 = 32'h00000006;
wire[31:0] W_Data4 = 32'h00000003;
wire[31:0] A = REG_];
wire[31:0] B = REG_];
integer i;
7FFF_FFFF
修改后得寄存器模块:
‘time scale 1ns/1ps
Moudle Register(R_Addr_A,R_Addr_B,R_Data_A,R_Data_B,W_Addr,W_Data,Write_Reg,Clk,Reset);
input [4:0] R_Addr_A;
input [4:0] R_Addr_B;
assign R_Data_A=REG_Files[R_Addr_A];
assign R_Data_B=REG_Files[R_Addr_B];
always (posedge Clk or posedge Reset)
begin
if(Reset)//清零
begin
for(i=0;i<32;i++)
REG_Files[i]<=0;
else
begin
if(Write_Reg)
begin
if(AB)
case(RW_SW)
2'b00 : REG_]=W_Data1;
2'b01 : REG_]=W_Data2;
2'b10 : REG_]=W_Data3;
2'b11 : REG_]=W_Data4;
endcase
else
case(RW_SW)
endcase
else
case(RW_SW)
2'b00 : LED = B[7:0];
2'b01 : LED = B[15:8];
2'b10 : LED = B[23:16];
2'b11 : LED = B[31:24];
default : LED = B[7:0];
endcase
if(rst)
for(i = 0; i < 32; i = i + 1) REG_File[i] = 0;
NET "LED[3]" LOC = "V15";
NET "LED[2]" LOC = "U15";
NET "LED[1]" LOC = "V16";
NET "LED[0]" LOC = "U16";
五、思考与探索
寄存器地址
写入数据
读出数据
$00000
0000_0000
0000_0000
$00001
always (posedge clk or posedge rst)
begin
if(AB)
case(RW_SW)
2'b00 : LED=A[7:0];
2'b01 : LED=A[15:8];
2'b10 : LED=A[23:16];
2'b11 : LED=A[31:24];
default : LED=A[7:0];
end
else
begin
if(Write_Reg&&(W_Addr!=0))
begin
REG_Files[W_Addr]<=W_Data;
end
end
end
Endmoudle
(3)、读操作就是时钟得下降沿时候执行得,写操作就是时钟上升沿执行得
(4)、通过实验深入理解了寄存器得工作过程,32位数据得显示,参考上次实验得分组显示法,将32位分为4组,每组8位。这次在写配置文件时,特意关注了引脚顺序。清零信号与clk时钟信号在需要清零时,同时按住才会将清零信号输入进去。
NET "clk" LOC = "C9";
NET "RS" LOC = "D9";
NET "AB" LOC = "A8";
NET "LED[7]" LOC = "T11";
NET "LED[6]" LOC = "R11";
NET "LED[5]" LOC = "N11";
NET "LED[4]" LOC = "M11";
2'b00 : REG_]=W_Data1;
2'b01 : REG_]=W_Data2;
2'b10 : REG_]=W_Data3;
2'b11 : REG_]=W_Data4;
endcase
end
end
end
endmodule
二、仿真波形
三、电路图
四、引脚配置(约束文件)
NET "Add[4]" LOC = "T5";
input[4:0] Reg_Addr_A,Reg_Addr_B;
input Write_Reg;
input[1:0] RW_SW;
input clk;
input rst;
output[7:0] LED;
input AB;
reg[31:0]REG_];
reg[7:0] LED;
wire[31:0] W_Data1 = 32'h00000001;