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.

Register und Prozesse

In diesem Schritt wurde ein Power-On Reset mit einfachen Registern durch einen Prozess realisiert. Hier das Code-Fragment dazu:

-- 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