Ich bin sehr neu auf Verilog. Also das ist meine Frage:Art stecken auf dem Ausgang, wenn die Ausgabe überlappen
Implementieren Sie 16 Bits ALU mit 16-Bit-Register. Dieses Projekt sollte die folgende Anforderung erfüllen.
1. Entwerfen Sie eine 16-Bit-ALU: Entwerfen Sie eine 16-Bit-ALU, die X als Eingabe (z. B. A, B ..) und erzeugt ein 16-Bit-Ergebnis.Die ALU sollte die folgenden Funktionen ausführen. Mindestens 5 Operationen für ALU und LOGIC.
2. Entwerfen Sie eine 16x16-Bit-Registerdatei.
3. Entwerfen Sie eine Steuereinheit.
Also ist mein Plan, eine Reihe von Modulen zu machen, die Operationen in jedem Modul haben. Dann sammle ich es auf dem Prüfstand. Aber das Problem ist gerade jetzt. Die Ausgabe scheint sich zu überlappen und wird rot und x.
Dies ist mein Add-Modul.
module Add(A,B,Y,S,clk,enb);
parameter BITS=8;
input clk,enb;
input [BITS - 5:0] S;
input [BITS - 1:0] A ,B;
output [BITS - 1:0] Y;
reg [BITS - 1:0] Y;
always @(posedge clk)
begin
if
((enb==1) || (S == 000))
begin
assign Y = A + B;
end
end
endmodule
Tolak Modul (Minus-Modul)
module Tolak(A,B,Y,S,clk,enb);
parameter BITS=8;
input clk,enb;
input [BITS - 5:0] S;
input [BITS - 1:0] A ,B;
output [BITS - 1:0] Y;
reg [BITS - 1:0] Y;
always @(posedge clk)
begin
if
((enb==1) || (S == 010))
begin
assign Y = A - B;
end
end
endmodule
Darab Modul (Multiplikationsmodul)
module Darab(A,B,Y,S,clk,enb);
parameter BITS=8;
input clk,enb;
input [BITS - 5:0] S;
input [BITS - 1:0] A ,B;
output [BITS - 1:0] Y;
reg [BITS - 1:0] Y;
always @(posedge clk)
begin
if
((enb==1) || (S == 011))
begin
assign Y = A * B;
end
end
endmodule
GateOr Modul
module GateOr(A,B,Y,S,clk,enb);
parameter BITS=16;
input clk,enb;
input [BITS - 14:0] S;
input [BITS - 1:0] A ,B;
output [BITS - 1:0] Y;
reg [BITS - 1:0] Y;
always @(posedge clk)
begin
if
((enb==1) || (S == 011))
begin
assign Y = A | B ;
end
end
endmodule
gateand Modul
module GateAnd(A,B,Y,S,clk,enb);
parameter BITS=16;
input clk,enb;
input [BITS - 14:0] S;
input [BITS - 1:0] A ,B;
output [BITS - 1:0] Y;
reg [BITS - 1:0] Y;
always @(posedge clk)
begin
if
((enb==1) || (S == 100))
begin
assign Y = A & B;
end
end
endmodule
und dies ist mein PRüFSTAND
module Maintb();
parameter SIZE=8;
reg clk, enb ;
reg [SIZE-6:0] S;
reg[SIZE-1:0] A,B;
wire[SIZE-1:0] Y;
initial
begin
clk = 1'b0; enb = 1'b0;
end
// generate clock
always
begin
#(10) clk = !clk;
end
always begin
//#(10);
#10; enb = 1'b1; A=00000001; B=00000000; S=000; //add
#(10); enb = 1'b0;
#10; enb = 1'b1; A=00000001; B=00000000; S=001; //tolak
#(10); enb = 1'b0;
#10; enb = 1'b1; A=00000001; B=00000000; S=010; //darab
#(10); enb = 1'b0;
#10; enb = 1'b1; A=00000001; B=00000000; S=011; //or
#(10); enb = 1'b0;
#10; enb = 1'b1; A=00000001; B=00000000; S=100; //and
//#(10);
end
defparam dut.BITS = SIZE;
defparam dut1.BITS = SIZE;
defparam dut2.BITS = SIZE;
defparam gate.BITS = SIZE;
defparam gate1.BITS = SIZE;
Add dut (A,B,Y,S,clk,enb); //000
Tolak dut1 (A,B,Y,S,clk,enb); //001
Darab dut2 (A,B,Y,S,clk,enb); //010
GateOr gate (A,B,Y,S,clk,enb); //011
GateAnd gate1 (A,B,Y,S,clk,enb);//100
Endmodule
Ihr S hat konstante Bitbreite von 3 Bits? –
Was ist das Verhalten Ihres Enb-Signals? Ändert es sich am Rand des clk-Zyklus oder an irgendeiner Kante oder unabhängig vom clk-Zyklus? –