Ich möchte ein Eingangssignal um einen kompletten Taktzyklus verzögern.
Ich habe den Code unten, der grundsätzlich versucht, das Signal an der Uhr zu ändern.
Der Prüfstand zeigt jedoch, dass er nicht immer um 1 Zyklus verzögert wird.
In einigen Fällen ändert sich gleichzeitig das Eingangssignal.
Verilog: Wie verzögert man ein Eingangssignal um einen Taktzyklus?
Gibt es eine Möglichkeit, diese Art von Problem zu lösen? Hier
module delay_one_cycle(
input clk,
input[3:0] original_signal,
output reg[3:0] delayed_signal
);
always @(posedge clk) begin
delayed_signal <= original_signal;
end
endmodule
module delay_one_cycle_tb();
reg clk;
reg[3:0] original_signal;
wire[3:0] delayed_signal;
delay_one_cycle doc_inst (clk, original_signal, delayed_signal);
// Initial setup
initial begin
clk = 0;
original_signal = 4'd9;
#5 original_signal = 4'd10;
#5 original_signal = 4'd11;
#4 original_signal = 4'd12;
#3 original_signal = 4'd13;
// finish the simulation
#5 $finish;
end
// clock
always begin
#1 clk = !clk;
end
endmodule
ist die Wellenform: Die Wellenform zeigt, zum Beispiel, wenn die Eingangssignaländerungen an der Taktflanke bis 1010, Ausgabe auch zur gleichen Zeit ändert.
Das verzögerte Signal wird nicht wirklich auf den nächsten Zyklus verzögert!
1) Was bedeutet die einzelne Aussage @ (posedge clk); machen? Ich habe nur Syntax wie gesehen: immer @ (posedge clk) beginne .... Ende. 2) Welche Art von Konstrukt ist es und wie es mit Wiederholung oben funktioniert? Zum Beispiel: wiederhole (5) @ (posedge clk); 3) Sind beide wiederholen (5) @ (posedge clk); und nicht-blocking (<=) benötigt, um die richtige Simulation zu erhalten? – user3330840