1. 程式人生 > 其它 >杭電計算機組成實驗4(四)暫存器堆設計實驗

杭電計算機組成實驗4(四)暫存器堆設計實驗

技術標籤:杭電計算機組成實驗

實驗內容

1. 學習使用Verilog HDL 進行時序電路的設計方法
2. 掌握靈活運用Verilog HDL進行各種描述與建模的技巧和方法
3. 學習暫存器堆的資料傳送與讀/寫工作原理,掌握暫存器堆的設計方法

解決方法

1. 分析一個32x32位的暫存器堆,即含有32個暫存器,每個暫存器32位。該暫存器堆有2個讀埠、1個寫埠,即能夠同時讀出2個暫存器的值,寫入1個暫存器
2. 首先,分析出兩個埠讀入是5位的地址,讀出的資料是32位的兩個,該暫存器堆只有一個寫埠,還要配合控制訊號Write_Reg,且寫操作是邊沿觸發的,所有寫入操作的輸入訊號必須在時鐘邊沿來臨時已經有效

3. 暫存器堆的讀操作和寫操作的地址譯碼,只需引用暫存器地址作為陣列的下標即可;讀只需要組合邏輯,給出暫存器地址,讀出資料
4. 程式碼展示:
頂層模組(需要資料輸入在板子上操作):

module RegisterFile(Addr,Write_Reg,Opt,Clk,Reset,A_B,LED);
input [1:0]Opt;
input [4:0]Addr;
input Write_Reg,Clk,Reset,A_B;
output reg [7:0]LED;
wire [31:0]R_Data_A,R_Data_B;
reg [4:0]R_Addr_A,R_Addr_B;
reg [31:0]W_Data
; Fourth_experiment_first F1(R_Addr_A,R_Addr_B,Write_Reg,R_Data_A,R_Data_B,Reset,Clk,Addr,W_Data); always@(Addr or Write_Reg or Opt or A_B or R_Data_A or R_Data_B) begin if(Write_Reg) begin case(Opt) 2'b00: begin W_Data=32'h000f_000f; end 2'b01: begin W_Data=32'h0f0f_0f00; end 2'b10: begin W_Data=32'
hf0f0_f0f0; end 2'b11: begin W_Data=32'hffff_ffff; end endcase end else if(A_B) begin R_Addr_A=Addr; case(Opt) 2'b00: LED=R_Data_A[7:0]; 2'b01: LED=R_Data_A[15:8]; 2'b10: LED=R_Data_A[23:16]; 2'b11: LED=R_Data_A[31:24]; endcase end else begin R_Addr_B=Addr; case(Opt) 2'b00: LED=R_Data_B[7:0]; 2'b01: LED=R_Data_B[15:8]; 2'b10: LED=R_Data_B[23:16]; 2'b11: LED=R_Data_B[31:24]; endcase end end endmodule

暫存器堆實現的Fourth_experiment_first模組

module Fourth_experiment_first(R_Addr_A,R_Addr_B,Write_Reg,R_Data_A,R_Data_B,Reset,Clk,W_Addr,W_Data);
input [4:0]R_Addr_A,R_Addr_B,W_Addr;
input Write_Reg,Reset,Clk;
input[31:0] W_Data;
output [31:0] R_Data_A,R_Data_B;
reg [31:0] REG_Files[0:31];
integer i=0;
always @ (posedge Clk or posedge Reset)
	begin
		if(Reset)
			begin
				for(i=0;i<=31;i=i+1)
					REG_Files[i]<=0;
			end
		else
			begin
				if(Write_Reg)
					REG_Files[W_Addr]<=W_Data;
			end
	end
	assign R_Data_A = REG_Files[R_Addr_A];
	assign R_Data_B = REG_Files[R_Addr_B];
	
endmodule