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

qcu
-
-
Posty:2
Rejestracja:16 sty 2007, o 01:22
Lokalizacja:warszawa
VHDL - ukld liczący pierwiastek

Postautor: qcu » 16 sty 2007, o 10:03

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

Awatar użytkownika
bis
-
-
Posty:134
Rejestracja:12 maja 2005, o 08:11
Lokalizacja:Warszawa

Postautor: bis » 16 sty 2007, o 22:52

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

Piotr
Moderator
Moderator
Posty:468
Rejestracja:14 lut 2003, o 13:53
Lokalizacja:Warszawa
Kontaktowanie:

Postautor: Piotr » 17 sty 2007, o 14:23

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

ziggy
-
-
Posty:25
Rejestracja:2 cze 2006, o 21:44
Lokalizacja:Podkarpacie
Kontaktowanie:

Postautor: ziggy » 17 sty 2007, o 14:50

VHDL jest jezykiem progrogramowania o zdecydowanie innej filozofii niż programowanie w C, Basicu czy Pascalu.
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.

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

Awatar użytkownika
bis
-
-
Posty:134
Rejestracja:12 maja 2005, o 08:11
Lokalizacja:Warszawa

Postautor: bis » 17 sty 2007, o 22:56

Jak widzę cos takiego to po prostu... "czasami po prostu brakuje kamieni".
VHDL jest jezykiem opisu sprzętu, nie zaś językiem programowania
dla mnie jest to równowazne czemus takiemu:
Ciężarówka jest narzedziem do wożenia kierowcy, nie zaś pojazdem samochodowym
W jednym i drugim stwierdzeniu jest tyle samo prawdy,wiedzy i rozumienia tematu.
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

Piotr
Moderator
Moderator
Posty:468
Rejestracja:14 lut 2003, o 13:53
Lokalizacja:Warszawa
Kontaktowanie:

Postautor: Piotr » 17 sty 2007, o 23:50

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

qcu
-
-
Posty:2
Rejestracja:16 sty 2007, o 01:22
Lokalizacja:warszawa

Postautor: qcu » 18 sty 2007, o 00:32

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

dawid Wat
-
-
Posty:2
Rejestracja:27 lut 2007, o 21:42
Lokalizacja:warszawa
Kontaktowanie:

Postautor: dawid Wat » 27 lut 2007, o 22:29

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

Wróć do „PLD/FPGA i inne zagadnienia techniki cyfrowej”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 5 gości