Вообще-то 177406 - регистр счетчика слов. Командный регистр (CSR) - 177404.
В смысле - содержимое памяти по адресу 0 не меняется? Или меняется, но первым словом не 000240?
- - - Добавлено - - -
А, ну понятно. Вот так всегда бывает, когда несколько параллельных веток обсуждения идут.
Насчет SD-карты - действительно, для каждого контроллера надо вычилсять свой start_offset. Наверное, нужно было завести одну отдельную шину для сборки старшей части адреса всех контроллеров. Как-то не подумал...
Ну, моя идея была в том, что смещение задается через порт start_offset каждого контроллера без модификации самих контроллеров, и уж тем более модулей sdspi.
Но, конечно, я поленился вынести из sdspi полную шину адреса, хотел сэкономить малость - вынес только 23 бита. Думал, этого вполне достаточно, все-таки 4 гига, куда уж больше.
Получается, надо выносить все 32 бита. В следующем релизе так и сделаю.
Завершена половинка следующего этапа проекта - графический контроллер КГД.
Контроллер использует режим SVGA 800*600*75 Гц, и картинка в режиме удвоения пикселей ложится точно пиксель-в-пиксель по горизонтали, и с небольшим верхним темным полем по вертикали. Вот как примерно выглядит результирующее изображение:
графические часы
[свернуть]
игрушка LAND
[свернуть]
игрушка PIFPAF
[свернуть]
На вышеприведенных картинках немного обрезан левый край, но это следствие некорректной работы устройства видеозахвата - оно плохо дружит с квадратными режимами изображения. На мониторе все выглядит правильно.
Всю эту красоту портит тот факт, что в игрушки эти поиграть не получится. Слишком быстрая у нас получилась платформа. Например, в игрушке LAND каждая попытка завершается примерно за секунду. Поскольку игрушки - это чуть ли не наиболее частый вариант использования графического контроллера, эта проблема является серьезным ограничением. Как обычно в мире DEC, разработчики проявляют обычное разгильдяйство, и привязывают свои программы не к системному таймеру, а к тактам процессора.
Надо сделать возможность при необходимости притормозить систему. Сильно понижать тактовую частоту нельзя - начнутся проблемы с SDRAM. Я попробовал задержать обращения к регистрам КГД - добавил в схему задержку ответа REPLY на 32 такта. Стало чуть помедленнее, но все равно очень быстро. Надо думать дальше.
Создание КГД само по себе еще не является полноценным этапом развития проекта. Надо переделать терминальный модуль на разрешение 800*600, чтобы можно было совмещать текст и графику. Без этого, например, нельзя воспользоваться графическим вариантом бейсика. Точнее можно, но только если разнести текст и графику по разным мониторам. Поэтому я пока не внес КГД в основную ветку репозитория, а создал отдельную ветку graphics, в которую внес все текущие изменения. Если у кого есть желание, можете сами попробовать.
С любовью к вам, Yandex.Direct
Размещение рекламы на форуме способствует его дальнейшему развитию
В моем 1801вм2 проблема снижения частоты полностью решена. Доберусь до компа - расскажу
Итак, во все мои модели процессоров встроен "дульный компенсатор" - специальный блок позволяет имитировать работу ядра на низкой частоте, при этом внешняя шина Wishbone продолжает работать на общей (высокой) частоте SoC, позволяя периферии (например, SDRAM) не замедляться.
Там есть такие сигналы:
// - vm_clk_p - processor core positive clock, also feeds the wishbone buses
// - vm_clk_n - processor core negative clock, should be vm_clk_p 180 degree phase shifted
// - vm_clk_ena - slow clock simulation strobe, enables clock at vm_clk_p
// - vm_clk_slow - clock mode selector, enables clock slowdown simulation,
// the external I/O cycles is launched with rate of vm_clk_ena
vm_clk_p - позитивный клок процессорного ядра, сюда постоянно подается высокая частота (50-100MHz), и на ней работает системная шина (Wishbone)
vm_clk_n - негативный клок процессорного ядра, для внутренних нужд, просто инвертированный vm_clk_p (я предпочитаю снимать с PLL с фазой 180)
vm_clk_slow - это селектор режимов, если низкий уровень, то это "turbo", дульный компенсатор отключен, все блоки ничего не ждут, работа на максимальной частоте. Если уровень высокий, то включается специальный блок замедления. Есть специальный двунаправленный счетчик, он считает такты высокой частоты на сложение и низкой частоты (задается входом, описанным ниже) на вычитание, в момент когда ядро хочет выполнить ввод-вывод на шине - оно останавливается и счетчик перестает считать высокую частоты на сложение, работает ТОЛЬКО вычитание. По достижению счетчиком нуля - ядро разблокируется и выполнятся цикл ввода-вывода. Снаружи это выглядит так, как циклы эмитированы процессором, работающим на малой частоте. Сам ввод-вывод выполняется на полной скорости, не внося проблем в работу SoC.
vm_clk_ena - разрешение такта низкой частоты. Это не клок, это разрешение тактов. Например, мы хотим имитировать ВМ2 на 5МГц внутренней частоты (10 внешней). И основная тактовая SoC у нас 100MHz. На вход vm_clk_ena в течение 19 тактов высокой частоты 100MHz должен подаваться низкий уровень, и один такт высокий, скважность 1/19. Такой подход также позволяет имитировать любые частоты с использованием фазового аккумулятора (можно, например 5.33MHz или 99MHz). В моей репке cpu11 тестовые проекты поддерживают режим замедления, там есть переключатель, все тестировалось и проверялось.
Последний раз редактировалось Vslav; 23.01.2021 в 17:39.
forth32(23.01.2021)
Топ модуль
Код:set_location_assignment PIN_AB30 -to FB_Switches[0] set_location_assignment PIN_Y27 -to FB_Switches[1] set_location_assignment PIN_AB28 -to FB_Switches[2] set_location_assignment PIN_AC30 -to FB_Switches[3] set_location_assignment PIN_W25 -to FB_Switches[4] set_location_assignment PIN_V25 -to FB_Switches[5] set_location_assignment PIN_AC28 -to FB_Switches[6] set_location_assignment PIN_AD30 -to FB_Switches[7] set_location_assignment PIN_AC29 -to FB_Switches[8] set_location_assignment PIN_AA30 -to FB_Switches[9]s_SwitchesDeBouncedClocked - сигналы с подавленным дребезгом, снимаются с FB_Switches - 10 движковых переключателей на платеКод:constant sw_SlowClockMode : integer := 2; ... signal s_SwitchesDeBouncedClocked : std_logic_vector(9 downto 0); ... signal s_SlowClockMode : std_logic := s_SwitchesDeBouncedClocked(sw_SlowClockMode); ... s_Clk_Cpu <= s_Clk_100MHz when (s_SlowClockMode = Low) and (s_ManualClockOn = Low) else s_Clk_1Hz;
Подавление дребезга - это старая и давно решенная проблема, о ней даже неудобно говорить.
Вот тут есть модуль wbc_button, он с параметром, указывается сколько миллисекунд дребезга подавить.
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)