Conteúdo da experiência
1. Aprenda como usar Verilog HDL para projetar circuitos sequenciais.
2. Compreenda as habilidades e métodos para o uso flexível de Verilog HDL para várias descrições e modelagem.
3. Aprenda os princípios de trabalho de transferência de dados e leitura / gravação do arquivo de registro e domine o design do arquivo de registro método
Solução
1. Analise um arquivo de registro de 32x32 bits, que contém 32 registros, cada um com 32 bits. O arquivo de registro possui 2 portas de leitura e 1 porta de escrita, ou seja, pode ler os valores de 2 registros ao mesmo tempo e escrever em 1 registro
2. Primeiro, analise se as duas portas lidas são endereços de 5 bits e leia Os dados são dois bits de 32. O arquivo de registro tem apenas uma porta de gravação e o sinal de controle Write_Reg é necessário. A operação de gravação é acionada por transição. Todos os sinais de entrada para a operação de gravação devem ser válidos quando chega a transição do clock
. 3. Arquivo de registro Para decodificar o endereço das operações de leitura e gravação, você só precisa citar o endereço do registro como o subscrito da matriz; somente leitura requer lógica combinacional, forneça o endereço do registro e leia os dados
4. Exibição do código:
módulo de nível superior (a entrada de dados é necessária em Operação na placa):
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;
initial
LED <= 0;
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
Módulo Fourth_experiment_first implementado pelo arquivo de registro
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
Módulo de teste
module Fourth_experiment_test;
// Inputs
reg [4:0] Addr;
reg Write_Reg;
reg [1:0] Opt;
reg Clk;
reg Reset;
reg A_B;
// Outputs
wire [7:0] LED;
RegisterFile uut (
.Addr(Addr),
.Write_Reg(Write_Reg),
.Opt(Opt),
.Clk(Clk),
.Reset(Reset),
.A_B(A_B),
.LED(LED)
);
always #20 Clk = ~Clk;
initial begin
Addr = 5'b00001;
Write_Reg = 1;
Opt = 0;
Clk = 1;
Reset = 0;
A_B = 0;
#100;
Addr = 5'b00001;
Write_Reg = 0;
Opt = 0;
A_B = 0;
end
endmodule