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, WebPack, inicjowanie BRAM

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

Postautor: bis » 26 paź 2005, o 21:15

Mam taki problem. programując Spartana3 usiłuję "zgrabnie" zainicjować zawartosć BRAM. W przypływie radosnego natchnienia wystrugałem taka funkcję. Jej zadaniem jest zamiana łańcucha znaków ASCII na inicjator 256 bitów BRAM oznaczany jako INIT_xx (xx = 00 ..3F). wszystko działa doskonale, ale... Ale taki sposób jest przerażliwie powolny. Próbowalem znaleźć w bibliotekach jakieś funkcje przyspieszające zamiane Char na bit_vector ale nie natrafiłem. Mam poczucie że zboczyłem na jakieś manowce (nie mam zbyt dużego doświadczenia w VHDL). Może ktoś juz walczył z czymś takim i ma jakis pomysł jak to zrobić poprawnie.

tak wygląda moja funkcja:

----------------------------------------------------------------------------------------------------------
function ASCII_STRING_to_INIT_XX (text : string) return bit_vector is
variable result : BIT_VECTOR (255 downto 0):= (others=>'0');
variable i : integer := 0;
begin
assert text'length < 32 report "Text into INIT_XX excedes 32 characters";
while i < text'length loop
result := result((255 - 8 ) downto 0) & To_bitvector(CONV_STD_LOGIC_VECTOR( character'pos(text(i+1)), 8 ));
i:=i+1;
end loop;
return result;
end ASCII_STRING_to_INIT_XX;

---------------------------------------------------------------------------------------------------
a tak jej przykładowe użycie w sekcji generic instancji BRAM:

INIT_00 => ASCII_STRING_to_INIT_XX("SMT0=FONTROM_0.ROM="),

a jest to równowazne takiemu napisowi:

INIT_00 => X"00000000000000000000000000534D54303D464F4E54524F4D5F302E524F4D3D"

Giger
-
-
Posty:5
Rejestracja:22 sty 2004, o 23:43

Postautor: Giger » 26 paź 2005, o 23:53

Mysle, ze na pewno zamienilbym petle -while- na -for-, poniewaz liczba iteracji jest z gory znana i oszczedza sprawdzania warunku wyjscia z petli. Moze daloby sie tez cos uzyskac poprzez modyfikacje konwersji w taki sposob, aby zamiast przesuwania calego wektora wynikowego i dodawania przekonwertowanego znaku na koncu, przypisywac przekonwertowane znaki bezposrednio do odpowiednich kawalkow wektora, np:

for i in 1 to text'LENGTH loop
result((i*8-1 downto (i-1)*8) := "00001001"; --> przekonwertowany ASCII
end loop;

Pzdr

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