Schritt 1: Blinkende LED
Im ersten Schritt soll die LED mit ca. 1 Hz zum Blinken gebracht werden.
Zuerst sehen wir uns dazu die neue Entity an:
entity BlinkingLed is
port (
EXT_CLK : in std_logic; --! 125 MHz system clock
BTN : in std_logic_vector(3 downto 0); --! Button inputs, high acitve
LED : out std_logic --! LED output, high acitve
);
end BlinkingLed;
Es ist ein Takteingang EXT_CLK dazugekommen.
Der Eingang BTN ist nun vom Typ std_logic_vector. Die 4 Taster sind also zu einem einzelnen Signal zusammengefasst worden.
-- reset
signal GenInitR : std_logic := '1'; --! Causes an init pulse after power on
signal InitC : std_logic; --! Synchronous reset condition
signal InitR : std_logic; --! Synchronous reset
-- input and output
signal Clk : std_logic; --! Internal processing clock
-- temporary
signal EnableC : std_logic; --! Example for a clock enable
begin
-- clock generation
Clk <= EXT_CLK;
--! Simple flipflops
p_simple : process (Clk)
begin
if rising_edge(Clk) then
GenInitR <= GenInitR and not InitR; -- Release InitR after it was activated
InitR <= InitC;
end if;
end process;
InitC <= GenInitR; -- Reset on power on
GenInitR ist ein Registersignal, welches beim Start des FPGAs gesetzt ist (:= '1'). Es bleibt so lange gesetzt, bis InitR gesetzt wurde.
InitR übernimmt immer den Zustand von InitC, der Reset-Bedingung. Wenn sich die Reset-Bedingung ändert, so wird einfach der Code InitC <= ... angepasst.
Zähler
Um einen Taktgeber erzeugen zu können, benötigt man einen Zähler mit dem den Verarbeitungstakt von hier 125 MHz (ZYBO) bzw. 100 MHz (ARTY) auf den gewünschten Takt herunterteilen kann.
Da 125.000.000 ungefähr 227 ist, würde das oberste Bit eines 27 Bit Zählers, der mit 125 MHz aufwärts zählt ungefähr eine Blinkfrequenz von 1 Hz ergeben.
Für den Zähler benötigen wir einen std_logic_vector (26 downto 0) und einen Zählprozess. Passen Sie also den Source Code durch Eingabe bzw. Kopieren der folgenden Code-Snippets an.
Fügen Sie die Signaldeklaration hinzu:
-- counter
signal ToggleCntR : std_logic_vector(26 downto 0); --! Generate main time base
und passen sie den Prozess p_sync an:
p_sync : process (Clk)
begin
if rising_edge(Clk) then
if (InitR = '1') then
ToggleCntR <= (others => '0');
else
ToggleCntR <= ToggleCntR + 1;
end if;
end if;
end process;
LED <= ToggleCntR(26);
Starten Sie die Bitstream Generierung und laden Sie das FPGA neu und die LED wird nun mit ca. 1 Hz blinken.
Weiter zum 2. Schritt