Entwurf eines Ampelsteuerungssystems auf FPGA-Basis
Globaler Lieferant elektronischer Komponenten AMPHEO PTY LTD: Umfangreiches Inventar für One-Stop-Shopping. Einfache Anfragen, schnelle, individuelle Lösungen und Angebote.
Dies ist ein klassisches FPGA-Projekt, das FSM-Design, Debouncing, Clock-Domain-Hygiene, Timing und Hardware-Bring-up berührt. Im Folgenden finden Sie ein komplettes, synthetisierbares SystemVerilog-Design für eine Zweiwegkreuzung mit Fußgängertasten, Nacht-(blinkendem)Modus und Notfallvorsorge. Es ist parametriert, einfach auf jedes Board zu portieren und kommt mit einer Testbank, Timing-Notizen und einer Bring-up-Checkliste.
1) Umfang & Funktionen
-
Zwei Richtungen: Nord–Süd (NS) und Ost–West (EW)
-
Phasen: Grün → Gelb → Rot-Zwischenschaltung → (andere Straße) Grün → …
-
Fußgängeranforderungen (zwei Taster): werden während der Grünphase der querenden Straße bedient, mit garantierter GEH-Zeit
-
Nachtmodus: blinkendes Gelb auf NS und blinkendes Rot auf EW
-
Vorrangschaltung für Einsatzfahrzeuge (zwei Eingänge): sofortige Räumung auf Rot, dann Grün für die anfordernde Richtung
-
Parametrisierte Dauerwerte und Taktfrequenz
-
Sauberer 1-Hz-„Sekundentakt“, robuste Tasterentprellung
-
One-Hot-FSM, synchrone Resets, kein
#delay
(voll synthesefähig)
2) Zeitplan (Standardwerte)
-
GRÜN_MIN_SEK_NS = 15
,GRÜN_MIN_SEK_EW = 12
-
GELB_SEK = 3
,ALLE_ROT_SEK = 1
-
GEH_SEK = 10
-
VORRANG_ROT_SEK = 2
(alle Rot vor Freigabe der Vorrangrichtung)
3) Zustandsdiagramm (Konzept)
Fußgängerüberquerung der NS-Fahrbahn ist während EW_GRÜN erlaubt (und umgekehrt). GEH-Signal wird für die ersten GEH_SEK
Sekunden der betreffenden Grünphase gegeben, wenn ein Taster gedrückt wurde.
4) Top-Level I/O (Vorschlag)
Eingänge
-
clk
— Board-Takt (z. B. 100 MHz auf vielen Artix-7 Boards) -
rst_n
— Reset aktiv-low -
ped_btn_ns
,ped_btn_ew
— Fußgängertaster (asynchron, intern entprellt) -
emergency_ns
,emergency_ew
— Vorranganforderungen (level-sensitiv) -
night_mode
— Nachtmodus aktivieren (level-sensitiv)
Ausgänge
-
ns_red, ns_yel, ns_grn
-
ew_red, ew_yel, ew_grn
-
ped_walk_ns
— „GEH“ über NS-Fahrbahn (aktiv während EW-Grün bei Anforderung) -
ped_walk_ew
— „GEH“ über EW-Fahrbahn (aktiv während NS-Grün bei Anforderung)
5) Synthesefähiges SystemVerilog
5.1 Sekunden Tick Generator (parametriert)
5.2 Druckknopf Debouncer (pro Knopf)
5.3 Verkehrsregler FSM
5.4 Top Modul (Verkabelung Tick + Debouncer + Controller)
6) Minimaler Testbench (schnelle Simulation)
Ein Testbench mit reduziertem Takt (1 kHz) und verkürzten Zeitwerten, damit ein kompletter Zyklus in Millisekunden abläuft.
`timescale 1us/1ns
module tb_traffic;
localparam int F_CLK_HZ_SIM = 1000;
logic clk = 0;
logic rst_n = 0;
always #0.5 clk = ~clk; // 1 kHz
// Shrink times for simulation
localparam int GNS = 5, GEW = 4, Y = 2, AR = 1, WALK = 3, PRE = 1;
logic ped_btn_ns, ped_btn_ew, emergency_ns, emergency_ew, night_mode;
wire ns_r, ns_y, ns_g, ew_r, ew_y, ew_g, ped_w_ns, ped_w_ew;
traffic_top #(
.F_CLK_HZ(F_CLK_HZ_SIM),
.GREEN_MIN_SEC_NS(GNS),
.GREEN_MIN_SEC_EW(GEW),
.YELLOW_SEC(Y),
.ALL_RED_SEC(AR),
.WALK_SEC(WALK),
.PREEMPT_RED_SEC(PRE)
) dut (
.clk, .rst_n,
.ped_btn_ns, .ped_btn_ew,
.emergency_ns, .emergency_ew,
.night_mode,
.ns_red(ns_r), .ns_yel(ns_y), .ns_grn(ns_g),
.ew_red(ew_r), .ew_yel(ew_y), .ew_grn(ew_g),
.ped_walk_ns(ped_w_ns), .ped_walk_ew(ped_w_ew)
);
initial begin
ped_btn_ns = 0; ped_btn_ew = 0; emergency_ns = 0; emergency_ew = 0; night_mode = 0;
#5 rst_n = 1;
// Request to cross NS roadway (served during upcoming EW green)
#200 ped_btn_ns = 1; #3 ped_btn_ns = 0;
// Later, trigger emergency in NS direction
#400 emergency_ns = 1; #50 emergency_ns = 0;
// Night mode for a moment
#400 night_mode = 1; #200 night_mode = 0;
// Request to cross EW roadway (served during upcoming NS green)
#100 ped_btn_ew = 1; #3 ped_btn_ew = 0;
#1000 $finish;
end
endmodule
7) Constraints (Xilinx-Beispiel)
Anpassung der Pins/Takte an dein FPGA-Board (z. B. Basys-3: 100 MHz-Takt auf W5).
LED-Pins nach eigener Belegung ersetzen.
# Clock
set_property PACKAGE_PIN W5 [get_ports clk]
set_property IOSTANDARD LVCMOS33 [get_ports clk]
create_clock -period 10.000 -name sys_clk [get_ports clk] ;# 100 MHz
# Reset (active-low button)
set_property PACKAGE_PIN U18 [get_ports rst_n]
set_property IOSTANDARD LVCMOS33 [get_ports rst_n]
set_property PULLUP true [get_ports rst_n]
# Buttons (debounced inside FPGA)
set_property PACKAGE_PIN T18 [get_ports ped_btn_ns]
set_property PACKAGE_PIN U17 [get_ports ped_btn_ew]
set_property IOSTANDARD LVCMOS33 [get_ports {ped_btn_ns ped_btn_ew}]
# Emergency & night mode (switches)
set_property PACKAGE_PIN V17 [get_ports emergency_ns]
set_property PACKAGE_PIN V16 [get_ports emergency_ew]
set_property PACKAGE_PIN W16 [get_ports night_mode]
set_property IOSTANDARD LVCMOS33 [get_ports {emergency_ns emergency_ew night_mode}]
# LEDs (example pins—replace!)
set_property PACKAGE_PIN U16 [get_ports ns_red]
set_property PACKAGE_PIN E19 [get_ports ns_yel]
set_property PACKAGE_PIN U19 [get_ports ns_grn]
set_property PACKAGE_PIN V19 [get_ports ew_red]
set_property PACKAGE_PIN W18 [get_ports ew_yel]
set_property PACKAGE_PIN W19 [get_ports ew_grn]
set_property PACKAGE_PIN U15 [get_ports ped_walk_ns]
set_property PACKAGE_PIN V15 [get_ports ped_walk_ew]
set_property IOSTANDARD LVCMOS33 [get_ports {ns_red ns_yel ns_grn ew_red ew_yel ew_grn ped_walk_ns ped_walk_ew}]
8) Inbetriebnahme-Checkliste
-
Takt prüfen: GPIO mit 1-Hz-Blinksignal ausgeben.
-
Reset:
rst_n=0
halten, dann loslassen — Start bei NS-Grün. -
Standardzyklus: ohne Eingaben den Ablauf G→Y→Rot→G prüfen.
-
Fußgänger: Taster während der anderen Grünphase drücken; GEH-Signal für
GEH_SEK
Sekunden sichtbar. -
Vorrang:
emergency_ns
oderemergency_ew
aktivieren; kurzer Rot-Block, dann sofort Grün für die Richtung. -
Nachtmodus:
night_mode
aktivieren; Blinken (NS Gelb / EW Rot) unabhängig vom FSM-Zustand.
9) Erweiterungen (leicht umsetzbar)
-
Fahrzeug-Induktionsschleifen zur dynamischen Grünverlängerung
-
7-Segment- oder OLED-Countdownanzeige
-
Akustischer Fußgängersignalgeber & blinkendes „DON’T WALK“
-
Zeitgesteuerter Nachtmodus (z. B. 00:00–05:00)
-
TMR (Triple Modular Redundancy) zur Fehlertoleranz
-
Formale Verifikation der Zustandsübergänge (niemals beide Richtungen grün gleichzeitig)
Verwandte Artikel
- ·Anwendung von Differenzkristalloszillatoren auf Hochgeschwindigkeits-FPGAs
- ·Faseroptisches chaotisches Verschlüsselungssystem basierend auf FPGA
- ·Wie implementiert man UART, SPI oder I2C in einem FPGA?
- ·Entwurf eines multifunktionalen Roboterarmsystems mit Gestenerkennungssteuerung auf Basis der FPGA-Technologie
- ·Entwurfstechniken zur Reduzierung des FPGA-Stromverbrauchs
- ·Kosten-Effektivität im Vergleich: Altera vs Xilinx vs Lattice
- ·Wie bootet man Linux auf einem Xilinx FPGA?
- ·Ist ein FPGA-Chip für die Algorithmusentwicklung geeignet?
- ·Die besten MCUs/MPUs für industrielle humanoide Roboter