kategoria: Sprzęt
[#1] Clockport, timingi oraz VHDL
Próbuję (z miernym skutkiem) zaimplementować obsługę clockportu w VHDLu.

Przeczytałem opis działania clockportu chyba ze 100 razy. Jeśli dobrze rozumiem, to linie IORD oraz IOWR są aktywne stanem niskim (logiczne 0). Jeśli linia IORD jest aktywna to urządzenie powinno ustawiać odpowiednie bity na szynie danych do odczytu przez CPU. Jeśli linia IOWR jest aktywana, to CPU ustawia odp. bity na szynie danych do zapisu do urządzenia. Zaimplementowałem taki kod w VHDLu:

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

entity clockport is
    Port(	-- clockport signals
			data :		inout STD_LOGIC_VECTOR (7 downto 0); -- data pins
			addressIn :	in STD_LOGIC_VECTOR (3 downto 0); -- address pins
			iord :		in STD_LOGIC; -- active low when read from device to CPU
			iowr :		in STD_LOGIC; -- active low when write from CPU to device
			--cs :		in STD_LOGIC;
			-- debug signals
			addressOut : out STD_LOGIC_VECTOR (3 downto 0);
			-- registers used to exchange data
			--btnReg :	in STD_LOGIC_VECTOR (3 downto 0)
			testOut : 	out STD_LOGIC_VECTOR (7 downto 0)
			);
end clockport;

architecture Behavioral of clockport is

	signal address : STD_LOGIC_VECTOR (3 downto 0);

begin
	address <= addressIn when iord = '0' or iowr = '0';
	addressOut <= address;

	process (iowr)
	begin
		if iowr = '0' then
			testOut <= data;
		end if;
	end process;
	process (iord)
	begin
		if iord = '0' then
			data <= "00000001";
		end if;
	end process;

end Behavioral;


(BTW. tag code jest dość bezużyteczny jak widać wyżej - zjada wcięcia zrobione tabami)

Niestety nie działa on zgodnie z oczekiwaniami. Proces iowr nie zapisuje niczego do urządzenia, a iord powoduje "zawieszenie" Amigi. Natomiast, jeśli zrobię coś takiego, potencjalnie bezsensownego:

process (iord)
	begin
		if rising_edge(iord) then
			testOut <= data;
		end if;
	end process;


To okazuje się, że zapis do urządzenia działa z powodzeniem (mogę wyświetlić bajt zapisany do clockportu na wyświetlaczu 7-segmentowym)! Wybaczcie wyjątkową lamerskość tego kodu, ale to mój pierwszy projekt w VHDL .

Kod całego projektu tutaj.
[#2] Re: Clockport, timingi oraz VHDL

@strim, post #1

Problem częściowo rozwiązany... miałem zamienione piny iord i iowr, więc nie miało prawa to działać. Poza tym gdy iord nie jest aktywne, piny danych powinny być nieaktywne... Więc obecnie odczyt wygląda tak:
data <= "00000001" when (iord = '0') AND address = "1111" else
			   "ZZZZZZZZ";

A zapis:
process (iowr)
	begin
		if iowr = '0' then
			testOut <= data;
		end if;
	end process;


Niemniej, odczyt nie działa całkiem dobrze. Raz na kilka odczytów dostaje jakąś inną, losową wartość, zamiast 00000001 .

Ostatnia aktualizacja: 09.01.2013 18:56:19 przez strim
[#3] Re: Clockport, timingi oraz VHDL

@strim, post #2

Problelem był brak obsługi sygnału CS, a w konsekwencji konflikt z RTC ;). Teraz śmiga jak należy. Zacommitowałem działający kod do podlinkowanego wcześniej repo.

Ostatnia aktualizacja: 09.01.2013 19:10:18 przez strim
[#4] Re: Clockport, timingi oraz VHDL

@strim, post #1

Robisz wyświetlacz segmentowy pod clockport do wyświetlania godziny? :) Ja wolę jakoś Veriloga i VHDL'a nwet nie liznąłem, chociaż w większości przypadków można wyczytać z kontekstu o co chodzi.

Widzę, że udało ci się dojść do obsługi CS, IOR, IOW bez pomocy forumowiczów, ale pewnie panika była.

Wybaczcie wyjątkową lamerskość tego kodu, ale to mój pierwszy projekt w VHDL

Myślę, że hello world jest chyba 100 razy bardziej lamerskie.
[#5] Re: Clockport, timingi oraz VHDL

@rafgc, post #4

Haha, nie to służy póki co tylko do debugu czy dane prawidłowo są zapisywane do rejestrów CPLD. Docelowo chce mieć transmisję danych Amiga-PC via USB.

Filmik .
[#6] Re: Clockport, timingi oraz VHDL

@strim, post #5

Ok, jednak odczyt dalej nie działa idealnie. Rzadko (powiedzmy, raz na 25-30 odczytów) zdaża się, że odczytana wartość nie jest prawidłowa. Obecnie wystawiam dane na szynę danych tylko jeśli aktywny jest sygnał IORD oraz CS i wybrany jest odpowiedni adres. Załóżmy, że z CPLD chcę odczytać wartość "1"... zwykle się to powodzi, ale raz na te 25-30 odczytów zamiast "1" odczytuje "3". Jakieś pomysły co to może być?

W instrukcji SUBWAYa, przedstawiono timingi dla clockportu. Jeśli spojrzeć na wykres operacji odczytu, to jest on trochę dziwny... Może ma to jakiś związek.

Ostatnia aktualizacja: 09.01.2013 20:25:26 przez strim
[#7] Re: Clockport, timingi oraz VHDL

@strim, post #6

Nie jestem specjalnie biegły w VHDL, timing wygląda poprawnie, bo podczas odczytu dane pojawią się zawsze po jakimś czasie, z PLD pojawiają sie bardzo szybko, ale to nie powinno na nic wpływać.

Spróbuj skompilować sobie ten kod z veriloga (tylko jeden rejestr, adres ignorowany) i sprawdź czy działa.

module clockport (
					d0, d1, d2, d3, d4, d5, d6, d7, cs, ior, iow
					);
			
inout d0, d1, d2, d3, d4, d5, d6, d7;
input cs, ior, iow;

wire write_event, read_event;		
reg [7:0] register;


assign write_event = !(cs | iow);
assign read_event = !(cs | ior);

assign {d7, d6, d5, d4, d3, d2, d1, d0} = read_event?register:8'bZ;

always@(posedge write_event)
	begin
	register <= {d7, d6, d5, d4, d3, d2, d1, d0};
	end
	
endmodule
[#8] Re: Clockport, timingi oraz VHDL

@rafgc, post #7

Ok, ja co prawda nie wiem nic na temat Veriloga, ale tak na pierwszy rzut oka to wygląda że robi to m/w to samo co mój moduł clockport w VHDLu. Postaram się to jakoś skompliować i sprawdzić :).

Teraz zastanawiam się, czy takie czynniki jak np. długość kabelków nie mają wpływu? Moje jednak są dość długie (co widać nawet na zdjęciu w graffiti).
[#9] Re: Clockport, timingi oraz VHDL

@strim, post #8

Eh, OK, wydaje mi się, że winę za ten stan rzeczy ponosi okablowanie. Problemy nasilają się lub znikają zależnie od tego pod jakim kątem jest wtyczka (używam jeszcze tej co kiedyś mi wysłałeś ).
[#10] Re: Clockport, timingi oraz VHDL

@strim, post #9

No rzeczywiście są trochę długie, czasami są problemem słabe styki, np masa. Sam mi kiedyś pisałeś, że chyba 30cm to max dla kabla od clockportu wg jakiejś instrukcji. Może masz gdzieś w pobliżu jakieś źródło zakłóceń i kable działają jak antena?

Jak chcesz używać VHDL i bawić się w PLD, to będziesz musiał odrzucić pewien schemat przyzwyczajeń od programowania, np porównywanie działania PLD/FPGA do procesora. Pierwszy raz jak się zetknąłem z verilogiem, to za cholerę nie rozumiałem jak w ogóle działa ta ruska pamięć do A600 i błędnie interpretowałem kod jako "listę poleceń". Jedyne działania, które pracują w sekwencjach to zdarzenia wyzwalane jakimś zboczem, np FSM, natomiast kolejność równań w obrębie danego procesu w ogóle nie mają znaczenia - to właśnie wydawało się właśnie jakieś kosmiczne przy próbie zrozumienia pierwszego kodu.

Verilog mi pasuje bardziej, może dlatego, że przypomina jakiś język programowania jak np C i z tego powodu jakiś bardziej czytelny mi się wydaje, bo VHDL to taki bardziej mechaniczny.

Aha, skonfiguruj parametr slew jako slow (Implement design >> FIT >> (prawy) process properties), PLD wtedy generuje bardziej łagodne przejścia sygnałów, przez co układ generuje mniejsze zakłócenia (być może zniknie problem, przy dłuższych kablach).


Ostatnia aktualizacja: 09.01.2013 23:08:37 przez rafgc
[#11] Re: Clockport, timingi oraz VHDL

@rafgc, post #10

Wyłączyłem kompa stacjonarnego pod biurkiem... problem zniknął . Co raczej dowodzi problemu w okablowaniu.

Tylko ciężko w ten sposób developować. Na laptopie mam tylko MacOSa, a na niego środowisko Xilinx nie jest dostępne wcale. Więc korzystam z kompa stacjonarnego z Linuxem... który jak widać powoduje jakieś mega zakłócenia. Muszę przemyśleć jak to rozwiązać wszystko.

Jeśli chodzi o samego VHDLa to nie stanowi on dla mnie aż tak dużego problemu, jak myślałem na początku że będzie stanowił :P. Co prawda mam jeszcze kłopoty z operacjami sekwencyjnymi, ale jak widzisz proste rzeczy już daje radę zrobić.

Ostatnia aktualizacja: 10.01.2013 00:02:41 przez strim
[#12] Re: Clockport, timingi oraz VHDL

@strim, post #11

Pierwszy mały sukces w komunikacji Amiga-PC via USB. Sorry za fatalną jakość nagrania.
[#13] Re: Clockport, timingi oraz VHDL

@strim, post #12

Widze, ze cos z tego bedzie:)
[#14] Re: Clockport, timingi oraz VHDL

@strim, post #11

Możesz spróbować owinąć wiązkę folią aluminiową i podłączyć ja do masy.
[#15] Re: Clockport, timingi oraz VHDL

@strim, post #12

Mam też działające już przesyłanie pojedyńczych bajtów w drugą stronę. Teraz jeszcze jakiś rejestr do synchronizacji i będzie można przesyłać całe pliki cool .

Swoją drogą, ten projekt wykazuje, że dla chcącego nic trudnego - jeszcze w grudniu nie znałem VHDLa, a płytkę z CoolRunnerem dostałem na gwiazdkę. Koszt całego przedsięwzięcia też nie jakiś dramatyczny:
- CoolRunner II starter board - 136PLN
- 2x KAmodLVC - 87PLN
- Breadboard - 15PLN
- Kabelki, i inne takie pierdoły - ~30PLN
Łacznie ok. 268PLN.

@rafgc folia pomogła OK

Ostatnia aktualizacja: 10.01.2013 22:33:43 przez strim
[#16] Re: Clockport, timingi oraz VHDL

@strim, post #15



A tak poważnie, to planujesz zrobić produkt dla ludzi na sprzedaż? Domyślam się, że póki co robisz to dla siebie i dla nauki, ale jeśli wyjdzie coś fajnego to może warto zbadać rynek.

Ale przede wszystkim gratuluję kawałka dobrej roboty, najfajniejsze są te momenty kiedy kilka cyfr w konsoli wywołują większą radość niż ukończenie najlepszej gry. ;) Powodzenia!
[#17] Re: Clockport, timingi oraz VHDL

@Nathanel, post #16

Obecnie nie przewiduję komercjalizacji tego projektu. Kod jest dostępny, więc każdy będzie mógł coś takiego sam zbudować. Później narysuje jakiś schemat ale nie będzie on zbyt skomplikowany - to są głównie połączenia 1:1 między płytką CPLD a clockportem (poprzez konwerter poziomów) :).

Jeśli obecny projekt wypali, to może wówczas zabiorę się za konstruowanie czegoś bardziej skomplikowanego jak kontroler USB i czy ethernetu. Taki projekt być może miałby komercyjny sens.


Ostatnia aktualizacja: 10.01.2013 23:20:27 przez strim
[#18] Re: Clockport, timingi oraz VHDL

@strim, post #17

kontrolry usb i eternetu juz sa..
ale co powiesz o tym:
http://www.amiga.org/forums/showthread.php?p=722060#post722060

...?

Ostatnia aktualizacja: 11.01.2013 04:26:06 przez wawrzon
[#19] Re: Clockport, timingi oraz VHDL

@wawrzon, post #18

kontrolry usb i eternetu juz sa..


Tylko kupić ich coś nie można.

http://www.amiga.org/forums/showthread.php?p=722060#post722060

Po pierwsze coś takiego jest daleko poza moimi zdolnościami jak na tą chwilę. Nie ma co się rzucać z motyką na słońce. Nawet Michael Boehmer, zanim zrobił pierwszy kontroler USB dla Amigi zbudował kontroler I2C - od czegoś trzeba zacząć.

Po drugie, widziałem ten wątek, typowe smuty, obiecanki cacanki i snucie bajek, zero konkretów. Jak ktoś pokaże działającą implementację (choćby tak dobrze działającą jak ten nowy akcelerator do A600 autorstwa majsta) to się podjaram może.


Ostatnia aktualizacja: 11.01.2013 04:56:14 przez strim
[#20] Re: Clockport, timingi oraz VHDL

@strim, post #19

Nieco dokładniejsze zdjęcie tego całego setupu.
[#21] Re: Clockport, timingi oraz VHDL

@strim, post #20

Co musiałoby być jeszcze zaimplementowane w tym PLD, aby można było podpiąć pod to jakiś stos USB?
[#22] Re: Clockport, timingi oraz VHDL

@strim, post #11

Nie podałeś jaką wersję masz MACos na tym lapku. Jeżeli jakiś nowszy to stawiasz virtualbox-a z XP i jazda :)
[#23] Re: Clockport, timingi oraz VHDL

@rafgc, post #21

Co musiałoby być jeszcze zaimplementowane w tym PLD, aby można było podpiąć pod to jakiś stos USB?


Kontroler USB ;) Ale to nie wlezie do takiego maluszka...
[#24] Re: Clockport, timingi oraz VHDL

@pekdar, post #22

Co musiałoby być jeszcze zaimplementowane w tym PLD, aby można było podpiąć pod to jakiś stos USB?


Co napisał Konrad...

Kontroler USB Ale to nie wlezie do takiego maluszka...


Otóż to, obecnie cała obsługa USB (jako urządzenia) opiera się na firmware który znajduje się w mikrokontrolerze na tej płytce. Ja zaimplementowałem komunikację z tym mikrokontrolerem, obsługę peryferiów płytki (wyświetlacza, LEDów, przycisków) i to zajęło już prawie połowę tego CPLD. A to (XC2C256) jest największy CPLD rodziny CoolRunner II, który dostępny jest w sensownej cenie. Większe są trudno osiągalne.

Xilinx ma nawet jakieś IP core kontrolera USB, z tego co wiem dostępne nawet w WebPacku, ale dostępny jest tylko dla FPGA, i to tych większych. Chciałbym nabyć jakąś płytkę z FPGA np. coś takiego, ale ich ceny... . A mam jeszcze sporo innych wydatków.

W każdym razie teraz chciałbym dokończyć ten prosty projekt, udokumentować i udostępnić światu. Może spowoduje to nowy boom rozszerzeń na clockport .

jeżeli jakiś nowszy to stawiasz virtualbox-a z XP i jazda


Prędzej już Linuxa bym w tej maszynie wirtualnej postawił :P.
[#25] Re: Clockport, timingi oraz VHDL

@strim, post #24

Wywalisz niepotrzebne rzeczy to ilość makroceli spadnie, bo chyba połowa tego kodu to obsługa tych segmentów. dużo zasobów zajmują np operacje jak dzielenie i mnożenie. Co tak naprawdę robi ten CPLD, bo skoro obsługa USB jest w mikrokontrolerze, to chyba po stronie cpld nie powinien być jakiś prosty interfejs?

Co CPLD to inna historia, zdaje mi się, że chyba gdzieś widziałem wypowiedź chyba Jensa w jakimś temacie o C64, że coolrunner ma makrocele z 4-bitowymi wejściami i użycie jakichkowiek rejestrów większych niż 4 bity automatycznie konsumuje dodatkowe makrocele.

edit:

Nic dziwnego, że kod zajmuje tyle makroceli, 32-bitowy liczniki i dwa 32-bitowe komparatory, zajmują około 96 makroceli, czy naprawdę potrzebne są aż tak wielkie liczniki?

Ostatnia aktualizacja: 12.01.2013 00:16:55 przez rafgc
[#26] Re: Clockport, timingi oraz VHDL

@rafgc, post #25

Co tak naprawdę robi ten CPLD, bo skoro obsługa USB jest w mikrokontrolerze, to chyba po stronie cpld nie powinien być jakiś prosty interfejs?


Pewnie, gdyby pozostawić sam interfejs clockport - mikrokontroler to z pewnością ilość użytych makrokomórek byłaby mniejsza. Ten interfejs sam w sobie jest dość prosty. Od strony mikrokontrolera wygląda tak, ale moja implementacja jest znacznie prostsza (nie jest maszyną stanową i nie używa zegara). Od strony clockportu to wiesz jak to wygląda i raczej prościej się (raczej) nie da.

Nie wiem czy chcę wywalać obsługę tzw. "zbędnych rzeczy", takich jak peryferia płytki, gdyż ten projekt ma mieć możliwie wysoką wartość edukacyjną. A taką wg. mnie ma choćby pokazanie jak to w wyniku naciśnięcia przycisku otrzymujemy pod konkretnym rejestrem clockportu taką czy inną wartość. Albo jak to na wyświetlaczu pojawia się bajt po wpisaniu go pod konkretny adres w pamięci. Te rzeczy też zajmują trochę makrokomórek.

Nic dziwnego, że kod zajmuje tyle makroceli, 32-bitowy liczniki i dwa 32-bitowe komparatory, zajmują około 96 makroceli, czy naprawdę potrzebne są aż tak wielkie liczniki?


Nigdy nie twierdziłem, że ten kod jest optymalny - zamierzam się tym zająć :D

32-bitowy licznik i komparatory są obecnie wykorzystywane chyba tylko przez dzielnik zegara. Na płytce zamontowany jest kwarc 8MHz, a to za dużo do obsługi wyświetlacza.


Ostatnia aktualizacja: 12.01.2013 01:07:52 przez strim
[#27] Re: Clockport, timingi oraz VHDL

@strim, post #15

to taki coolboard ? http://kamami.pl/index.php?ukey=product&productID=188195 .
[#28] Re: Clockport, timingi oraz VHDL

@strim, post #26

32-bitowy licznik i komparatory są obecnie wykorzystywane chyba tylko przez dzielnik zegara. Na płytce zamontowany jest kwarc 8MHz, a to za dużo do obsługi wyświetlacza.

Nie jestem pewien, ale chyba jednak da się ciut prościej prescaler/freq divider zrobić niż przez 32 bitowe liczniki :)
[#29] Re: Clockport, timingi oraz VHDL

@abcdef, post #28

to taki coolboard ? http://kamami.pl/index.php?ukey=product&productID=188195


Tak.

Nie jestem pewien, ale chyba jednak da się ciut prościej prescaler/freq divider zrobić niż przez 32 bitowe liczniki


Myślę, że się da - jeszcze nie próbowałem. Chętnie przyjmę sugestie jak zrobić to inaczej niż obecnie, zamiast takich złotych myśli :P.

Ostatnia aktualizacja: 12.01.2013 10:25:12 przez strim
[#30] Re: Clockport, timingi oraz VHDL

@strim, post #29

No tak to mniej wiecej można zrealizować, ale czy potrzebujesz kontroli między ok 0.002Hz a 4MHz? Bo takie zegary daje Ci użycie 32 bit przy 16 bit jest ok 125Hz-4MHz, a przy 8 bitach ~32kHz-4MHz. Użycie integer właśnie wymusza niejako 32 bit, może spróbuj z mniejszymi typami
http://www.synthworks.com/papers/vhdl_math_tricks_mapld_2003.pdf
Na stronie www.PPA.pl, podobnie jak na wielu innych stronach internetowych, wykorzystywane są tzw. cookies (ciasteczka). Służą ona m.in. do tego, aby zalogować się na swoje konto, czy brać udział w ankietach. Ze względu na nowe regulacje prawne jesteśmy zobowiązani do poinformowania Cię o tym w wyraźniejszy niż dotychczas sposób. Dalsze korzystanie z naszej strony bez zmiany ustawień przeglądarki internetowej będzie oznaczać, że zgadzasz się na ich wykorzystywanie.
OK, rozumiem