2017-08-07 1 views
-2

Ich entwerfe eine ALU, deren 2 Operanden von zwei Registern angesteuert werden. Ich habe die ALU entworfen und registriere sie als verschiedene Module. Ich werde nicht lernen, diese Module zu integrieren und einen Verilog-Code im Verhaltensmodell zu erstellen.Verilog-Code für alu mit Operanden, die von 2 Registern gesteuert werden

Bitte schlagen Sie einige Ideen vor, die mir helfen, mit anzufangen.

+0

Bitte teilen Sie einige Beispielcode, um das Problem zu veranschaulichen –

Antwort

0

ALU CODE

module alu(opcode, A, B, OUT, Z, N); 
input [3:0]opcode; 
input [31:0]A; 
input [31:0]B; 
output reg [31:0]OUT; 
output reg Z; 
output reg N; 

always @(opcode or A or B) 
begin 
    case(opcode) 
     4'b0001: OUT <= A+B; 
     4'b0111: OUT <= A+(-B); 
     4'b0101: OUT <= A+1; 
     4'b0110: OUT <=~A; 
     default: OUT <= OUT; 
    endcase 
    if(OUT == 0) 
     begin 
      assign Z = 1; 
      assign N = 0; 
     end 
    else 
     begin 
      assign Z = 0; 
      if(OUT < 0) 
       assign N = 1; 
      else 
       assign N = 0; 
     end 
end 
initial begin 
    OUT = 0; 
    Z = 0; 
    N = 0; 
end 
endmodule 

Sie die Opcode-Steuerelemente sehen können, die die ALU tut Funktion, die in dem Fall Aussage geschieht.

Ich weiß nicht genau, was Sie unter "Module für die Register" verstehen, da Register standardmäßig in Verilog implementiert sind. Sie können die Initialisierung von A und B als Beispiele für die Erstellung von Registern verwenden.

Also, um dies zu verwenden, müssten Sie ein Testbench-Modul haben.

Prüfstand CODE

module alu_testbench(); 

reg [31:0] A, B; 
reg [3:0] opcode; 
wire Z, N; 
wire [31:0]OUT; 

alu #() DUT (
    .A(A), 
    .B(B), 
    .opcode(opcode), 
    .OUT(OUT), 
    .Z(Z), 
    .N(N) 
); 

initial begin 
    A = 5; 
    B = 2; 
    opcode = 4'b0001; 
    #10 // 7 
    A = 3; 
    #10 // 5 
    B = 3; 
    #10 // 6 
    A = 0; 
    opcode = 4'b0110; 
    #10 // FFFFFFFFFFFFFF 
    A = 5; 
    B = 2; 
    opcode = 4'b0111; 
    #10 // 3 
    opcode = 4'b0101; 
    #10 // 6 
    $finish; 
end 

endmodule 

habe ich diesen Code für eine Klasse und es funktionierte für mich. Ich bin bereit, Ihre Fragen zu beantworten, aber ich weiß nicht viel über Verilog. Alles, was ich gelernt habe, war von Google-Suchen.

Wenn Sie mehrere Module miteinander verbinden, erstellen Sie nur Zwischenregs oder Drähte in Ihrem Testbench. Dann verknüpfen Sie sie einfach mit der Art und Weise, die im Testbench-Code angezeigt wird. Sie übergeben sie als Argumente für die Initialisierung des Moduls.

+1

Die Zeile 'OUT <= OUT;' wird einige komplexe asynchrone Verriegelung ableiten. "OUT <= A;" oder "OUT <= 0;" oder eine andere bestimmte Zuordnung wäre besser. Außerdem wird es allgemein als schlechte Praxis angesehen, in kombinatorischen Blöcken nicht blockierend und "zuweisen" zu verwenden. – Greg

Verwandte Themen