Inhaltsverzeichnis:
- Schritt 1: System-Blackbox
- Schritt 2: Komponenten
- Schritt 3: D Flip-Flops
- Schritt 4: Bedingungen
- Schritt 5: Einschränkungen
- Schritt 6: Hauptquelldatei
- Schritt 7: Montage
- Schritt 8: Laden des Programms
Video: Energieeffiziente bewegungsaktivierte Straßenlaternen - Gunook
2024 Autor: John Day | [email protected]. Zuletzt bearbeitet: 2024-01-30 07:17
Unser Ziel mit diesem Projekt war es, etwas zu schaffen, das den Gemeinden Energie und finanzielle Ressourcen spart. Bewegungsaktivierte Straßenlaternen würden beides tun. Im ganzen Land wird Energie durch Straßenlaternen verschwendet, die leere Straßen beleuchten. Unser Straßenbeleuchtungssystem stellt sicher, dass die Lichter nur bei Bedarf eingeschaltet sind, wodurch Gemeinden unzählige Dollar eingespart werden. Mithilfe von Bewegungssensoren schaltet das System das Licht nur ein, wenn Autos anwesend sind. Auch für die Sicherheit von Fußgängern haben wir einen Override-Knopf implementiert, der alle Lichter auf der Straße einschaltet. Die folgenden Schritte führen Sie durch, wie wir unser verkleinertes Modell des Projekts mit Vivado und einem Basys 3-Board entworfen und gebaut haben.
Schritt 1: System-Blackbox
Wir begannen dieses Projekt mit dem Zeichnen eines einfachen Black-Box-Diagramms. Ein Black-Box-Diagramm zeigt einfach die Ein- und Ausgänge, die unser System benötigt, um alle notwendigen Prozesse abzuschließen. Wir haben versucht, unser Design so einfach und einfach wie möglich zu halten. Zu unseren drei Systemeingängen gehörten ein Bus von Bewegungssensoren (4 für unser verkleinertes Modell), eine Fußgängerüberbrückungstaste und ein Uhreingang. Auf der anderen Seite ist unser einzelner Ausgang ein Bus von LED-Leuchten, der unsere Straßenlaternen repräsentiert. Für dieses Modell haben wir ein Szenario mit 16 Straßenlaternen verwendet, einfach weil dies die maximale Anzahl der eingebauten LED-Ausgänge auf dem Basys 3-Board ist. Mit diesem Diagramm konnten wir schließlich unsere Vivado-Projekt-, Quell- und Einschränkungsdateien mit entsprechenden Ein- und Ausgaben erstellen.
Schritt 2: Komponenten
In diesem Schritt tauchen wir tiefer ein und untersuchen die Komponenten, aus denen unser Black-Box-Diagramm besteht. Unsere erste Komponente ist eine VHDL-Quelldatei mit D-Flip-Flops. D-Flip-Flops nehmen einfach jedes Signal, das ihnen von den Sensoren an der steigenden Taktflanke zugeführt wird, und verriegeln diese Daten bis zur nächsten steigenden Flanke. Dies verhindert, dass unsere empfindlichen Bewegungssensoren ein "Flackern" der Ausgangs-LEDs verursachen. Außerdem legen wir ein einzelnes D-Flip-Flop auf das Tasteneingangssignal, um die LEDs nach dem Drücken der Taste für etwa 5-7 Sekunden eingeschaltet zu lassen. Wir haben dies auch durch einen Taktteiler laufen lassen.
Entität clk_div2 ist Port (clk: in std_logic; sclk: out std_logic); Ende clk_div2;
Architektur my_clk_div von clk_div2 ist
Konstante max_count: integer:= (3000000); Signal tmp_clk: std_logic:= '0'; begin my_div: Prozess (clk, tmp_clk) Variable div_cnt: Ganzzahl:= 0; begin if (rising_edge(clk)) then if (div_cnt = MAX_COUNT) then tmp_clk <= nicht tmp_clk; div_cnt:= 0; sonst div_cnt:= div_cnt + 1; Ende, wenn; Ende, wenn; sclk <= tmp_clk; Prozess beenden my_div; end my_clk_div;
Unsere letzte Komponente in diesem Diagramm ist eine verhaltensbezogene VHDL-Quelldatei, die Bedingungen für die Ausgaben enthält, die auf der Konfiguration der Eingangssignale basieren.
Schritt 3: D Flip-Flops
Die vier an die Eingangssignale angeschlossenen Flip-Flops sind für die Funktionalität unseres Systems unerlässlich. Wie bereits erwähnt, verwenden die Flip-Flops mit empfindlichen Bewegungssensoren und einer Override-Taste Latches, um unser Eingangssignal nur bei der steigenden Flanke des Takts auszugeben. Diese sequentielle Logik bedeutet, dass unsere Straßenbeleuchtung für eine bestimmte Zeit eingeschaltet bleiben kann, nachdem sie durch eine schnelle Bewegung ausgelöst wurde. Die Codierung für einen D-Flip Flop ist ziemlich einfach:
beginprocess (CLK) begin if steigende_flanke(CLK) then Q <= D; Ende, wenn; Prozess beenden;
Das Ganze kann in eine einzige if-Anweisung kompiliert werden. Sobald wir dieses Stück hatten, erstellten wir eine strukturelle VHDL-Quelldatei, die alle vier unserer notwendigen Flip-Flops enthält:
begin DFF0: DFF-Port-Map (CLK => CLK, D => D(0), Q => Q(0)); DFF1: DFF-Port-Map (CLK => CLK, D => D(1), Q => Q(1)); DFF2: DFF-Port-Map (CLK => CLK, D => D(2), Q => Q(2)); DFF3: DFF-Port-Map (CLK => CLK, D => D(3), Q => Q(3));
Ende Verhalten;
Dies trägt dazu bei, unsere Stammstrukturdatei, in der wir alle Systemkomponenten zusammenführen, viel sauberer und organisierter zu halten.
Schritt 4: Bedingungen
Um unseren Code kompakt und effizient zu halten, haben wir alle unsere Bedingungen in einer einzigen Case-Anweisung geschrieben. Für unser verkleinertes Modell hatten wir 16 mögliche LED-Ausgangskonfigurationen, da jeder Bewegungssensor für eine Gruppe von 4 LEDs verantwortlich ist.:
Fall NMS ist wenn "1111" => LED LED LED LED LED LED LED LED LED LED LED LED LED LED LED LED <= "11111111111111111"; Endfall;
Schritt 5: Einschränkungen
Um Ihre Ein- und Ausgänge mit Vivado richtig anzugeben, müssen Sie eine Einschränkungsdatei implementieren, die alle verwendeten Ports, Tasten, LEDs und Uhren angibt.
set_property PACKAGE_PIN W5 [get_ports CLK] set_property IOSTANDARD LVCMOS33 [get_ports CLK]
set_property PACKAGE_PIN U16 [get_ports {LED[0]}] set_property IOSTANDARD LVCMOS33 [get_ports {LED[0]}] set_property PACKAGE_PIN E19 [get_ports {LED[1]}] set_property IOSTANDARD LVCMOS33 [get_PACK_prop_Perty.] set U19 [get_ports {LED[2]}] set_property IOSTANDARD LVCMOS33 [get_ports {LED[2]}] set_property PACKAGE_PIN V19 [get_ports {LED[3]}] set_property IOSTANDARD LVCMOS33 [get_ports {LED[3]}] set_property PACKAGE_PIN get_ports {LED[4]}] set_property IOSTANDARD LVCMOS33 [get_ports {LED[4]}] set_property PACKAGE_PIN U15 [get_ports {LED[5]}] set_property IOSTANDARD LVCMOS33 [get_ports {LED[5]}] set_property PACKAGE_PIN U14 [get_ports {LED[5]}] LED[6]}] set_property IOSTANDARD LVCMOS33 [get_ports {LED[6]}] set_property PACKAGE_PIN V14 [get_ports {LED[7]}] set_property IOSTANDARD LVCMOS33 [get_ports {LED[7]}] set_property PACKAGE_PIN V13 [get_ports {LED 8]}] set_property IOSTANDARD LVCMOS33 [get_ports {LED[8]}] set_property PACKAGE_PIN V3 [get_ports {LED[9]}] set_property IO STANDARD LVCMOS33 [get_ports {LED[9]}] set_property PACKAGE_PIN W3 [get_ports {LED[10]}] set_property IOSTANDARD LVCMOS33 [get_ports {LED[10]}] set_property PACKAGE_PIN U3 [get_ports {LED[11]}] set_property LVCMOS33 [get_ports {LED[11]}] set_property PACKAGE_PIN P3 [get_ports {LED[12]}] set_property IOSTANDARD LVCMOS33 [get_ports {LED[12]}] set_property PACKAGE_PIN N3 [get_ports {LED[13]}] set_property IOget_property IOget_STANDARD LVCMOS33 {LED[13]}] set_property PACKAGE_PIN P1 [get_ports {LED[14]}] set_property IOSTANDARD LVCMOS33 [get_ports {LED[14]}] set_property PACKAGE_PIN L1 [get_ports {LED[15]}] set_property IOSTANDARD_portsMOS {33 [.get_ports {LED[14]}] [fünfzehn]}]
set_property PACKAGE_PIN U18 [get_ports BTN] set_property IOSTANDARD LVCMOS33 [get_ports BTN]
set_property PACKAGE_PIN A14 [get_ports {MS[0]}] set_property IOSTANDARD LVCMOS33 [get_ports {MS[0]}] set_property PACKAGE_PIN A16 [get_ports {MS[1]}] set_property IOSTANDARD LVCMOS33 [get_PACKAGE_PINty.] set B15 [get_ports {MS[2]}] set_property IOSTANDARD LVCMOS33 [get_ports {MS[2]}] set_property PACKAGE_PIN B16 [get_ports {MS[3]}] set_property IOSTANDARD LVCMOS33 [get_ports {MS[3]}]
Schritt 6: Hauptquelldatei
In dieser Hauptdatei fassen wir alle zuvor erwähnten Komponentenquelldateien zusammen. Diese Datei fungiert als struktureller Code, der die unterschiedlichen Komponenten zusammenführt.
Entität Master_Final_Project ist Port (BTN: in STD_LOGIC; CLK: in STD_LOGIC; MS: in STD_LOGIC_VECTOR (3 bis 0); LED: aus STD_LOGIC_VECTOR (15 bis 0); Master_Final_Project beenden;
Architektur Verhalten von Master_Final_Project ist
Komponente final_project ist Port (--CLK: in STD_LOGIC; NMS: in STD_LOGIC_VECTOR (3 bis 0); BTN: in STD_LOGIC; --sw: in STD_LOGIC_Vector (1 bis 0); LED: aus STD_LOGIC_VECTOR (15 bis 0); Endkomponente;
Komponente Final_DFF ist
Port (CLK: in STD_LOGIC; D: in STD_LOGIC_Vector (3 downto 0); Q: out STD_LOGIC_Vector (3 downto 0)); Endkomponente;
Signal DFF02proj30: STD_LOGIC;
Signal DFF12proj74: STD_LOGIC; Signal DFF22proj118: STD_LOGIC; Signal DFF32proj1512: STD_LOGIC;
Start
DFF0: Final_DFF-Port-Map (CLK => CLK, D(0) => MS(0), D(1) => MS(1), D(2) => MS(2), D(3) => MS(3), Q(0) => DFF02proj30, Q(1) => DFF12proj74, Q(2) => DFF22proj118, Q(3) => DFF32proj1512; Proj0: final_project port map (NMS(0) => DFF02proj30, NMS(1) => DFF12proj74, NMS(2) => DFF22proj118, NMS(3) => DFF32proj1512, BTN => BTN, LED => LED); Ende Verhalten;
Schritt 7: Montage
Die Hardware-Montage für dieses Projekt ist minimal. Die einzigen benötigten Teile sind wie folgt:
1. Basys-3-Platine (1)
2. Günstige Bewegungssensoren, die hier bei Amazon zu finden sind. (4)
3. Stecker-zu-Buchse-Leitungen (4)
Montage:
1. Schließen Sie 4 männliche Kabel an die JB-Ports 1-4 des PMod-Headers an (siehe Abbildung).
2. Verbinden Sie die weiblichen Enden mit den Ausgangspins jedes Bewegungssensors.
Schritt 8: Laden des Programms
Jetzt können wir die VHDL-Master-Quelldatei auf das Basys 3-Board laden. Stellen Sie sicher, dass die Synthese, Implementierung und Generierung der Bitstromprüfung auf mögliche Fehler ausgeführt wird. Wenn alle erfolgreich laufen, öffnen Sie den Hardware-Manager und programmieren Sie das Basys 3-Gerät. Ihr Projekt ist nun abgeschlossen!
Empfohlen:
Bewegungsaktivierte Cosplay Wings mit Circuit Playground Express - Teil 1: 7 Schritte (mit Bildern)
Bewegungsaktivierte Cosplay-Flügel mit Circuit Playground Express - Teil 1: Dies ist Teil 1 eines zweiteiligen Projekts, in dem ich Ihnen meinen Prozess zur Herstellung eines Paars automatisierter Feenflügel zeige. Der erste Teil des Projekts ist der Mechanik der Flügel, und der zweite Teil macht es tragbar und fügt die Flügel hinzu