Перейти к содержанию
    

%-)

Участник
  • Постов

    118
  • Зарегистрирован

  • Посещение

Репутация

0 Обычный

Информация о %-)

  • Звание
    Частый гость
    Частый гость
  1. да мы тоже... просто руками необходимо дорабатывать. проблема - память 64 мб. нужно её всю очистить. делаем так: memset((void*)0,64*1024*1024,0) повисает. зато когда очищаем от 0 до 60 МБ - то всё работает но как только от 60 до 64 - повисает тоесть последний 4-й мегабайт вызывает повисание при записи. что может быть?
  2. У братьев по разуму есть что сказать? почему молчим?
  3. к бф532 прилеплена сдрамина 64мб кеширую всю сдрамину блоками по 4 мега первый блок - для выполнения программ и данных(чт./запись) WB|DIRTY|LOCK остальные 4-мб блоки только для данных (чт./запись) WB|DIRTY политика записи кэша WriteBack(для всех страниц) трабла в том что при записи в некоторые страницы - вся система повисает. объясните пожалста - в чем дело и что вообще дают эти поля - DIRTY, LOCK? а то датыйшыт читал - но ничего так и не понял для чего...
  4. лажу несёте, сударь, однако :) эксперименты с палитрой показали, что если индекс палитры - всегда определённые биты (например биты 0 - 7 памяти), то палитра успешно отображается и на VGA и на ТВ: здесь адрес меняется по фронту clk: if rising_edge(clk) then R<rgb(conv_integer(sram(7..0)))(14..10); G<rgb(conv_integer(sram(7..0)))(9..5); B<rgb(conv_integer(sram(7..0)))(4..0); end if; если же на первом такте вычитывать биты 0-7 памяти, а на втором такте - биты 8-15 (ещё раз: биты 0-7 - это одна точка, биты 8-15 - вторая точка), то размытость на ТВ ожидаема. На VGA всё ОК здесь адрес меняется по фронту clk/2: if rising_edge(clk) then if shift='0' then R<rgb(conv_integer(sram(7..0)))(14..10); G<rgb(conv_integer(sram(7..0)))(9..5); B<rgb(conv_integer(sram(7..0)))(4..0); else R<rgb(conv_integer(sram(15..8)))(14..10); G<rgb(conv_integer(sram(15..8)))(9..5); B<rgb(conv_integer(sram(15..8)))(4..0); end if; shift<=not shift; end if;
  5. засуньте себе в одно место номер хендбука от Алтеры пожалуйста... где написано как сделать перегружаемую палитру на 256 цветов отсутствие ссылки - факт подтверждения вашего мнимого профессионализма. P.S. говорить и посылать мы все можем.
  6. напоминает разговор слепого с глухим. чесслово... ожидаю здравых ыслей по палитре - а мне подсовывают формулы??? в недоумении... тогда нах форум этот нужен вообще, если ответы можно в другом месте искать? толку ~0 неправда. двухпортовое озу просто необходимо - нужно одновременно и оперативно писать и вычитывать.
  7. во-первых: синтезатор сам автоматом мне сделал такую память из M4K блоков (ему видней, значит так надо) во-вторых: что-то мы сомневаемся, что алтера изобилует экзамплами вга-контроллеров , особенно с применением колор-меппера в-третьих: почти весь OpenSource в 90% представляет собой г@вно, которое не работает либо работает не так в-четвртых: кроме нас думается никто в точности не знает что надо получить ;-)
  8. палитра не считается по формуле. всего 256 цветов - они хранятся в видеопамяти по 1 байту на 1 точку этот байт - и есть номер(смещение) массива палитры. (массив хранит R,G,B в 15 битах) описание массива палитры: type R_RGB_Type is array(255 downto 0) of std_logic_vector(14 downto 0); signal R_RGB:R_RGB_Type; запись в регистры палитры: *(short*)(BaseAddr+RegOffs)=0x7000|Color; *(short*)(BaseAddr+RegOffs)=0x8000|(R<<10)|(G<<5)|B; process(ClkPLL) begin if rising_edge(ClkPLL) then ... when "0111"=> R_C:=D1(7 downto 0); when "1000"=> if D1(15)='1' then R_RGB(conv_integer(R_C))<=D1(14 downto 0); end if; ... При синтезе массив палитры преобразуется в двухпортовую синхронную память, тактируемую ClkPLL (200МГц) Вывод видеоданных на VGA происходит на другом клоке - Clk=50 МГц Возможно , нечёткое изображение (когда используется палитра) из-за разных тактовых клоков
  9. люди! памагите! сроки поджимают, а мы(контора) до конца не сделали! палитру подскажите как делать плиз... -------------- пока такая идея: потактово - вычисление адреса, вычитывание байта, считывание палитры, выод на экран
  10. вы наверное меня не поняли :) загружаю палиру через регистры вовнутренние std_logic_vector'а в SRAM'е палитры нет - просто из SRAM мы вычитываем слово(16 бит) - байты которых - код ццета - индекс массива палитры памагите сзделать ;-) гыыы... вот: process(Clk) begin if rising_edge(Clk) then if PixelClockEn='0' then if Blank='1' then --Direct Color 16bpp R:G:B = 1:5:5:5 if R_M(0)='0' then if R_P='0' then RGB<=VRAM0_D(14 downto 0); else RGB<=VRAM1_D(14 downto 0); end if; --Palette Color 8bpp else if R_P='0' then if R_M(1)='0' then --VGA if F(conv_integer(V(0)))(2)='0' then RGB<=R_RGB(conv_integer(VRAM0_D( 7 downto 0))); else RGB<=R_RGB(conv_integer(VRAM0_D(15 downto 8))); end if; else --NTSC if F(0)(2)='0' then RGB<=R_RGB(conv_integer(VRAM0_D( 7 downto 0))); else RGB<=R_RGB(conv_integer(VRAM0_D(15 downto 8))); end if; end if; else if R_M(1)='0' then --VGA if F(conv_integer(V(0)))(2)='0' then RGB<=R_RGB(conv_integer(VRAM1_D( 7 downto 0))); else RGB<=R_RGB(conv_integer(VRAM1_D(15 downto 8))); end if; else --NTSC if F(0)(2)='0' then RGB<=R_RGB(conv_integer(VRAM1_D( 7 downto 0))); else RGB<=R_RGB(conv_integer(VRAM1_D(15 downto 8))); end if; end if; end if; end if; end if; end if; end if; end process; process(Clk) begin if rising_edge(Clk) then if PixelClockEn='0' then RGB_Reg<=RGB; if Blank='1' then Video_R<=RGB_Reg(14 downto 10); Video_G<=RGB_Reg( 9 downto 5); Video_B<=RGB_Reg( 4 downto 0); else Video_R<=(others => '0'); Video_G<=(others => '0'); Video_B<=(others => '0'); end if; end if; end if; end process;
  11. ещё вопрос по генерации адреса. нужно удваивать строки. тогда адреса генерируются так: 0..319, 0..319, 320..639, 320..639, 640..... делаю пока так: if rising_edge(Clk) then if PixelClockEn='0' then if Blank='1' then if F(conv_integer(V(0)))=153599 then F(conv_integer(V(0)))<=(others => '0'); else F(conv_integer(V(0)))<=F(conv_integer(V(0)))+1; end if; end if; ... тоесть завёл массив из двух счётчиков и инкрементируем их по-очереди (номер 0-1 задается нулевым битом номера строки) как можно быстрее и проще?
  12. Спасибо за ваш развёрнутый ответ :) А как можно сделать палитру? Мы должны считать с памяти слово (16 бит). Затем на одном такте его биты 0..7 загнать в индекс массива палитры, на другом такте биты 8..15 в палитру. И так по кругу. Тоесть в палитровом режиме частота чтения в 2 раза меньше должна быть, но частота вывода останется таже - 12.5 МГц. На первом такте биты 0..7 на втором 8..15 тоесть: данные на частоте 12.5 / 2 МГц: SRAM_Address<=ReadAddr+1; на первом такте 12.5 МГц: Video_R<=Palette(conv_integer(SRAM_D_Reg(7 downto 0)))(14..10); Video_G<=Palette(conv_integer(SRAM_D_Reg(7 downto 0)))(9..5); Video_B<=Palette(conv_integer(SRAM_D_Reg(7 downto 0)))(4..0); на втором такте 12.5 МГц: Video_R<=Palette(conv_integer(SRAM_D_Reg(15 downto 8)))(14..10); Video_G<=Palette(conv_integer(SRAM_D_Reg(15 downto 8)))(9..5); Video_B<=Palette(conv_integer(SRAM_D_Reg(15 downto 8)))(4..0); как оптимальнее и правильнее сделать?
  13. Дело в том, что при раздутии проекта (допустим захотели что-то добавить) неизбежно усложняется алгоритм - становится очень много ветвей, что вносит запаздывание в логику. тут и VGA режим нужен и NTSC и каждый из них ещё должен быть в директколоре и в палитровом режиме. Всё зависит от управляющих регистров. вот и поэтому собираюсь конвееризировать и синхронизировать. P.S. особенно бесит то , что симулятор насимулил иголки вот в таком на первый взгляд "простом" месте: HBlank<='1' when (HCounter>=(Sync+BackPorch) and HCounter<(Sync+BackPorch+Visible)) else '0'; а вот при об-клочивании пиксельклоком - горизонтальный синхроимпульс стал выглядеть как надо :) логика (особенно программируемая) - это просто КАПЕЦ
  14. кстати, как правильно(синхронно) вычитывать данные из внешней SRAM на дисплей? Пока сделано так(для наглядности - код упрощён - нет обнулений по ограничению): process(Clk) --из 50 МГц получаем 25 мгц для пиксельклока begin if rising_edge(Clk) then PixelClock<=PixelClock+1; end if; end process; process(PixelClock) --для увеличения адреса SRAM begin if rising_edge(PixelClock) then Address<=Address+1; end if; end process; SRAM_CE<='0'; SRAM_OE<=PixelClock; --стробируем по пикслеьклоку. Квазисинхронный режим??? Для SRAM SRAM_A<=Address; process(PixelClock) --выдаём данные на VGA порт begin if rising_edge(PixelClock) then if Blank='1' then -- кадр R<=SRAM_D(14 downto 10); -- считываем данные с SRAM G<=SRAM_D(9 downto 5); B<=SRAM_D(4 downto 0); else --бланк-интервалы - форсируем цвет в 0 R<="00000"; G<="00000"; B<="00000"; end if; end if; end process; Blank<=HBlank and VBlank; -- =0 когда обратный ход луча(по строке или кадру), 1 - когда идёт отображение кадра
×
×
  • Создать...