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ę

Problem z Quartusem II (VHDL)

Moderatorzy: Jacek Bogusz, Moderatorzy

gruzin
-
-
Posty: 10
Rejestracja: 28 sty 2007, o 16:53
Lokalizacja: Warszawa

Problem z Quartusem II (VHDL)

Postautor: gruzin » 28 sty 2007, o 17:04

Witam.
Mam problem z zapisem wartości do pliku *.txt. W innych kompilatorach wszystko jest ok, jednak w quartusie nie mogę sobie poradzić. Poniżej przedstawiam kod, który zamiast zapisywać dane do pliku, nie robi nic.

LIBRARY ieee;
USE ieee.std_logic_1164.all;
use STD.TEXTIO.all;

entity io93 is
PORT

( CLK: IN STD_LOGIC
);

end entity io93;

ARCHITECTURE Behave OF io93 IS
TYPE Reg IS RECORD
Number : POSITIVE;
Sum : NATURAL;
END RECORD;
FILE MyFile : TEXT OPEN WRITE_MODE IS "myfile.txt";
BEGIN
PROCESS(CLK)

VARIABLE l : LINE; -- declare a line variable
VARIABLE fNumber : POSITIVE;
VARIABLE fSum : NATURAL;
BEGIN
IF CLK'EVENT AND CLK = '1' then
WRITE(l,fNumber); -- Write an element to a line ...
WRITE(l,' '); -- ... separate with a blank ...
WRITE(l,fSum); -- ... another element to the same line ...
WRITELINE(MyFile,l); -- ... and write the line to the file
end if;
END PROCESS;
END ARCHITECTURE Behave;

Może ktoś spotkał się już z tego rodzajem problemu i wie jak go rozwiązać?
Pozdrawiam.

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

Postautor: bis » 30 sty 2007, o 18:29

W innych kompilatorach wszystko jest ok,
Proszę opisz bliżej co to oznacza, w jaki sposób wykonujesz ten program w "innych" kompilatorach a w jaki w Quartusie?

bis
PS. Z pewna taką nieśmiałością używam określenia "program" bo "opis sprzętu" zupełnie mi nie pasuje, ale może tym razem moderator nie każe mi się zamknąć i pisać wyłącznie na privie

gruzin
-
-
Posty: 10
Rejestracja: 28 sty 2007, o 16:53
Lokalizacja: Warszawa

Postautor: gruzin » 30 sty 2007, o 19:58

Już mówię.
W Quartusie poprostu nie mogę otworzyć pliku i zapisać do niego żadnych danych (to samo z odczytem), przykładowo ten "program" w (niewiem czy mogę tak nazwać) innym środowisku (użyłem Active-HDL), po przesymulowaniu i podaniu na wejście clk zegara tworzy plik "myfile.txt" i zapisuje do niego "1 0" tyle razy ile symulowanych jest cykli zegara.

Natomiast Quartus nie tworzy żadnego pliku i dane nie są zapisywane. Nie mogę zmusić go do wykonywania operacji na plikach, może mam jakieś złe ustawienia projektu, które należy zmienić (lecz do tej pory nie wiem co jest przyczyną) :(

PS. Masz rację, słowo opis sprzętu tutaj nie pasuje... :)

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

Postautor: bis » 30 sty 2007, o 20:10

Niestety nie mam doświadczenia z Quartusem. Ale jeżeli symulacja nie wywalała tobie żadnych ostrzeżeń to może zapisuje ale w jakimś innym katalogu, nadaj jakąś unikalną nazwę i po wykonaniu programu przeszukaj cały dysk. Albo podaj pełną nazwę np. "C:\temp\mytest.txt"

bis

gruzin
-
-
Posty: 10
Rejestracja: 28 sty 2007, o 16:53
Lokalizacja: Warszawa

Postautor: gruzin » 30 sty 2007, o 20:46

