User Tag List

Страница 1 из 3 123 ПоследняяПоследняя
Показано с 1 по 10 из 30

Тема: Расширения fpga-клонов

Комбинированный просмотр

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #1

    Регистрация
    15.02.2015
    Адрес
    г. Могилёв, Беларусь
    Сообщений
    929
    Спасибо Благодарностей отдано 
    15
    Спасибо Благодарностей получено 
    119
    Поблагодарили
    73 сообщений
    Mentioned
    3 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию Расширения fpga-клонов

    Уже давно появились фпга клоны, однако почему-то никто ещё не хочет их улучшать в плане графики. Однако, эти улучшения напрашиваются сами. Например ограничение в 512 цветов. Это ограничение из-за того, что для значений цветовых компонентов не учитывается младший бит. Но ведь, ВДП имеет кучу неиспользованных регистров с номерами: 6,8,9,14,с 24 по 31. В одном из свободных регистров можно было бы предусмотреть разряд, который бы и отвечал за режим включения учета младших бит в цветовых компонентах. Тогда при записи в этот разряд регистра, мы бы получали четырёхбитные компоненты цвета, и 4096 цветов.
    Потом, ограничение в 4 общие палитры и на тайлы и на спрайты. Хотя, можно разделить палитры на два банка - банк палитр для тайлов и банк палитр для спрайтов. Каждый банк по 4 палитры. Это удвоит количество цветов видимых одновременно на экране с 61 до 121. Но для этого нужно расширить CRAM до 128 цветов. Цвета с номерами 0-63 входят в банк палитр тайлов, а 64 по 127 в банк палитр спрайтов. Разумеется, нужно предусмотреть включение разделения палитр бо банкам через свободный регистр ВДП.
    Наконец, можно сделать для спрайтов выбор банка палитр через свободный бит в байтах атрибутов спрайта. Это позволит использовать для спрайтов 2 банка палитр( банк палитр фона и банк палитр спрайтов),все 8 палитр. Место для этого бита можно выделить в третьем байте атрибута спрайта, который отвечает за размер спрайта. Конкретно, это любой бит с 4 по 7. Например, седьмой.
    Ну, вот это всё можно приложить к 14-му свободному регистру. Рассмотрим возможное назначение его разрядов:
    D7 - задание ширины цветовых компонентов:
    0- компонента в три бита;
    1- компонента в 4 бита;
    D6 - D5 -задание режима разделения палитр по банкам:
    00- разделения по банкам нет, общие 4 палитры для тайлов и спрайтов;
    01- разделения по банкам есть, раздельные банки из 4 палитр для тайлов и спрайтов. Но для 3 байта атрибута спрайтов седьмой бит при нулевом значении выбирает банк палитр тайлов, при единичном банк палитр спрайтов;
    10 - разделения по банкам есть, раздельные банки из 4 палитр для тайлов и спрайтов. Но для 3 байта атрибута спрайтов седьмой бит при нулевом значении выбирает банк палитр спрайтов, при единичном банк палитр тайлов;
    11-Строгое разделение палитр по банкам, раздельные банки из 4 палитр для тайлов и спрайтов. Для тайлов банк палитр тайлов, для спрайтов банк палитр спрайтов. Седьмой бит 3 байта атрибута спрайта не влияет на выбор банка палитр;
    D4 - D3 - не используются;
    D2 - D0 - обязательный повтор значений битов D7 - D5. Защитная функция от записи случайного мусора при ошибках.

    Кто-нибудь что-нибудь понял? Напишите свой отзыв.
    ¡Un momento, señor fiscal!


  2. #1
    С любовью к вам, Yandex.Direct
    Размещение рекламы на форуме способствует его дальнейшему развитию

  3. #2

    Регистрация
    01.02.2010
    Адрес
    Москва
    Сообщений
    769
    Спасибо Благодарностей отдано 
    178
    Спасибо Благодарностей получено 
    191
    Поблагодарили
    91 сообщений
    Mentioned
    11 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    А в программах откуда появится поддержка этих железных расширений?
    Последний раз редактировалось xolod; 20.06.2025 в 11:43.

  4. #3

    Регистрация
    30.11.2015
    Адрес
    г. Самара
    Сообщений
    7,506
    Спасибо Благодарностей отдано 
    344
    Спасибо Благодарностей получено 
    713
    Поблагодарили
    595 сообщений
    Mentioned
    13 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от xolod Посмотреть сообщение
    А в программах откуда появится поддержка этих железных разширений?
    Оттуда же, откуда всегда - кто-то когда-то может быть напишет новые версии программ. Он вообще много чего успел написать, этот кто-то

  5. #4

    Регистрация
    15.02.2015
    Адрес
    г. Могилёв, Беларусь
    Сообщений
    929
    Спасибо Благодарностей отдано 
    15
    Спасибо Благодарностей получено 
    119
    Поблагодарили
    73 сообщений
    Mentioned
    3 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Сообщение поделю на пункты:
    А) Пересмотр концепции
    Б) Прогресс и промежуточные результаты
    В) Диалог с заинтересованными людьми

    А) В общем окончательно я выбрал исходники https://github.com/Torlus/fpgagen. По сравнению с исходниками для Мистера в них только один язык VHDL, в то время как в исходниках для Мистера мешанина Verilog и VHDL. Кроме того, на этих исходниках базируются исходные коды для Мистера. Также эти исходники для четырёх плат:
    MiST, Turbo Chameleon 64, Altera/Terasic DE2 board.
    Когда я глянул на исходный код VDP, то сразу понял, что от выбора разрядности компонентов цвета нужно отказаться. Что бы реализовать такой выбор необходимо полностью переписать VDP, а это достаточно тяжело. Также я решил изменить расположение битовых полей в регистре 14. Теперь биты задающие режим разделения палитр по банкам не шестой и пятый, а пятый и четвёртый. Эти биты необходимо дублировать в первом и нулевом битах при записи в регистр.

    Б) Вот исходники VDP https://github.com/Torlus/fpgagen/bl...er/src/vdp.vhd для вашего анализа. Теперь я напишу что мне удалось изменить. Если есть ошибки или у вас есть лучшие решения - сразу исправляйте и предлагайте другие решения. Анализируйте исходный код оригинала и читайте мои изменения и пояснения:

    1. Расширение CRAM
    В разделе объявлений -- ON-CHIP RAMS есть тип и объявление для CRAM

    type cram_t is array(0 to 63) of std_logic_vector(15 downto 0);
    signal CRAM

    Меняем диапазон типа массива CRAM на 0..127

    type cram_t is array(0 to 127) of std_logic_vector(15 downto 0);

    Теперь цветовая память расширена для хранения 128 значений цветов.

    Нужно проверить есть ли в листинге ограничения на запись-чтение CRAM только для 64 цветов.
    Такие ограничения есть, поэтому их нужно устранить. Ограничения касаются размера адреса только для 64 ячеек CRAM.
    Необходимо расширить диапазон адресов до 128 ячеек. За адрес в участках памяти ВДП отвечает сигналы DT_WR_ADDR и ADDR.
    Они описаны в разделе объявлений -- DATA TRANSFER CONTROLLER

    signal DT_WR_ADDR : std_logic_vector(15 downto 0);
    signal ADDR : std_logic_vector(15 downto 0);

    Однако, нужно узнать в каких местах есть доступ к CRAM. В этом поможет сигнал DTC перечислимого типа dtc_t.
    Их описания в том же разделе

    type dtc_t is (
    ...
    DTC_CRAM_WR,
    ...
    DTC_CRAM_RD,
    ...
    );
    signal DTC : dtc_t;

    Ищем место в листинге где есть запись в CRAM по значению переменной DTC равному DTC_CRAM_WR.
    Такие места встречаются в разделе реализации -- DATA TRANSFER CONTROLLER. Нас интересует оператор case

    case DTC is

    А именно случай
    when DTC_CRAM_WR =>
    -- synthesis translate_off
    write(L, string'(" CRAM WR ["));
    hwrite(L, x"00" & DT_WR_ADDR(15 downto 1) & '0');
    write(L, string'("] = ["));
    hwrite(L, DT_WR_DATA);
    write(L, string'("]"));
    writeline(F,L);
    -- synthesis translate_on
    CRAM( CONV_INTEGER(DT_WR_ADDR(6 downto 1)) ) <= DT_WR_DATA;

    Последнюю строку нужно изменить, чтобы был доступ ко всем 128 цветам

    CRAM( CONV_INTEGER(DT_WR_ADDR(7 downto 1)) ) <= DT_WR_DATA;

    В томже операторе case ищем ветвь по значению пременной DTC равной DTC_CRAM_RD

    when DTC_CRAM_RD =>
    DT_RD_DATA <= CRAM( CONV_INTEGER(ADDR(6 downto 1)) );
    DT_RD_DTACK_N <= '0';
    ADDR <= ADDR + ADDR_STEP;
    DTC <= DTC_IDLE;

    Здесь нужно заменить вторую строку на

    DT_RD_DATA <= CRAM( CONV_INTEGER(ADDR(7 downto 1)) );

    Похоже, что теперь расширение CRAM до 128 цветов выполнено, если не было каких-либо упущений.

    2. Введение нового регистра.
    В разеле объявлений -- CPU INTERFACE есть тип и объявение для множества( массива) регистров

    type reg_t is array(0 to 31) of std_logic_vector(7 downto 0);
    signal REG : reg_t;

    Из этого видно, что предусмотрено 32 регистра. Регистр с индексом и номером 14 не используется, поэтому выберем
    его в качестве нового регистра "Режим выбора палитровых банков".
    Для временного хранения значения регистров используется сигнал REG_LATCH. Он описан в том же разделе как

    signal REG_LATCH : std_logic_vector(15 downto 0);

    Данные регистра хранятся в битах 7-0 защёлки REG_LATCH. В старших битах 15-8 хранится конкатенация битового значения "100" и номера регистра.

    В разделе объявлений -- REGISTERS описаны поименованные линии( сигналы) непосредственно представляющие данные битовых
    полей регистров. В этом разделе нам необходимо ввести новый сигнал PBS_MODE( palette bank selection mode)

    signal PBS_MODE : std_logic_vector(1 downto 0);

    В исходниках есть раздел реализации -- REGISTERS. В этом
    разделе реализации -- REGISTERS назначаем нашему сигналу PBS_MODE соответствующие битовые поля регистра 14


    PBS_MODE <= REG(14)(5 downto 4);

    Фактически регистр введён. Но из-за особой роли этого регистра, его необходимо защитить от записи в него случайных значений.
    Так для того, чтобы записать в регистр значения 5-го и 4-го битов нужно продублировать эти значения в 1-ый и 0-й бит.
    Для релизации защиты нужно посмотреть место в исходнике где происходит запись в регистр. В этом помогут сигналы
    REG_SET_REQ - запрос на установку с регистром( наверно такая расшифровка) и REG_SET_ACK - подтверждение выполнения запроса на установку регистра( могу ошибиться с расшифровкой).
    Эти сигналы описаны в разделе объявлений -- DATA TRANSFER CONTROLLER

    signal REG_SET_REQ : std_logic;
    signal REG_SET_ACK : std_logic;

    Ищем место в исходнике по названию сигнала REG_SET_REQ, где происходила бы запись в регистр или буфер REG_LATCH.
    Одно такое место находится в разделе реализации -- CPU INTERFACE в одном из вложенных условий


    if DI(15 downto 13) = "100" then
    -- Register Set
    REG_LATCH <= DI;

    Это место легко найти по комментарию -- Register Set. Проанализируем: данные с шины DI (сокращение Data Input) записываются в буфер-защёлку.
    Но тут нет передачи данных непосредсвенно в регистр. Следовательно, продолжаем искать дальше. В разделе реализации -- DATA TRANSFER CONTROLLER
    находим место в одном из подусловий

    if REG_SET_REQ = '1' and REG_SET_ACK = '0' and IN_DMA = '0' then
    REG( CONV_INTEGER( REG_LATCH(12 downto 8)) ) <= REG_LATCH(7 downto 0);
    REG_SET_ACK <= '1';
    end if;

    Вот тут данные с защёлки-буфера попадают в регистр. Защиту реализуем вставкой вложенного условия

    if REG_SET_REQ = '1' and REG_SET_ACK = '0' and IN_DMA = '0' then
    if ( (CONV_INTEGER(REG_LATCH(12 downto 8)) = 14) and (REG_LATH(5 downto 4) = REG_LATH(1 downto 0))) then
    REG(14) <= REG_LATCH(7 downto 0);
    elseif CONV_INTEGER(REG_LATCH(12 downto 8)) /= 14 then
    REG( CONV_INTEGER( REG_LATCH(12 downto 8)) ) <= REG_LATCH(7 downto 0);
    end if;
    REG_SET_ACK <= '1';
    end if;


    Защита записи регистра выполнена, хотя очень коряво. Отдаю всё на откуп оптимизатору.

    Остаётся понять работу тайло-спрайтового движка и внести в него изменения.

    В) Вы заметили, что я не дал, готовый файл, не вынес на блюдечке. Я хочу, что бы те кому интересна тема разбирались вместе со мной и оказывали мне помощь. Как я не раз убеждался на этом форуме: те кто выносили всё на готовенькое на блюдечке получали плевок в лицо. То ли многие люди тут неблагодарные, то ли это у них совковое воспитание, то ли они завистливые и тех кто инициативен считают выпендрёжниками - не знаю. Поэтому коллективная работа и взаимопомощь. Я пока недельку отдохну от VDP и посмотрю, что изменится за неделю. Может, кто-то
    расшифрует на русский названия сигналов, кто-то нарисует временные диаграммы, ну а кто-то даже графически зарисует схему процессов со спискам чувствительности.
    Вот ещё момент. Автор исходников рекомендует программы
    - Altera Quartus II 9.1 Web Edition.
    - (optional) ModelSim-Altera 6.5b Starter Edition.
    Это достаточно старые программы как и сами исходники 2010-2013 гг. Посоветуйте, где бы их скачать? Только, вот, не надо "Ищи сам" и прочее. Я ни разу не пользовался Квартусом, поэтому не специалист в этом вопросе и даже не представляю, где скачать такую старую версию. Да ещё могут быть подводные камни с установкой и настройкой.
    А может мне сменить форум, где смогу получить помощь? Посоветуйте такой.
    Последний раз редактировалось Smalovsky; 31.07.2025 в 16:46.
    ¡Un momento, señor fiscal!


  6. #5

    Регистрация
    27.11.2013
    Адрес
    г. Санкт-Петербург
    Сообщений
    974
    Спасибо Благодарностей отдано 
    51
    Спасибо Благодарностей получено 
    197
    Поблагодарили
    164 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Чойтоясегоднядурной...
    Соррян за жуткий оффтоп.
    Со стороны это выглядит так:
    "ТС якобы что-то изваял, привёл куски кода (только смысла в них ни какого).
    Потом "свалил в кусты" типо подожду пока кто нибудь не клюнет и не сделает часть работы (в которой нифига не шарит, либо лень).
    Прикинулся шлангом (что такое гугл не знает и где торрент тоже).
    Докучи намекнул что все ... а я дартаньян. может к другим мушкетёрам податься ?"
    Ещё раз сорри... если слишком грубо.
    ПС: может я ошибаюсь в ситуации? и всё совсем не так на деле?

  7. #6

    Регистрация
    15.02.2015
    Адрес
    г. Могилёв, Беларусь
    Сообщений
    929
    Спасибо Благодарностей отдано 
    15
    Спасибо Благодарностей получено 
    119
    Поблагодарили
    73 сообщений
    Mentioned
    3 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от AlexG Посмотреть сообщение
    Чойтоясегоднядурной...
    Только сегодня?
    Цитата Сообщение от AlexG Посмотреть сообщение
    ТС якобы что-то изваял, привёл куски кода (только смысла в них ни какого).
    Толстый троллинг. Почитай название топика. Расширение клонов на фпга подразумевает изменение их прошивки, а для этого нужно изменить исходные коды прошивки. Ты это знал?
    Я взял прошивку с гитхаба за базу и написал, что в ней я конкретно меняю для получения результата. Знаток вхдл? Докажи, что в кусках кода нет никакого смысла.
    Цитата Сообщение от AlexG Посмотреть сообщение
    Потом "свалил в кусты" типо подожду пока кто нибудь не клюнет и не сделает часть работы (в которой нифига не шарит, либо лень).
    Подожду, пока кто-нибудь не присоединится к работе. Ты понимаешь, что правку кода вдп можно одному не потянуть? Докажи, что я нифига не шарю.
    Цитата Сообщение от AlexG Посмотреть сообщение
    Прикинулся шлангом (что такое гугл не знает и где торрент тоже).
    Это тебе не музычку скачивать. Кроме того, что бы найти эти старые программы, их нужно ещё правильно установить и настроить.
    Цитата Сообщение от AlexG Посмотреть сообщение
    Докучи намекнул что все ... а я дартаньян. может к другим мушкетёрам податься ?"
    Ты наверно подсознательно причислил себя к нехорошим людям, о которых я писал.
    Цитата Сообщение от AlexG Посмотреть сообщение
    ПС: может я ошибаюсь в ситуации? и всё совсем не так на деле?
    Зачем ты написал в этот топик? Ты не понимаешь о чём речь в этом топике, не понимаешь, о каком расширении я написал в первом посту, не понимаешь принцип этого расширения,не понимаешь кусков кода, да и вообще, тебе этот топик безразличен. Тогда зачем ты сюда пишешь?

    - - - Добавлено - - -

    Пацаны, не ведитесь на залётных циркачей. Им этот топик по-барабану. Они даже не могут понять о чём речь вообще.
    ¡Un momento, señor fiscal!


  8. #7

    Регистрация
    27.11.2013
    Адрес
    г. Санкт-Петербург
    Сообщений
    974
    Спасибо Благодарностей отдано 
    51
    Спасибо Благодарностей получено 
    197
    Поблагодарили
    164 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Сегодня мне просто лень.
    Посему кратко:
    VHDL, Verilog - это один из моих "кусков хлеба" - так что, увы, я в нем разбираюсь.
    "Правильно установить и настроить" - обычно эти знания требуются при работе в линуксе. в винде обычно всё сводится к запуску инсталлятора. Если с эти у кого-то сложности то это его печаль.

  9. #8

    Регистрация
    15.02.2015
    Адрес
    г. Могилёв, Беларусь
    Сообщений
    929
    Спасибо Благодарностей отдано 
    15
    Спасибо Благодарностей получено 
    119
    Поблагодарили
    73 сообщений
    Mentioned
    3 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от AlexG Посмотреть сообщение
    Сегодня мне просто лень.
    Так ты даже мои правки не читал! Циркач!

    - - - Добавлено - - -

    Цитата Сообщение от AlexG Посмотреть сообщение
    в винде обычно всё сводится к запуску инсталлятора
    А может и не сводИться.
    Последний раз редактировалось Smalovsky; 31.07.2025 в 17:04.
    ¡Un momento, señor fiscal!


  10. #9

    Регистрация
    15.02.2015
    Адрес
    г. Могилёв, Беларусь
    Сообщений
    929
    Спасибо Благодарностей отдано 
    15
    Спасибо Благодарностей получено 
    119
    Поблагодарили
    73 сообщений
    Mentioned
    3 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Автор оригинальной прошивки недавно умер...
    https://tinkerdifferent.com/threads/...-estrade.4501/
    Может, для кого-то это важно узнать.
    А я ему уже хотел письмо писать, для разъяснения назначения сигналов в спрайтовом движке... Буду писать( видимо придётся, слишком сложный спрайтовый движок) в команды Мистера и Тимгенезис , у них прошивки основаны на прошивке автора. Такие дела..
    Последний раз редактировалось Smalovsky; 03.08.2025 в 14:42.
    ¡Un momento, señor fiscal!


  11. #10

    Регистрация
    15.02.2015
    Адрес
    г. Могилёв, Беларусь
    Сообщений
    929
    Спасибо Благодарностей отдано 
    15
    Спасибо Благодарностей получено 
    119
    Поблагодарили
    73 сообщений
    Mentioned
    3 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Дошёл до редактирования раздела реализации -- PIXEL COUNTER AND OUTPUT.
    Сделаю необходимые пояснения. Информация о пикселях строки хранится в трёх буферах строк OBJ_COLINFO, BGA_COLINFO, BGB_COLINFO,
    представляющих собой двухпортовую память. Каждый буфер строки хранит информацию о 320 пикселях строки. Буфер OBJ_COLINFO хранит пиксели
    строки спрайтового слоя. Буферы BGA_COLINFO и BGB_COLINFO хранят информацию о пикселях тайловых слоёв А и Б. В функциональном блоке PIXEL COUNTER AND OUTPUT
    происходит считывание информации для пикселя выводимого на экран из каждого источника - буферов строк и из регистра фонового цвета, выбор согласно информации из источников( приоритету и значению номеру цвета)
    конечного источника информации о пикселе и получению значения цвета из CRAM согласно этому источнику. Это приблизительно показано на следующей схеме:



    Информация о пикселе в семибитных ячейках буферов строк состоит из следующих битовых полей:
    PRI - бит приоритета, PALNO -номер палитры, COLNO-номер цвета в палитре.
    Для регистра фонового цвета бит приоритета не нужен.
    Выбор значения цвета из массива CRAM происходит по индексу равному десятичному значению конкатенации PALNO & COLNO.

    За реализацию показанной выше приближонной схемы отвечает участок кода в операторе case PIXDIV is, в ветви:

    when "0011" =>
    if OBJ_COLINFO_Q_B(3 downto 0) /= "0000" and OBJ_COLINFO_Q_B(6) = '1' then
    T_COLOR <= CRAM( CONV_INTEGER(OBJ_COLINFO_Q_B(5 downto 0)) );
    elsif BGA_COLINFO_Q_B(3 downto 0) /= "0000" and BGA_COLINFO_Q_B(6) = '1' then
    T_COLOR <= CRAM( CONV_INTEGER(BGA_COLINFO_Q_B(5 downto 0)) );
    elsif BGB_COLINFO_Q_B(3 downto 0) /= "0000" and BGB_COLINFO_Q_B(6) = '1' then
    T_COLOR <= CRAM( CONV_INTEGER(BGB_COLINFO_Q_B(5 downto 0)) );
    elsif OBJ_COLINFO_Q_B(3 downto 0) /= "0000" then
    T_COLOR <= CRAM( CONV_INTEGER(OBJ_COLINFO_Q_B(5 downto 0)) );
    elsif BGA_COLINFO_Q_B(3 downto 0) /= "0000" then
    T_COLOR <= CRAM( CONV_INTEGER(BGA_COLINFO_Q_B(5 downto 0)) );
    elsif BGB_COLINFO_Q_B(3 downto 0) /= "0000" then
    T_COLOR <= CRAM( CONV_INTEGER(BGB_COLINFO_Q_B(5 downto 0)) );
    else
    T_COLOR <= CRAM( CONV_INTEGER(BGCOL) );
    end if;

    Необходимо изменить этот код, чтобы можно было выбирать из 128 значений цветов CRAM. Впервую очередь, необходимо расширить память OBJ_COLINFO
    до ширины шины данных в 8 бит. Ячейка памяти OBJ_COLINFO будет содержать конкатенацию битовых полей BS & PRI & PALNO & COLNO. Новый бит BS в старшем разряде ячейки - бит переключения палитровых банков.
    Буфера строк имеют тип vdp_colinfo( описан в файле vdp_colinfo.vhd). По аналогии с этим типом при помощи Мегавизард( Memory Compilier) в Квартус 2 делаем тип vdp_ext_colinfo, который отличается торлько шириной шины
    данных каналов в 8 бит. Что у меня вышло:

    vdp_ext_colinfo


    Код:
    -- megafunction wizard: %RAM: 2-PORT%
    -- GENERATION: STANDARD
    -- VERSION: WM1.0
    -- MODULE: altsyncram 
    
    -- ============================================================
    -- File Name: vdp_ext_colinfo.vhd
    -- Megafunction Name(s):
    -- 			altsyncram
    --
    -- Simulation Library Files(s):
    -- 			altera_mf
    -- ============================================================
    -- ************************************************************
    -- THIS IS A WIZARD-GENERATED FILE. DO NOT EDIT THIS FILE!
    --
    -- 9.1 Build 350 03/24/2010 SP 2 SJ Web Edition
    -- ************************************************************
    
    
    --Copyright (C) 1991-2010 Altera Corporation
    --Your use of Altera Corporation's design tools, logic functions 
    --and other software and tools, and its AMPP partner logic 
    --functions, and any output files from any of the foregoing 
    --(including device programming or simulation files), and any 
    --associated documentation or information are expressly subject 
    --to the terms and conditions of the Altera Program License 
    --Subscription Agreement, Altera MegaCore Function License 
    --Agreement, or other applicable license agreement, including, 
    --without limitation, that your use is for the sole purpose of 
    --programming logic devices manufactured by Altera and sold by 
    --Altera or its authorized distributors.  Please refer to the 
    --applicable agreement for further details.
    
    
    LIBRARY ieee;
    USE ieee.std_logic_1164.all;
    
    LIBRARY altera_mf;
    USE altera_mf.all;
    
    ENTITY vdp_ext_colinfo IS
    	PORT
    	(
    		address_a		: IN STD_LOGIC_VECTOR (8 DOWNTO 0);
    		address_b		: IN STD_LOGIC_VECTOR (8 DOWNTO 0);
    		clock		: IN STD_LOGIC  := '1';
    		data_a		: IN STD_LOGIC_VECTOR (7 DOWNTO 0);
    		data_b		: IN STD_LOGIC_VECTOR (7 DOWNTO 0);
    		wren_a		: IN STD_LOGIC  := '0';
    		wren_b		: IN STD_LOGIC  := '0';
    		q_a		: OUT STD_LOGIC_VECTOR (7 DOWNTO 0);
    		q_b		: OUT STD_LOGIC_VECTOR (7 DOWNTO 0)
    	);
    END vdp_ext_colinfo;
    
    
    ARCHITECTURE SYN OF vdp_ext_colinfo IS
    
    	SIGNAL sub_wire0	: STD_LOGIC_VECTOR (7 DOWNTO 0);
    	SIGNAL sub_wire1	: STD_LOGIC_VECTOR (7 DOWNTO 0);
    
    
    
    	COMPONENT altsyncram
    	GENERIC (
    		address_aclr_a		: STRING;
    		address_aclr_b		: STRING;
    		address_reg_b		: STRING;
    		indata_aclr_a		: STRING;
    		indata_aclr_b		: STRING;
    		indata_reg_b		: STRING;
    		intended_device_family		: STRING;
    		lpm_type		: STRING;
    		numwords_a		: NATURAL;
    		numwords_b		: NATURAL;
    		operation_mode		: STRING;
    		outdata_aclr_a		: STRING;
    		outdata_aclr_b		: STRING;
    		outdata_reg_a		: STRING;
    		outdata_reg_b		: STRING;
    		power_up_uninitialized		: STRING;
    		read_during_write_mode_mixed_ports		: STRING;
    		widthad_a		: NATURAL;
    		widthad_b		: NATURAL;
    		width_a		: NATURAL;
    		width_b		: NATURAL;
    		width_byteena_a		: NATURAL;
    		width_byteena_b		: NATURAL;
    		wrcontrol_aclr_a		: STRING;
    		wrcontrol_aclr_b		: STRING;
    		wrcontrol_wraddress_reg_b		: STRING
    	);
    	PORT (
    			wren_a	: IN STD_LOGIC ;
    			clock0	: IN STD_LOGIC ;
    			wren_b	: IN STD_LOGIC ;
    			address_a	: IN STD_LOGIC_VECTOR (8 DOWNTO 0);
    			address_b	: IN STD_LOGIC_VECTOR (8 DOWNTO 0);
    			q_a	: OUT STD_LOGIC_VECTOR (7 DOWNTO 0);
    			q_b	: OUT STD_LOGIC_VECTOR (7 DOWNTO 0);
    			data_a	: IN STD_LOGIC_VECTOR (7 DOWNTO 0);
    			data_b	: IN STD_LOGIC_VECTOR (7 DOWNTO 0)
    	);
    	END COMPONENT;
    
    BEGIN
    	q_a    <= sub_wire0(7 DOWNTO 0);
    	q_b    <= sub_wire1(7 DOWNTO 0);
    
    	altsyncram_component : altsyncram
    	GENERIC MAP (
    		address_aclr_a => "NONE",
    		address_aclr_b => "NONE",
    		address_reg_b => "CLOCK0",
    		indata_aclr_a => "NONE",
    		indata_aclr_b => "NONE",
    		indata_reg_b => "CLOCK0",
    		intended_device_family => "Stratix",
    		lpm_type => "altsyncram",
    		numwords_a => 512,
    		numwords_b => 512,
    		operation_mode => "BIDIR_DUAL_PORT",
    		outdata_aclr_a => "NONE",
    		outdata_aclr_b => "NONE",
    		outdata_reg_a => "CLOCK0",
    		outdata_reg_b => "CLOCK0",
    		power_up_uninitialized => "FALSE",
    		read_during_write_mode_mixed_ports => "OLD_DATA",
    		widthad_a => 9,
    		widthad_b => 9,
    		width_a => 8,
    		width_b => 8,
    		width_byteena_a => 1,
    		width_byteena_b => 1,
    		wrcontrol_aclr_a => "NONE",
    		wrcontrol_aclr_b => "NONE",
    		wrcontrol_wraddress_reg_b => "CLOCK0"
    	)
    	PORT MAP (
    		wren_a => wren_a,
    		clock0 => clock,
    		wren_b => wren_b,
    		address_a => address_a,
    		address_b => address_b,
    		data_a => data_a,
    		data_b => data_b,
    		q_a => sub_wire0,
    		q_b => sub_wire1
    	);
    
    
    
    END SYN;
    
    -- ============================================================
    -- CNX file retrieval info
    -- ============================================================
    -- Retrieval info: PRIVATE: ADDRESSSTALL_A NUMERIC "0"
    -- Retrieval info: PRIVATE: ADDRESSSTALL_B NUMERIC "0"
    -- Retrieval info: PRIVATE: BYTEENA_ACLR_A NUMERIC "0"
    -- Retrieval info: PRIVATE: BYTEENA_ACLR_B NUMERIC "0"
    -- Retrieval info: PRIVATE: BYTE_ENABLE_A NUMERIC "0"
    -- Retrieval info: PRIVATE: BYTE_ENABLE_B NUMERIC "0"
    -- Retrieval info: PRIVATE: BYTE_SIZE NUMERIC "8"
    -- Retrieval info: PRIVATE: BlankMemory NUMERIC "1"
    -- Retrieval info: PRIVATE: CLOCK_ENABLE_INPUT_A NUMERIC "0"
    -- Retrieval info: PRIVATE: CLOCK_ENABLE_INPUT_B NUMERIC "0"
    -- Retrieval info: PRIVATE: CLOCK_ENABLE_OUTPUT_A NUMERIC "0"
    -- Retrieval info: PRIVATE: CLOCK_ENABLE_OUTPUT_B NUMERIC "0"
    -- Retrieval info: PRIVATE: CLRdata NUMERIC "0"
    -- Retrieval info: PRIVATE: CLRq NUMERIC "0"
    -- Retrieval info: PRIVATE: CLRrdaddress NUMERIC "0"
    -- Retrieval info: PRIVATE: CLRrren NUMERIC "0"
    -- Retrieval info: PRIVATE: CLRwraddress NUMERIC "0"
    -- Retrieval info: PRIVATE: CLRwren NUMERIC "0"
    -- Retrieval info: PRIVATE: Clock NUMERIC "0"
    -- Retrieval info: PRIVATE: Clock_A NUMERIC "0"
    -- Retrieval info: PRIVATE: Clock_B NUMERIC "0"
    -- Retrieval info: PRIVATE: ECC NUMERIC "0"
    -- Retrieval info: PRIVATE: IMPLEMENT_IN_LES NUMERIC "0"
    -- Retrieval info: PRIVATE: INDATA_ACLR_B NUMERIC "0"
    -- Retrieval info: PRIVATE: INDATA_REG_B NUMERIC "1"
    -- Retrieval info: PRIVATE: INIT_FILE_LAYOUT STRING "PORT_A"
    -- Retrieval info: PRIVATE: INIT_TO_SIM_X NUMERIC "0"
    -- Retrieval info: PRIVATE: INTENDED_DEVICE_FAMILY STRING "Stratix"
    -- Retrieval info: PRIVATE: JTAG_ENABLED NUMERIC "0"
    -- Retrieval info: PRIVATE: JTAG_ID STRING "NONE"
    -- Retrieval info: PRIVATE: MAXIMUM_DEPTH NUMERIC "0"
    -- Retrieval info: PRIVATE: MEMSIZE NUMERIC "4096"
    -- Retrieval info: PRIVATE: MEM_IN_BITS NUMERIC "0"
    -- Retrieval info: PRIVATE: MIFfilename STRING ""
    -- Retrieval info: PRIVATE: OPERATION_MODE NUMERIC "3"
    -- Retrieval info: PRIVATE: OUTDATA_ACLR_B NUMERIC "0"
    -- Retrieval info: PRIVATE: OUTDATA_REG_B NUMERIC "1"
    -- Retrieval info: PRIVATE: RAM_BLOCK_TYPE NUMERIC "0"
    -- Retrieval info: PRIVATE: READ_DURING_WRITE_MODE_MIXED_PORTS NUMERIC "1"
    -- Retrieval info: PRIVATE: READ_DURING_WRITE_MODE_PORT_A NUMERIC "4"
    -- Retrieval info: PRIVATE: READ_DURING_WRITE_MODE_PORT_B NUMERIC "4"
    -- Retrieval info: PRIVATE: REGdata NUMERIC "1"
    -- Retrieval info: PRIVATE: REGq NUMERIC "1"
    -- Retrieval info: PRIVATE: REGrdaddress NUMERIC "0"
    -- Retrieval info: PRIVATE: REGrren NUMERIC "0"
    -- Retrieval info: PRIVATE: REGwraddress NUMERIC "1"
    -- Retrieval info: PRIVATE: REGwren NUMERIC "1"
    -- Retrieval info: PRIVATE: SYNTH_WRAPPER_GEN_POSTFIX STRING "0"
    -- Retrieval info: PRIVATE: USE_DIFF_CLKEN NUMERIC "0"
    -- Retrieval info: PRIVATE: UseDPRAM NUMERIC "1"
    -- Retrieval info: PRIVATE: VarWidth NUMERIC "0"
    -- Retrieval info: PRIVATE: WIDTH_READ_A NUMERIC "8"
    -- Retrieval info: PRIVATE: WIDTH_READ_B NUMERIC "8"
    -- Retrieval info: PRIVATE: WIDTH_WRITE_A NUMERIC "8"
    -- Retrieval info: PRIVATE: WIDTH_WRITE_B NUMERIC "8"
    -- Retrieval info: PRIVATE: WRADDR_ACLR_B NUMERIC "0"
    -- Retrieval info: PRIVATE: WRADDR_REG_B NUMERIC "1"
    -- Retrieval info: PRIVATE: WRCTRL_ACLR_B NUMERIC "0"
    -- Retrieval info: PRIVATE: enable NUMERIC "0"
    -- Retrieval info: PRIVATE: rden NUMERIC "0"
    -- Retrieval info: CONSTANT: ADDRESS_ACLR_A STRING "NONE"
    -- Retrieval info: CONSTANT: ADDRESS_ACLR_B STRING "NONE"
    -- Retrieval info: CONSTANT: ADDRESS_REG_B STRING "CLOCK0"
    -- Retrieval info: CONSTANT: INDATA_ACLR_A STRING "NONE"
    -- Retrieval info: CONSTANT: INDATA_ACLR_B STRING "NONE"
    -- Retrieval info: CONSTANT: INDATA_REG_B STRING "CLOCK0"
    -- Retrieval info: CONSTANT: INTENDED_DEVICE_FAMILY STRING "Stratix"
    -- Retrieval info: CONSTANT: LPM_TYPE STRING "altsyncram"
    -- Retrieval info: CONSTANT: NUMWORDS_A NUMERIC "512"
    -- Retrieval info: CONSTANT: NUMWORDS_B NUMERIC "512"
    -- Retrieval info: CONSTANT: OPERATION_MODE STRING "BIDIR_DUAL_PORT"
    -- Retrieval info: CONSTANT: OUTDATA_ACLR_A STRING "NONE"
    -- Retrieval info: CONSTANT: OUTDATA_ACLR_B STRING "NONE"
    -- Retrieval info: CONSTANT: OUTDATA_REG_A STRING "CLOCK0"
    -- Retrieval info: CONSTANT: OUTDATA_REG_B STRING "CLOCK0"
    -- Retrieval info: CONSTANT: POWER_UP_UNINITIALIZED STRING "FALSE"
    -- Retrieval info: CONSTANT: READ_DURING_WRITE_MODE_MIXED_PORTS STRING "OLD_DATA"
    -- Retrieval info: CONSTANT: WIDTHAD_A NUMERIC "9"
    -- Retrieval info: CONSTANT: WIDTHAD_B NUMERIC "9"
    -- Retrieval info: CONSTANT: WIDTH_A NUMERIC "8"
    -- Retrieval info: CONSTANT: WIDTH_B NUMERIC "8"
    -- Retrieval info: CONSTANT: WIDTH_BYTEENA_A NUMERIC "1"
    -- Retrieval info: CONSTANT: WIDTH_BYTEENA_B NUMERIC "1"
    -- Retrieval info: CONSTANT: WRCONTROL_ACLR_A STRING "NONE"
    -- Retrieval info: CONSTANT: WRCONTROL_ACLR_B STRING "NONE"
    -- Retrieval info: CONSTANT: WRCONTROL_WRADDRESS_REG_B STRING "CLOCK0"
    -- Retrieval info: USED_PORT: address_a 0 0 9 0 INPUT NODEFVAL address_a[8..0]
    -- Retrieval info: USED_PORT: address_b 0 0 9 0 INPUT NODEFVAL address_b[8..0]
    -- Retrieval info: USED_PORT: clock 0 0 0 0 INPUT VCC clock
    -- Retrieval info: USED_PORT: data_a 0 0 8 0 INPUT NODEFVAL data_a[7..0]
    -- Retrieval info: USED_PORT: data_b 0 0 8 0 INPUT NODEFVAL data_b[7..0]
    -- Retrieval info: USED_PORT: q_a 0 0 8 0 OUTPUT NODEFVAL q_a[7..0]
    -- Retrieval info: USED_PORT: q_b 0 0 8 0 OUTPUT NODEFVAL q_b[7..0]
    -- Retrieval info: USED_PORT: wren_a 0 0 0 0 INPUT GND wren_a
    -- Retrieval info: USED_PORT: wren_b 0 0 0 0 INPUT GND wren_b
    -- Retrieval info: CONNECT: @data_a 0 0 8 0 data_a 0 0 8 0
    -- Retrieval info: CONNECT:     @Wren_a 0 0 0 0 wren_a 0 0 0 0
    -- Retrieval info: CONNECT: q_a 0 0 8 0 @q_a 0 0 8 0
    -- Retrieval info: CONNECT: q_b 0 0 8 0 @q_b 0 0 8 0
    -- Retrieval info: CONNECT: @address_a 0 0 9 0 address_a 0 0 9 0
    -- Retrieval info: CONNECT: @data_b 0 0 8 0 data_b 0 0 8 0
    -- Retrieval info: CONNECT: @address_b 0 0 9 0 address_b 0 0 9 0
    -- Retrieval info: CONNECT:     @Wren_b 0 0 0 0 wren_b 0 0 0 0
    -- Retrieval info: CONNECT: @clock0 0 0 0 0 clock 0 0 0 0
    -- Retrieval info: LIBRARY: altera_mf altera_mf.altera_mf_components.all
    -- Retrieval info: GEN_FILE: TYPE_NORMAL vdp_ext_colinfo.vhd TRUE
    -- Retrieval info: GEN_FILE: TYPE_NORMAL vdp_ext_colinfo.inc FALSE
    -- Retrieval info: GEN_FILE: TYPE_NORMAL vdp_ext_colinfo.cmp TRUE
    -- Retrieval info: GEN_FILE: TYPE_NORMAL vdp_ext_colinfo.bsf FALSE
    -- Retrieval info: GEN_FILE: TYPE_NORMAL vdp_ext_colinfo_inst.vhd FALSE
    -- Retrieval info: GEN_FILE: TYPE_NORMAL vdp_ext_colinfo_waveforms.html TRUE
    -- Retrieval info: GEN_FILE: TYPE_NORMAL vdp_ext_colinfo_wave*.jpg FALSE
    -- Retrieval info: LIB_FILE: altera_mf
    [свернуть]



    Теперь в архитектурном теле меняем конкретизацию компонента с obj_ci : entity work.vdp_colinfo

    на obj_ci : entity work.vdp_ext_colinfo , соответствие портов не меняем.

    Вразделе описаний -- SPRITE ENGINE первой части -- PART 1 меняем объявление сигналов

    signal OBJ_COLINFO_D_A : std_logic_vector(6 downto 0);
    signal OBJ_COLINFO_D_B : std_logic_vector(6 downto 0);

    signal OBJ_COLINFO_Q_A : std_logic_vector(6 downto 0);
    signal OBJ_COLINFO_Q_B : std_logic_vector(6 downto 0);

    на


    signal OBJ_COLINFO_D_A : std_logic_vector(7 downto 0);
    signal OBJ_COLINFO_D_B : std_logic_vector(7 downto 0);

    signal OBJ_COLINFO_Q_A : std_logic_vector(7 downto 0);
    signal OBJ_COLINFO_Q_B : std_logic_vector(7 downto 0);

    Этими действиями мы расширили размер ячейки буфера строки спрайтового слоя OBJ_COLINFO до 8 бит.
    Теперь можно переписать необходимую ветвь оператора case PIXDIV is в разделе реализации -- PIXEL COUNTER AND OUTPUT на

    when "0011" =>
    if OBJ_COLINFO_Q_B(3 downto 0) /= "0000" and OBJ_COLINFO_Q_B(6) = '1' then
    case PBS_MODE is
    when "00" =>
    T_COLOR <= CRAM( CONV_INTEGER('0' & OBJ_COLINFO_Q_B(5 downto 0)) );
    when "01" =>
    T_COLOR <= CRAM( CONV_INTEGER(OBJ_COLINFO_Q_B(7) & OBJ_COLINFO_Q_B(5 downto 0)) );
    when "10" =>
    T_COLOR <= CRAM( CONV_INTEGER(not (OBJ_COLINFO_Q_B(7)) & OBJ_COLINFO_Q_B(5 downto 0)) );
    when "11" =>
    T_COLOR <= CRAM( CONV_INTEGER('1' & OBJ_COLINFO_Q_B(5 downto 0)) );
    when others => null;
    end case;
    elsif BGA_COLINFO_Q_B(3 downto 0) /= "0000" and BGA_COLINFO_Q_B(6) = '1' then
    T_COLOR <= CRAM( CONV_INTEGER('0'& BGA_COLINFO_Q_B(5 downto 0)) );
    elsif BGB_COLINFO_Q_B(3 downto 0) /= "0000" and BGB_COLINFO_Q_B(6) = '1' then
    T_COLOR <= CRAM( CONV_INTEGER('0'& BGB_COLINFO_Q_B(5 downto 0)) );
    elsif OBJ_COLINFO_Q_B(3 downto 0) /= "0000" then
    case PBS_MODE is
    when "00" =>
    T_COLOR <= CRAM( CONV_INTEGER('0' & OBJ_COLINFO_Q_B(5 downto 0)) );
    when "01" =>
    T_COLOR <= CRAM( CONV_INTEGER(OBJ_COLINFO_Q_B(7) & OBJ_COLINFO_Q_B(5 downto 0)) );
    when "10" =>
    T_COLOR <= CRAM( CONV_INTEGER(not (OBJ_COLINFO_Q_B(7)) & OBJ_COLINFO_Q_B(5 downto 0)) );
    when "11" =>
    T_COLOR <= CRAM( CONV_INTEGER('1' & OBJ_COLINFO_Q_B(5 downto 0)) );
    when others => null;
    end case;
    elsif BGA_COLINFO_Q_B(3 downto 0) /= "0000" then
    T_COLOR <= CRAM( CONV_INTEGER('0'& BGA_COLINFO_Q_B(5 downto 0)) );
    elsif BGB_COLINFO_Q_B(3 downto 0) /= "0000" then
    T_COLOR <= CRAM( CONV_INTEGER('0'& BGB_COLINFO_Q_B(5 downto 0)) );
    else
    T_COLOR <= CRAM( CONV_INTEGER('0'& BGCOL) );
    end if;

    Что соответствует приближенной к коду схеме:



    В тех источниках информации о пикселях( BGA_COLINFO, BGB_COLINFO, BGCOL) у которых размерность выходных данных на входе в каналы мультиплексора меньше 7 бит, дополняем старшим нулевым разрядом до 7 бит.
    Последний раз редактировалось Smalovsky; 09.08.2025 в 16:24.
    ¡Un momento, señor fiscal!


Страница 1 из 3 123 ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. Опрос: WiFi для ZX клонов не на FPGA
    от izzx в разделе Несортированное железо
    Ответов: 253
    Последнее: 26.10.2025, 10:35
  2. Pano Logic G2 - убийца клонов на FPGA.
    от occamlab в разделе Клоны на ПЛИС, МК и БМК
    Ответов: 27
    Последнее: 27.11.2020, 11:30
  3. Производство клонов ZX Spectrum
    от andykarpov в разделе Новости
    Ответов: 129
    Последнее: 26.04.2017, 18:56
  4. Логотипы клонов Спектрума
    от CodeMaster в разделе Разный софт
    Ответов: 10
    Последнее: 07.09.2010, 23:09
  5. О совместимости клонов с играми
    от ILoveSpeccy в разделе Несортированное железо
    Ответов: 1
    Последнее: 13.03.2008, 18:26

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •