Ich schreibe den Verilog-Code für einen UART, der auf einem FPGA implementiert werden soll, und ich habe Probleme mit der Synchronisierung auf das START-Bit von Bytes nach dem ersten.Verilog Falling Edge Detection
Mein Manager schlug vor, mein empfangenes Signal zu synchronisieren und eine Art Interrupt zu verwenden, um der FSM mitzuteilen, dass ein Start erkannt wurde.
Ich habe über Techniken für die steigende Flanke Erkennung lesen, und ich fühle mich wie ich etwas tun könnte:
module StartDetectionUnit (
input clk, state, signal_in,
output trigger
);
reg signal_d;
always @(posedge clk)
begin
signal_d <= signal_in;
end
assign trigger = signal_in & (!signal_d);
endmodule
In meinem Verständnis, wie diese eine Beschreibung eine ansteigende Flanke erkennt, nicht eine abfallende Flanke, aber "START" ist eine logische "0" in der RS-232-Kommunikation.
Plus, ich möchte tatsächlich die Flagge nur zuweisen, wenn im IDLE-Zustand [Hardcoded als 000], aber verrückte Gating auf den endgültigen Aufgaben klingt nicht-hardware für mich.
TLDR, zwei Ausgaben
- eine gattungsgemäße abfallende Flanke eines asynchronen Eingangssignal
- dabei in einem einzigen, bestimmten Zustand eines FSM
durch ein Bündel zu erfassen, i‘ m neu zu Verilog und irgendwie neu zu HDL'ing
zu klären: "signal_in" ist das Bit ich von meiner USB-To-UART-Brücke oder Testumgebung während der Simulation erhalten würde. Modul StartDetectionUnit ( Eingang Clk, Zustand, Signal_in, Ausgang Auslöser ); reg signal_d; immer @ (pagedge clk) beginnen signal_d <= signal_in; Ende zuweisen Trigger = (! Signal_in) & Signal_d & (! Zustand); endmodule Ich schrieb es so, und es scheint von meinen ersten paar Simulationen Iterationen richtig zu funktionieren. Der Status, in dem ich arbeiten muss, ist als "000" codiert. –
Asynchrones externes Eingangssignal kann nicht simuliert werden. Es wird immer in der Simulation funktionieren. – FabienM
Sogar durch eine Testbench? –