Próbowałem już i tego, niestety bez powodzenia. Symulacja wywaliła warningi:

Warning (10543): VHDL Variable Declaration warning at io93.vhd(23): used default initial value for variable "fNumber" because variable was never assigned a value or an initial value expression. Use of default initial value may introduce unintended design optimizations.-- w tym miejscu można powiedzieć, że nie ma błędu, zmienna powinna przyjąć wartość domyślną

Warning (10543): VHDL Variable Declaration warning at io93.vhd(24): used default initial value for variable "fSum" because variable was never assigned a value or an initial value expression. Use of default initial value may introduce unintended design optimizations.
--jak wyżej...

Warning: Design contains 1 input pin(s) that do not drive logic. <- tylko potwierdza, że "program" nic nie robi.

PS. próbowałem nawet nie używać żadnych zmiennych, wpisałem wartość do zapisu na stałe, tak tylko żeby zapisać jakiś tekst do pliku [WRITE(l,"101001");
WRITELINE(MyFile,l);] również bez efektów.

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

Postautor: bis » 30 sty 2007, o 20:56

Warning: Design contains 1 input pin(s) that do not drive logic. tylko potwierdza, że "program" nic nie robi.
Może cwaniaczek optymalizując zwinął ten proces do "nic"? Może wyłaczyc optymalizację, może dodac jakiś out z tego entity. Czy Quartus ma własy symulator czy używa zewnętrzny np. ModelSim albo inny?

bis

gruzin
-
-
Posty: 10
Rejestracja: 28 sty 2007, o 16:53
Lokalizacja: Warszawa

Postautor: gruzin » 30 sty 2007, o 21:23

Co do optymalizacji, może masz rację, niestety nie umiem jej wyłączyć, dodawałem też i out-y, niestety to również nic nie dało...
Co do pytania o symulator, quartus używa własnego.

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

Postautor: Piotr » 31 sty 2007, o 02:24

Niestety zaden z klasycznych syntezerow VHDL nie poradzi sobie z tym co opisales, bo to nie jest _zaden_ system logiczny. Probujesz wyzwolic zegarem zapis do pliku, co nijak sie nie da przelozyc na schemat logiczny, a jezyk VHDL
____jest jezykiem opisu sprzetu___
i nie sluzy do programowania!
Quartus skompliuje wszystko (i wylacznie) co da sie zaimplementowac za pomoca bramek logicznych. Polecenia typu WRITE nie sa syntezowane, wiec Quartus nie ma tu zupelnie nic do roboty!
Pzdr
PZb

gruzin
-
-
Posty: 10
Rejestracja: 28 sty 2007, o 16:53
Lokalizacja: Warszawa

Postautor: gruzin » 31 sty 2007, o 09:45

Wiem, że VHDL służy do opisu sprzętu, ale skoro w Active hdl wszystko działa, ktoś wymyślił bibliotekę TEXTIO, przy symulacji nie wywala błędów, ktoś napisał procedury write i read, to quartus też powinien sobie poradzić.
A może ktoś wie jak inaczej zrobić to w Quartusie?

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

Postautor: Piotr » 31 sty 2007, o 11:13

A-HDL jest de facto _wylacznie_ rozbudowanym symulatorem (a raczej zestawem narzedzi do symulacji, co-projektowania i dokmuentowania projektow), a Quartus narzedziem do syntezy logicznej. Ma wbudowany symulator, ale moze on symulowac skompilowane projekty, a zeby taki projekt skompilowac, trzeba stworzyc opis zrozumialy dla narzedzi _syzntezy_.
Symulowac zapis do pliku mozna, ale - jak wspomnialem - Quartus doszukuje sie w Twoim projekcie bramek logicznych, a jak - mam nadzieje - widzisz, w opisie ich nie ma.
Postaram Ci sie pomoc, ale napisz dokladnie co chcesz uzyskac, bo nie wiem ;-)
Pzdr
PZb

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

