Skocz do zawartości

Kurs FPGA - #4 - pierwszy projekt, przykład VHDL


Pomocna odpowiedź

  • 1 rok później...
(edytowany)

Cześć wszystkim, 

Od dość długiego czasu jestem z Forbotem, jako w miarę doświadczony elektronik (inżynier testów), jednakże raczej nie udzielający się na forum tylko je lurkujący. Poczułem, że w końcu nadszedł czas na zajęcie się FPGA, wprowadzony zostałem w temat VHDL przez kolegów z Politechniki, poprzez Vivado na Artixie 7. Chciałem jednak mieć możliwość popracowania w domu samemu, na wstęp seria XC-7, której koszt kształtuje się w zakresie 2-2,5k PLN nie wydawała się tak atrakcyjna jak propozycja Botlandu, oparta na (nadal produkowanym, choć bez wsparcia dla środowiska) series XC-3, gdzie przy wydatku poniżej pół tysiąca można zacząć zgłębiać FPGA. Oczywiście Webpack ISE przestał być wspierany przez AMD-Xilinx, zatem jego uruchamianie (co widać po postach na tym forum) na systemach Win 8+ jest utrudniona, działała wersja 32-bitowa, jednak od pewnego czasu (Win 10 22H2 oraz Win 11) brakuje pewnej biblioteki dll dla Visual C++, przez co kosztuje to nieco więcej wysiłku aby uruchomić. Na IOS oraz Linuxie śmiga bezproblemowo, jednak z przyzwyczajenia oraz zachęcony łatwością zarządzania COM portów w Win postanowiłem i tak skierować się w stronę wersji na okienka. 

 

Do rzeczy po tym przydługim wstępie- z racji wyżej wymienionych powodów oraz faktu, iż wersja Webpacka ISE dla Win 10 przygotowana przez Xilinxa to po prostu maszyna wirtualna Ubuntu na VirtualBox z zainstalowanym ISE (co nie działa najlepiej ze względu na sposób udostępniania zasobów sprzętowych takich jak porty COM maszynie wirtualnej przez VirtualBox Guest Additions), postanowiłem przygotować sobie środowisko po swojemu i oparłem się na Windowsie 7, wirtualizowanym przez VMWare, czyli wirtualizator typu pierwszego, pozwalający działać bezpośrednio na sprzęcie z pominięciem hosta. ISE działa na wirtualizowanym w ten sposób Win 7 z hostem Win 11 idealnie. 

 

Pytania jakie mi się nasunęły, już przy pierwszym programie dotyczą Warningów, które wstawiam poniżej. 

image.thumb.png.e46639999db83312c627a5c874f66871.png

Pierwszy z nich, to jest Xst:663 rozwiązałem dodając explicit wpisanie sygnałowi "mryganie" wartości 0 przed blokiem process, jak poniżej:

image.thumb.png.99e980ab9deded0fd20961cebe87aa6a.png

Jednakże z pozostałymi nie jestem w stanie sobie poradzić. Próbowałem już ustawiać parametr ignore_keep_hierarchy w map properties, ale nie zmieniało to nic. Kod zrealizowany jak w lekcji. Dla referencji, wstawiam go poniżej (może nie widzę własnego błędu):

----------------------------------------------------------------------------------
-- Company: 
-- Engineer: 
-- 
-- Create Date:    01:17:21 12/21/2023 
-- Design Name: 
-- Module Name:    LED_blink_top - Behavioral 
-- Project Name: 
-- Target Devices: 
-- Tool versions: 
-- Description: 
--
-- Dependencies: 
--
-- Revision: 
-- Revision 0.01 - File Created
-- Additional Comments: 
--
----------------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

-- Uncomment the following library declaration if using
-- arithmetic functions with Signed or Unsigned values
use IEEE.NUMERIC_STD.ALL;

-- Uncomment the following library declaration if instantiating
-- any Xilinx primitives in this code.
--library UNISIM;
--use UNISIM.VComponents.all;

entity LED_blink_top is
    Port (
        Clk : in STD_LOGIC; -- deklaracja, ze bedziemy korzystac z sygnalu zegarowego jako wejscie
        LED : out STD_LOGIC_VECTOR(7 DOWNTO 0) -- zestaw diod led jako wyjscie; tutaj w ostatniej deklaracji nie ma srednika, jest on na domknieciu nawiasu
        );
end LED_blink_top;

architecture Behavioral of LED_blink_top is

constant LICZNIK_LIMIT: integer := 50000000; -- deklaracja stalej z max wart licznika

signal licznik : unsigned(24 downto 0); --definicja sygnalu lokalnego
--zdefiniowano zmienna o szerokosci 25 bitow
signal mryganie : STD_LOGIC_VECTOR(7 downto 0) := "00000000"; --zmienna lokalna o szerokosci 8 bitow


begin
mryganie <= "00000000"; --zapiecie wartosci 0 explicitly poprzez przypisanie, inaczej jest warning
process(Clk) --blok proces 
--"szczegolowe wyjasnienia w dalszej czesci kursu"
    begin
        if rising_edge(Clk) then -- dla kazdego narastajacego zbocza zegarowego
        
            if licznik = LICZNIK_LIMIT then -- gdy wartosc licznika osiagnela wartosc max
                            
                licznik <= b"0000000000000000000000000"; -- wyzeruj licznik
                mryganie <= not mryganie; -- zmien stan wszystkich bitow sygnalu mryganie na przeciwny
                
            else -- ponizszy kod wykona sie gdy wartosc licznika nie osiagnela wartosci maksymalnej
                licznik <= licznik + 1; --zwieksz wartosc licznika o jeden (inkrementacja)
                
            end if;
        end if;

end process;

LED <= mryganie; -- przypisujemy wartosc sygnalu mryganie do wyjscia led (zadeklarowanego w bloku Port tego entity);


end Behavioral;

 

Edytowano przez pyrchewsky
Wstawienie kodu w prawidłowy sposób do posta.

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...