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"
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
Moderatorzy:Jacek Bogusz, Moderatorzy
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
for i in 1 to text'LENGTH loop
result((i*8-1 downto (i-1)*8) := "00001001"; --> przekonwertowany ASCII
end loop;
Pzdr
Kto jest online
Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 8 gości