Postautor: bis » 31 sty 2007, o 11:31

Gruzin: nie napisałeś dokładnie co robisz. Program który napisałeś mozna wykonac jedynie w trakcie symulacji. Tak naprawdę to jest kawałek (ale niepełny) programu, napisanego w jezyku programowania VHDL do wykonania przez środowisko symulacyjne. Kompilator do syntezy w dowolnym środowisku rzeczywiście nie ma tu zastosowania bo ten kod nie jest do syntezy. Trochę dopisałem do twojego programu. Dodałem generator cykli co zapewne w ActivHDL robiłeś ręcznie. A dla pana moderatora Piotra dopisałem jeszcze jeden kawałek, tworzy on plik z tabelą pierwiastków (jak widać w standardowym języku programowania VHDL mozna je spokojnie wyliczać, choć do celów syntezy nie zawsze jest to użyteczne).

Kod: Zaznacz cały

LIBRARY ieee; USE ieee.std_logic_1164.ALL; USE ieee.numeric_std.ALL; USE ieee.MATH_REAL.ALL; use STD.TEXTIO.all; ENTITY testbench IS END testbench; ARCHITECTURE behavior OF testbench IS TYPE Reg IS RECORD Number : POSITIVE; Sum : NATURAL; END RECORD; FILE MyFile : TEXT OPEN WRITE_MODE IS "myfile.txt"; FILE SqrtFile : TEXT OPEN WRITE_MODE IS "sqrtfile.txt"; signal clk : std_logic; signal numerek : real := 0.0; BEGIN Clocker : PROCESS variable counter : natural := 0; BEGIN while counter < 100 loop wait for 10 ns; clk <= '0'; wait for 10 ns; clk <= '1'; counter := counter +1; numerek <= numerek + 1.0; end loop; wait; -- will wait forever END PROCESS Clocker; PROCESS(CLK) VARIABLE l : LINE; -- declare a line variable VARIABLE fNumber : POSITIVE; VARIABLE fSum : NATURAL; BEGIN IF CLK'EVENT AND CLK = '1' then WRITE(l,fNumber); -- Write an element to a line ... WRITE(l,' '); -- ... separate with a blank ... WRITE(l,fSum); -- ... another element to the same line ... WRITELINE(MyFile,l); -- ... and write the line to the file end if; END PROCESS; SqrtTable: PROCESS(numerek) VARIABLE l : LINE; -- declare a line variable BEGIN WRITE(l,string'("pierwiastek z ")); WRITE(l,numerek,field => 5, digits => 1); WRITE(l,string'(" to ")); WRITE(l,SQRT(numerek), digits => 5); WRITELINE(SqrtFile,l); END PROCESS SqrtTable; END;
Nie piszę tego aby wywoływać dyskusję o "aksjomatach". Dla mnie jest oczywiste że VHDL jest najczęsciej używany do opisu sprzętu i syntezy układów programowalnych. Ale wtedy używa się jedynie podzbioru możliwości języka. Mówienie że VHDL jest wyłącznie do opisu sprzętu może powodować mylne przekonanie że wszystko co się napisze w tym języku musi zadziałać na np. w FPGA.

bis

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

Postautor: ziggy » 31 sty 2007, o 12:24

To prawda, że VHDLa w pewnych okolicznościach można używać tak jak języka programowania ogólnego przeznaczenia, jednak nie jest to jego zasadniczym przeznaczeniem. Gdybyśmy sięgnęli do genezy powstania VHDL to na początku służył on do celów dokumentacji dużych systemów cyfrowych, następnie wykorzystano go do symulacji tych systemów a później również do ich syntezy (rzeczywiście do syntezy wykorzystywany jest pewien niewielki podzbiór instrukcji VHDL).
Z kolei mówienie o tym, że VHDL jest językiem programowania może wywołać mylne wrażenie, że służy on tylko do programowania. Tymczasem języki programowania nie umożliwiają opisywania funkcji, struktury oraz parametrów projektowanego sprzętu, co w VHDL jest jednym z zasadniczych celów. Stosowanie pojęcia "język programowania" w odniesieniu do VHDL jest więc jakby zawężaniem jego możliwości i nie oddaje w pełni istoty języka. Skoro sam powiadasz, że VHDL używany jest najczęściej do opisu sprzętu, to czyż chociażby ze względu na częstość tego typu zastosowań nie byłoby znacznie bardziej uzasadnione używanie pojęcia "język opisu sprzętu"?? :610:

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

Postautor: bis » 31 sty 2007, o 13:06

Skoro sam powiadasz, że VHDL używany jest najczęściej do opisu sprzętu, to czyż chociażby ze względu na częstość tego typu zastosowań nie byłoby znacznie bardziej uzasadnione używanie pojęcia "język opisu sprzętu"??
W normalnej pracy projektowej (np. jakaś konstrukcja z FPGA) definiuje sie, za pomocą jezyka VHDL opis jego działania w celu syntezy i wtedy używamy VHDL do opisu sprzętu. Ale zaraz potem (a w zasadzie równolegle do tej pracy) przygotowuje się oprogramowanie, dla wirtualnego urządzenia jakim jest symulator. To oprogramowanie jest opisem algorytmu/sposobu w jaki ten symulator ma zadziałać. Ten algorym piszę w jezyku programowania dla tego wirtualnego urządzenia (symulatora) jakim jest VHDL. W tym oprogramowaniu używam nieporównanie wiecej konstrukcji języka VHDL, a wiele z nich jest wręcz nie do zastosowania w części projektu która jest jedynie opisem sprzętu. Obie te prace wykonuje się równolegle w trakcie trwania projektu. Skoro "opis sprzętu" używa jedynie podzbioru możliwości języka to jak można zawężać jego opis wyłącznie do tego. Jak tłumaczysz że w "opisie sprzętu do syntezy" nie bardzo można użyć "wait until..for.." albo "after".

bis

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

Postautor: ziggy » 31 sty 2007, o 14:57

Owszem, ale zwróćmy uwagę do czego została w zamyśle projektantów stworzona pozostała, niesyntezowalna część języka. Czy do tego, aby realizować typowe algorytmy programowania typu chociażby sortowanie bąbelkowe, czy też po to by opisywać zachowanie otoczenia symulowanego sprzętu?? Skoro zgadzamy się, że raczej do drugiego z wymienionych celów, oznacza to, że cały czas w centrum naszej uwagi jest sprzęt, nie zaś programowanie. Dlatego też całkowicie uzasadnione wydaje mi się pojęcie VHDL jako języka opisu sprzętu. Jednak nie wyklucza to, że w pewnych przypadkach VHDL używamy w sposób bardziej przypominający programowanie niż literalnie traktowane opisywanie sprzętu.

gruzin
-
-
Posty: 10
Rejestracja: 28 sty 2007, o 16:53
Lokalizacja: Warszawa

Postautor: gruzin » 31 sty 2007, o 20:12

Bis: Mój problem polega na tym, zaimplementowałem zachowanie sprzętu, na wyjściu układu pojawiają się wartości i te wartości chciałbym "zrzucić" do pliku w celu dalszej obróbki, a następnie wczytać je na wejście drugiego układu... Mówisz, że jest to kawałek programu do wykonania przez środowisko symulacyjne, po wykonaniu symulacji niestety plik nie zostaje utworzony (i to jest mój główny problem).

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

Postautor: bis » 31 sty 2007, o 20:44

Szkoda że nie odezwał się żaden użytkownik Quartusa. Jak rozumiem masz jakiś projekt w VHDL i można go potraktować jako "czarną skrzynkę" która chcesz stymulować na wejściach i zapisać stany wyjsć do pliku. Pogrzebałem w necie. Na mój gust to ten symulator nie pozwala na przygotowanie symulacji w VHDL. symuluje wyłącznie netlisty po syntezie układu a tam już nie ma takich bajerów jak "writeln" i reszta. Masz tylko inne, gotowe formaty zapisu zmiennosci sygnałów.
http://www.altera.com/literature/hb/qts ... i53017.pdf
Ale na szczęście są inne możliwości. Jeżeli dobrze zrozumiałem to nawet do WebEdition Quartusa jest możliwość pobrania i stosowania okrojonego symulatora ModelSim, a ten to już inna bajka, normalnie w VHDL przygotujesz sobie wszystko zarówno dla modelu funkcjonalnego jak i post-synthesis a nawet gate-level timing. poczytaj to:
http://www.altera.com/literature/hb/qts ... i53001.pdf

bis

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

Postautor: Piotr » 31 sty 2007, o 22:53

Z satysfakcja stwierdzam, ze moje wyjasnienie, ze Quartus jest narzedziem do syntezy logicznej i symulacji uzyskanych wynikow (czyli sprzetu) i nie potrafi symulowac "ukladu", ktory sklada sie wylacznie z polecenia zapisu tekstu do pliku, zostal potwierdzony przez bisa. Tylko po co szukac w necie, kiedy wystarczy zrozumiec post?
Tak czy inaczej: powodzenia w dalszym pisaniu programow dla PLD!
Propozycja z poprzedniego watku otwarta!
;-)
Pzdr
PZb

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

