Skocz do zawartości

Problem ze zrozumieniem kodu do FIFO z fpga4student.com


monsiw

Pomocna odpowiedź

Najprościej mówiąc - FIFO to tymczasowy magazyn (w formie kolejki). Powiedzmy, że jesteś osobą, która podpisuje dokumenty i co chwila je dostajesz. W związku z tym masz "stos" z dokumentami, gdzie zawsze bierzesz ten, który jest najstarszy (który najwcześniej dostałeś) i go podpisujesz. Podobnie działa FIFO - przechowuje dane dopóki ktoś (a raczej coś) się o nie nie upomni. Wtedy zwraca najwcześniej otrzymany pakiet - jest to taki tymczasowy bufor na wypadek, gdyby np. mikrokontroler liczył jakieś skomplikowane równanie matematyczne i nie mógł odebrać danych.

FIFO obecnie są alternatywą dla przerwań (trochę to nad wyrost) - przechowujesz dane w buforze i przerwanie wykonujesz np. co 4B (Raspberry Pi Pico) zamiast co 1B. W ten sposób ograniczasz ilość przerwań trafiających do mikrokontrolera, a zarazem zwiększasz ilość danych, które dostaje na raz do przetworzenia.

Prościej raczej nie umiem.

Link do komentarza
Share on other sites

5 minut temu, H1M4W4R1 napisał:

Najprościej mówiąc - FIFO to tymczasowy magazyn (w formie kolejki). Powiedzmy, że jesteś osobą, która podpisuje dokumenty i co chwila je dostajesz. W związku z tym masz "stos" z dokumentami, gdzie zawsze bierzesz ten, który jest najstarszy (który najwcześniej dostałeś) i go podpisujesz. Podobnie działa FIFO - przechowuje dane dopóki ktoś (a raczej coś) się o nie nie upomni. Wtedy zwraca najwcześniej otrzymany pakiet - jest to taki tymczasowy bufor na wypadek, gdyby np. mikrokontroler liczył jakieś skomplikowane równanie matematyczne i nie mógł odebrać danych.

FIFO obecnie są alternatywą dla przerwań (trochę to nad wyrost) - przechowujesz dane w buforze i przerwanie wykonujesz np. co 4B (Raspberry Pi Pico) zamiast co 1B. W ten sposób ograniczasz ilość przerwań trafiających do mikrokontrolera, a zarazem zwiększasz ilość danych, które dostaje na raz do przetworzenia.

Prościej raczej nie umiem.

O co chodzi z fifo to wiem, bardziej chodziło o kod w VHDL. Tam jest wiele mapowań przez co można się pogubić - kod załączyłam w poście głównym

Link do komentarza
Share on other sites

8 minut temu, monsiw napisał:

bardziej chodziło o kod w VHD

Masz konkretne pliki:

  • main.vhd - tutaj jest definicja FIFO jako modułu, który możesz wykorzystywać. Ten projekt jest akurat przykładem stworzenia FIFO na FPGA, dlatego plik został nazwany main. W innym przypadku zostałby nazwany fifo.vhd
  • memory_array - tutaj jest definicja bloku pamięci oraz jego zachowania względem sygnałów - coś jak tablica w C
  • read_pointer - to zachowanie wskaźnika odczytu - odczytuje on dane i przesuwa się na następne miejsce - coś jak wskaźnik w C
  • write_pointer - ... wskaźnika zapisu ... (tak samo wskaźnik)
  • signal - zachowanie sygnałów (overflow, empty etc.)
  • test - program służący do testowania tego projektu

Patrząc na kod można zauważyć, że FIFO jest modułem, który nie potrzebuje przetwarzania, ponieważ przetwarzaniem zajmują się wskaźniki oraz moduł pamięci. Moduł FIFO jest wyłącznie stosowany jako reprezentacja zależności połączeń między pamięcią, a wskaźnikami.

Wskaźniki poruszają się po tablicy w momencie wystąpienia sygnału zegarowego i zapisują / odczytują konkretne miejsce w pamięci (memory_array). Reszta zgodnie z wcześniejszym wpisem o dokumentach 😄 

Osobiście wolę Veriloga, bo jest bardziej intuicyjny. Zaraz tutaj FlyingDutch się odezwie... W każdym razie to powinno trochę pomóc... (taką mam nadzieję)

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

16 minut temu, H1M4W4R1 napisał:

Masz konkretne pliki:

  • main.vhd - tutaj jest definicja FIFO jako modułu, który możesz wykorzystywać. Ten projekt jest akurat przykładem stworzenia FIFO na FPGA, dlatego plik został nazwany main. W innym przypadku zostałby nazwany fifo.vhd
  • memory_array - tutaj jest definicja bloku pamięci oraz jego zachowania względem sygnałów - coś jak tablica w C
  • read_pointer - to zachowanie wskaźnika odczytu - odczytuje on dane i przesuwa się na następne miejsce - coś jak wskaźnik w C
  • write_pointer - ... wskaźnika zapisu ... (tak samo wskaźnik)
  • signal - zachowanie sygnałów (overflow, empty etc.)
  • test - program służący do testowania tego projektu

Patrząc na kod można zauważyć, że FIFO jest modułem, który nie potrzebuje przetwarzania, ponieważ przetwarzaniem zajmują się wskaźniki oraz moduł pamięci. Moduł FIFO jest wyłącznie stosowany jako reprezentacja zależności połączeń między pamięcią, a wskaźnikami.

Wskaźniki poruszają się po tablicy w momencie wystąpienia sygnału zegarowego i zapisują / odczytują konkretne miejsce w pamięci (memory_array). Reszta zgodnie z wcześniejszym wpisem o dokumentach 😄 

Osobiście wolę Veriloga, bo jest bardziej intuicyjny. Zaraz tutaj FlyingDutch się odezwie... W każdym razie to powinno trochę pomóc... (taką mam nadzieję)

Ok, czyli testy powinny być robione osobno do memory_array,read_pointer,write_pointer i signal? (Ten co jest w pliku do main jest zrobiony przeze mnie)

when (pointer_result(4) or pointer_result(3))='1' else '0'; -> jak rozumieć tę komendę? (plik signal.vhd)

 we <= (not fifo_full) and wr; -> czy to jest wpisanie do wejścia zanegowanego wyniku z logicznego AND fifo_full i wr (write pointer?) ? (plik write_pointer)

Link do komentarza
Share on other sites

7 minut temu, monsiw napisał:

when (pointer_result(4) or pointer_result(3))='1' else '0';

jeżeli różnica wskaźników jest większa niż połowa zakresu to przekraczasz treshold 😉 

if(pointer_result[4] == 1 || pointer_result[3] == 1)
  fifo_treshold = 1;
else
  fifo_treshold = 0;

 

7 minut temu, monsiw napisał:

 we <= (not fifo_full) and wr;

if(!fifo_full)
	if(wr)
  		wr = true;
	else we = false;
else we = false;

A testy zazwyczaj się robi tylko do głównego modułu.

Edytowano przez H1M4W4R1
  • Lubię! 1
Link do komentarza
Share on other sites

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

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.