Skocz do zawartości

Problem ze zrozumieniem kodu do FIFO z fpga4student.com


Pomocna odpowiedź

Napisano

Cześć,

Wiem na czym polega koncepcja FIFO, ale tak patrząc na kod ciężko mi połączyć wszystko w spójną całość, tak żeby sensownie przeanalizować symulację. Nie można też pobrać kodu ze strony, więc robiłam kopiuj wklej(+jakieś moje uwagi), który dodam jako załącznik. Dzięki za pomoc

FIFO_memory.rar

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.

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

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

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)

(edytowany)
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

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