Postautor: Piotr » 31 sty 2007, o 23:23

gruzin: z symulacja opisana w VHDL Quartus II sam sobie nie radzi. Zapewne swoj plik VHDL "wkladasz" do projektu quartusowego i probujesz skompilowac (za pomoca fioletowego trojkacika lub Processing>Start Compilation). Jesli korzystales z kreatora projektu, to zapewne zauwazyles, ze Quartus zacheca do korzystania z zewnetrznych symulatorow (w Helpie jest szczegolowo wyjasnione dlaczego).
Quartus - jako narzedzie do syntezy logicznej - nic z Twoim opisem zrobic nie potrafi, bo szuka w nim bramek! Z kolei symulator Quartusa jest niemal zywcem wziety z MAX+Plus II co oznacza, ze symuluje zachowanie list polaczen zsyntezowanych ukladow (skladajacych sie z bramek, ktorych w Twoim opisie nie ma).
Jezeli chcesz przeprowadzic symulacje projektu zaimplementowanego w Quartusie, to musisz go zsyntezowac (j.w.) i skorzystac z ModelSima (dostepny w wersji okrojonej bezplatnie na stronie Altery) lub czegokolwiek innego zgodnego z VHDL93. Jezeli nie zalezy Ci na ewaluacji czasow propagacji, takich narzedzi mozna znalezc w Internecie co najmniej kilka.
Pzdr
PZb

gruzin
-
-
Posty: 10
Rejestracja: 28 sty 2007, o 16:53
Lokalizacja: Warszawa

Postautor: gruzin » 1 lut 2007, o 11:49

Wielkie dzięki za wszystkie porady. W przypadku dalszych problemów dam znać. Pozdrawiam.

gruzin
-
-
Posty: 10
Rejestracja: 28 sty 2007, o 16:53
Lokalizacja: Warszawa

Postautor: gruzin » 5 lut 2007, o 21:37

Mówcie model sim, jednak niewiem jak go użyć, gdyż projekt w quartusie składa się z 5 plików *.vhd, do każdego stworzyłem symbol i wszystkie symbole połączone są ze sobą na schemacie blokowym *.bdf, symulacja zapisana jest w formacie *.vwf
Czy naprawdę nikt nie zna opcji, żeby zapisać dane z wyjścia do pliku i podać je na wejście innego układu w quartusie, nie używając do tego innych narzędzi? :609:

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 26 gości