Witam,
potrzebyję zaimplementować w vhdlu bloczek (jeden z elementów projektu), który na wejsciu dostaje liczbę w postaci 16bitowego wektora std_logic_vector a na wyjściu zwraca wartość pierwiastka tej liczby ( jesli nie istnieje liczba całkowita będąca pirwiastkiem danej liczby to wystarczy że zaokrągli w górę). Próbowałem zrobić coś takiego:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all; --lib zawierająca funkcje konwersji
entity Sqrt is
generic (N:natural:=16);
port (s_in: in std_logic_vector (N-1 downto 0);
s_out : out std_logic_vector(N-1 downto 0));
end Sqrt;
architecture beh of Sqrt is
signal l : unsigned(N-1 downto 0);
signal k, m, o, p, y: integer;
begin
process
begin
s_out<= (others=>'0');
l<=unsigned(s_in); --konwersja std_logic_vector na unsigneg
k<=CONV_INTEGER(l); --konwersja unsigned na integer
--s_out <= "0000000000000000"; --inicjalizacja wartości poczatkowej
p<=1; --zmienna inkrementowna w pętli
y<=0; --wartość podawan na wyjście układu
--while s_out = "0000000000000000" loop
while (y=0) loop
o<=p*p; --podnoszenie do kwadratu
m<=(p+1)*(p+1);
if (o<k and k>=m) then
y<=p+1;
--konwersja sdt_logic_vector na integer
--s_out <= CONV_STD_LOGIC_VECTOR(y);
end if;
p<=p+1; --zwiekszanie o jeden za każdym obiegim petli
end loop;
end process;
end beh;
Algorytm ten miał działać w następujący sposób:
pętla while przestaje być wykonywana w momencie gdy wartość "wyjsciowa" y zmienia swoją wartość z zera na jakąś inną. W pętli tej obliczan jest wartość p^2 i (p+1)^2 a następnie sprawdzam czy wartość wejściowa mieści się między tymi liczbami, jesli warunek ten jest spełoniony (sprawdzanie w if) to y=p+1, następnie należy y które jest typu integer skonwertować do std_logic wektor i podać na wyjście bloku. Jesli warunek if nie jest spełniony to p jest zwiększane o jeden i następuj powrót do początku pętli.
Mam jednak problem gdyż taki sposób nie działa:/ kompilację przeprowadzam na max+plus (ewentualnie mogłbym spróbować na quartusie) bo takie mam założenie projektowe.
Potrafi może ktoś mi pomóc, wskazać błedy w mojej implementacji, lub posiada gotowy kod i mógłby się nim podzieli? Bardzo by mi to pomogło.
pozdrawiam
Aktyw Forum
Zarejestruj się na forum.ep.com.pl i zgłoś swój akces do Aktywu Forum. Jeśli jesteś już zarejestrowany wystarczy, że się zalogujesz.
Sprawdź punkty Zarejestruj sięVHDL - ukld liczący pierwiastek
Moderatorzy:Jacek Bogusz, Moderatorzy
To jest chyba za duży problem na tłumaczenie na forum. VHDL jest jezykiem progrogramowania o zdecydowanie innej filozofii niż programowanie w C, Basicu czy Pascalu. Musisz zacząć od znacznie prostszych tematów aby dokładnie zrozumieć co tak naprawdę oznacza "równoległośc" i "sekwencyjnośc" poczczególnych instrukcji VHDL. W tym jezyku używa sie do zapisu słów kluczowych które tak samo wyglądają jak w innych językach programowania (loop, while, if then else...) ale ich znaczenie w VHDL jest trochę odmienne. Z opisu twojego problemu i sposobu w jaki chcesz go rozwiązać domniemywam że brakuje Tobie całkowicie zrozumienia czym jest VHDL i jak sie tego używa. Żeby wyjaśnić dlaczego to nie działa trzeba by najpierw przepisać kawał poręcznika do VHDL. Tak jak nie da sie wyjaśnić jak prowadzić bolid Formuły 1 osobie która nawet nie jeździ na rowerze tak tutaj bez nauki podstaw nie ruszysz od razu z konstruowaniem mini-koprocesorka (nawet w oparciu o tak uproszczony algorytm).
bis
bis
Max+Plus - sam z siebie - nie ma kompilatora VHDL, potrzebny jest dodatkowy, zewnetrzny syntezer (juz niedostepny), to pierwszy powazny problem.
Drugi jest taki, ze napisale _program_, a VHDL nie jest jezykiem programowania lecz opisu sprzetu (HDL - Hardware Description Language), jak to wyjasnil wczesniej bis. M.in. z tego powodu w VHDL nie mozesz napisac programu, ktory obliczy Ci pierwiastek, ale mozesz opisac blok funkcjonalny, ktory sprzetowo taka funkcje zrealizuje.
Zacznij od zrozumienia istoty HDL, wtedy chetnie Ci pomoge.
Pzdr
PZb
Drugi jest taki, ze napisale _program_, a VHDL nie jest jezykiem programowania lecz opisu sprzetu (HDL - Hardware Description Language), jak to wyjasnil wczesniej bis. M.in. z tego powodu w VHDL nie mozesz napisac programu, ktory obliczy Ci pierwiastek, ale mozesz opisac blok funkcjonalny, ktory sprzetowo taka funkcje zrealizuje.
Zacznij od zrozumienia istoty HDL, wtedy chetnie Ci pomoge.
Pzdr
PZb
Tak jest, z tym drobnym uściśleniem, że VHDL jest jezykiem opisu sprzętu, nie zaś językiem programowania (w znaczeniu klasycznym). I tutaj właśnie mają swoje źródła wszelkie różnice w znaczeniu pojęć takich jak sekwencyjnosć, równoległość, itp.VHDL jest jezykiem progrogramowania o zdecydowanie innej filozofii niż programowanie w C, Basicu czy Pascalu.
Co do układu liczącego pierwiastek, to w pierwszej iteracji wykorzystałbym dość oczywistą metodę polegającą na znajdowaniu pierwiasktów równania y*y-x=0 (do tego równania sprowadza się obliczanie pierwistka y=sqrt(x) - zob. np. tu ). Do obliczenia miejsc zerowych (pierwiastków) tego wielomianu można chociażby zastosować prostą metodę połowiania (dokładnie - jej sprzętową wersję). Z punktu widzenia VHDL wymaga to opisania odpowiedniego automatu sterującego kolejnością obliczeń oraz sprzętowej realizacji operacji mnożenia (dodawanie i odejmowanie - dostępne poprzez użycie typowych operatorów VHDL). Jeżeli docelowy układ FPGA zawiera wbudowane sprzętowe układy mnożące (np. Spartan 3) wówaczas nie ma problemu, w przeciwnym przypadku wirtualne komponenty multiplikatorów można znaleźć np. tutaj (jakby dobrze poszukać być może możnaby znaleźć jakiś IP core bliski liczącemu pierwiastek )
Jak widzę cos takiego to po prostu... "czasami po prostu brakuje kamieni".
Zakładając że w każdym projekcie VHDL robi sie też częsć testującą, a nie każdy projekt jest syntetyzowalny (tak, tak, wiele modeli powstaje wyłącznie do celów symulacyjnych i nie da sie z nich syntetyzować czegokolwiek) to logika wskazuje że większość istniejącego kodu VHDL (chociażby same części testujące) nie jest opisem sprzętu!!! A teraz proszę o wykazanie ze napisanie kodu do testowania nie jest programowaniem!! Oczywiście VHDL ma swoją specyfikę i podstawową sprawą jest zrozumienie "równoległości" instrukcji i procesów opisanych w tym języku. Na pewno łatwiej jest opanować podstawowe posługiwanie sie VHDL (małą częścią) wyobrażając sobie że te "instrukcje" wykonują konkretne układy sprzętowe ale już prosty testbench daleko wychodzi poza takie rozumienia języka.
A teraz z innej beczki. Wystarczy sobie uświadomić ile elementów i konstrukcji języka programowania VHDL nie jest syntetyzowalna aby obśmiać tak zawężone pojmowanie co to jest VHLD jak to z pierwszego cytatu.
bis
dla mnie jest to równowazne czemus takiemu:VHDL jest jezykiem opisu sprzętu, nie zaś językiem programowania
W jednym i drugim stwierdzeniu jest tyle samo prawdy,wiedzy i rozumienia tematu.Ciężarówka jest narzedziem do wożenia kierowcy, nie zaś pojazdem samochodowym
Zakładając że w każdym projekcie VHDL robi sie też częsć testującą, a nie każdy projekt jest syntetyzowalny (tak, tak, wiele modeli powstaje wyłącznie do celów symulacyjnych i nie da sie z nich syntetyzować czegokolwiek) to logika wskazuje że większość istniejącego kodu VHDL (chociażby same części testujące) nie jest opisem sprzętu!!! A teraz proszę o wykazanie ze napisanie kodu do testowania nie jest programowaniem!! Oczywiście VHDL ma swoją specyfikę i podstawową sprawą jest zrozumienie "równoległości" instrukcji i procesów opisanych w tym języku. Na pewno łatwiej jest opanować podstawowe posługiwanie sie VHDL (małą częścią) wyobrażając sobie że te "instrukcje" wykonują konkretne układy sprzętowe ale już prosty testbench daleko wychodzi poza takie rozumienia języka.
A teraz z innej beczki. Wystarczy sobie uświadomić ile elementów i konstrukcji języka programowania VHDL nie jest syntetyzowalna aby obśmiać tak zawężone pojmowanie co to jest VHLD jak to z pierwszego cytatu.
bis
Widze silne nalecialosci quasi-"akademickie", do tego "w nurcie" glownego tematu.
Nie wiem czy wiesz, ze piszac test w HDL niczego nie programujesz, lecz opisujesz zachowanie sie otoczenia testowanego ukladu/bloku/modulu i weryfikujesz jego reakcje (czyli jego zachowanie). Tzn. ja tak robie, podobnie do reszty cywilizowanego swiata.
_Nigdzie_ nie napisalem, ze "opis" musi byc syntezowany.
_Rownleglosc_ nie jest cecha VHDL-a ale wszystkich jezykow opsiu sprzetu, o czym wie kazdy, kto cos ze zrozumieniem zrobil w praktyce. Jest to jedna z cech jezykow HDL, odrozniajaca je od jezykow sekwencyjnych.
Szanowny Kolego, poniewaz zupelnie nie zgadzam sie z Twoja teoria (podobnie jak reszta znaczna czesc praktykujacego swiata), chetnie przyjme sensowny wyklad na temat _programowania_ w VHDL do EP, oczywiscie za stosownym honorarium.
Gwarantuje kompetentne recenzje.
Jezeli nie czujesz sie na silach czegos napisac, dalsza dyskusje, jesli musisz, przeniesmy na priva.
Pzdr
PZb
Dodano: 18-01-2007, 00:10
Dla porzadku i zrozumienia o czym mowimy (w warstwie leksykalnej):
"programować (sl. Europa) <...> 2. uruchamiać program sterujący danym urządzeniem. <...>"
"programować (sl. Wilga) cz. ndk Ia, ~any - zaprogramować dk Ia 1. ‘planować, układać program pracy, imprezy’ 2. ‘nastawiać parametry, algorytm urządzenia sterującego pracą czegoś’"
Tez pewnie sie myla ;-))
Pzdr
PZb
Nie wiem czy wiesz, ze piszac test w HDL niczego nie programujesz, lecz opisujesz zachowanie sie otoczenia testowanego ukladu/bloku/modulu i weryfikujesz jego reakcje (czyli jego zachowanie). Tzn. ja tak robie, podobnie do reszty cywilizowanego swiata.
_Nigdzie_ nie napisalem, ze "opis" musi byc syntezowany.
_Rownleglosc_ nie jest cecha VHDL-a ale wszystkich jezykow opsiu sprzetu, o czym wie kazdy, kto cos ze zrozumieniem zrobil w praktyce. Jest to jedna z cech jezykow HDL, odrozniajaca je od jezykow sekwencyjnych.
Szanowny Kolego, poniewaz zupelnie nie zgadzam sie z Twoja teoria (podobnie jak reszta znaczna czesc praktykujacego swiata), chetnie przyjme sensowny wyklad na temat _programowania_ w VHDL do EP, oczywiscie za stosownym honorarium.
Gwarantuje kompetentne recenzje.
Jezeli nie czujesz sie na silach czegos napisac, dalsza dyskusje, jesli musisz, przeniesmy na priva.
Pzdr
PZb
Dodano: 18-01-2007, 00:10
Dla porzadku i zrozumienia o czym mowimy (w warstwie leksykalnej):
"programować (sl. Europa) <...> 2. uruchamiać program sterujący danym urządzeniem. <...>"
"programować (sl. Wilga) cz. ndk Ia, ~any - zaprogramować dk Ia 1. ‘planować, układać program pracy, imprezy’ 2. ‘nastawiać parametry, algorytm urządzenia sterującego pracą czegoś’"
Tez pewnie sie myla ;-))
Pzdr
PZb
Witam,
W odniesieniu do obydwu wypowiedzi bis chciałem stwierdzić, iż mam świadomość że kod który tu podałem nie jest zbyt poprawny jesli chodzi o realizację w języku opisu sprzętowego, jednak zabrałem się do niego w taki sposób gdyż chciałem uzyskać układ o dość prostej budowie. Przyznaję że jeszcze wiele nie wiem jeśli chodzi o języki hdl jednak okreslenie że " nie potrafię jeździć na rowarze" nie jest zbyt trafne. Kontakt z językami hdl mam dopiero od 3 miesięcy, jednak nawet ja wiem że nie jest to język programowania i wydaje mi się że trzeba to przyjąć jako aksjiomat - jest to język opisu sprzętuowego i już.
Wracając do teroi bis, to chyba lubi ją wygłaszać i upierać sie przy niej, gdyż już spotkałem wypowiedź inetrnauty o tym samym niku na innym forum, gdzie próbował dowieść tej samej teorii, używał nawet tych samych cytatów, więc zapewne jest to ta sam osoba:)
Ps. drogi bis odpowiadając na moje pytanie nie trzeba byłoby przepisywać pół książki, Twoja odpowiedź była wystarczająco długa żeby wskazać w kilku słowach czamu przyjęty przeze mnie sposób realizacji jest zły i ewentualnie naprowadzić mnie na właciwy sposób rozwiązania.
pozdrawiam
W odniesieniu do obydwu wypowiedzi bis chciałem stwierdzić, iż mam świadomość że kod który tu podałem nie jest zbyt poprawny jesli chodzi o realizację w języku opisu sprzętowego, jednak zabrałem się do niego w taki sposób gdyż chciałem uzyskać układ o dość prostej budowie. Przyznaję że jeszcze wiele nie wiem jeśli chodzi o języki hdl jednak okreslenie że " nie potrafię jeździć na rowarze" nie jest zbyt trafne. Kontakt z językami hdl mam dopiero od 3 miesięcy, jednak nawet ja wiem że nie jest to język programowania i wydaje mi się że trzeba to przyjąć jako aksjiomat - jest to język opisu sprzętuowego i już.
Wracając do teroi bis, to chyba lubi ją wygłaszać i upierać sie przy niej, gdyż już spotkałem wypowiedź inetrnauty o tym samym niku na innym forum, gdzie próbował dowieść tej samej teorii, używał nawet tych samych cytatów, więc zapewne jest to ta sam osoba:)
Ps. drogi bis odpowiadając na moje pytanie nie trzeba byłoby przepisywać pół książki, Twoja odpowiedź była wystarczająco długa żeby wskazać w kilku słowach czamu przyjęty przeze mnie sposób realizacji jest zły i ewentualnie naprowadzić mnie na właciwy sposób rozwiązania.
pozdrawiam
witam ja napisalem cos takiego w VHDLu
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_arith.all; --lib zawierająca funkcje konwersji
entity pierwiastek is
port (s_in: in std_logic_vector (15 downto 0);
clk :in std_logic;
s_out : out std_logic_vector(15 downto 0));
end pierwiastek;
architecture beh of pierwiastek is
signal k, m, o, p, y: integer:=0;
begin
process(clk)
begin
if rising_edge(clk) then
k<=conv_integer(s_in);
if y=0 then
o<=p*p; --podnoszenie do kwadratu
if ( o>k) then
y<=o;
o<=0;
s_out<=conv_std_logic_vector((p-1),16);
end if;
p<=p+1; --zwiekszanie o jeden za każdym obiegim petli
end if;
end if;
end process;
end beh;
jak zaczelem przerabiac twuj program to mi cos takiego wyszlo:)
jednak ze wynik pierwiastka moze byc w tym programie tylko liczba calkowita to wyszlo cos takiego jak pokazuje na symulacji w Quartusie, pierwiastek ze 151 jest to 12,28 ale program jest tak skonstruowany ze daje wynik tylko calkowity wiec wynik bedzie rowny czesci calkowitej z pierwiastka liczby plus jeden....
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_arith.all; --lib zawierająca funkcje konwersji
entity pierwiastek is
port (s_in: in std_logic_vector (15 downto 0);
clk :in std_logic;
s_out : out std_logic_vector(15 downto 0));
end pierwiastek;
architecture beh of pierwiastek is
signal k, m, o, p, y: integer:=0;
begin
process(clk)
begin
if rising_edge(clk) then
k<=conv_integer(s_in);
if y=0 then
o<=p*p; --podnoszenie do kwadratu
if ( o>k) then
y<=o;
o<=0;
s_out<=conv_std_logic_vector((p-1),16);
end if;
p<=p+1; --zwiekszanie o jeden za każdym obiegim petli
end if;
end if;
end process;
end beh;
jak zaczelem przerabiac twuj program to mi cos takiego wyszlo:)
jednak ze wynik pierwiastka moze byc w tym programie tylko liczba calkowita to wyszlo cos takiego jak pokazuje na symulacji w Quartusie, pierwiastek ze 151 jest to 12,28 ale program jest tak skonstruowany ze daje wynik tylko calkowity wiec wynik bedzie rowny czesci calkowitej z pierwiastka liczby plus jeden....
Kto jest online
Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 5 gości