Важная информация

User Tag List

Страница 9 из 67 ПерваяПервая ... 5678910111213 ... ПоследняяПоследняя
Показано с 81 по 90 из 661

Тема: Еще один Орион на ПЛИС

  1. #81
    Moderator
    Регистрация
    14.08.2006
    Адрес
    Владимир
    Сообщений
    4,577
    Спасибо Благодарностей отдано 
    61
    Спасибо Благодарностей получено 
    106
    Поблагодарили
    92 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от andreil Посмотреть сообщение
    Появились вопросы по организации памяти и тактированию процессора:
    1) Какие тактовые частоты валидны? 2,5МГц базово, 5МГц, 10МГц - вроде бы всё? (Включая схемы с Z80, ест.);
    2) Какой объём памяти достаточен для 99% программ на Орионе? 256Кб или 512Кб? Просто думаю, как организовывать память, с учётом двухпортового банка для арбитража видеопамяти - однопортовая на таких частотах пиксельклока (25Мгц) уже не справляется, из-за циклов четния/записи процессора будет теряться до 2-х пакетов с пикселями (то есть 8 или 16 пикселей).
    2,5МГц , 5МГц, 10МГц в принципе достаточно.

    Ставить можно две ОЗУ для двух плоскостей, а там уж у кого какие есть - варианты от 2х64к (128кб) до 2х512кб (1024), просто развести два места по 32 ноги. Ну или промежуточные типа 128+512.
    Лучше сделать и жалеть, чем не сделать и жалеть.

    Некоторые из моих поделок тут: https://github.com/serge-404

  2. #82
    Master Аватар для andreil
    Регистрация
    20.06.2005
    Адрес
    Светлогорск
    Сообщений
    885
    Спасибо Благодарностей отдано 
    9
    Спасибо Благодарностей получено 
    23
    Поблагодарили
    20 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Error404 Посмотреть сообщение
    Ставить можно две ОЗУ для двух плоскостей, а там уж у кого какие есть - варианты от 2х64к (128кб) до 2х512кб (1024), просто развести два места по 32 ноги. Ну или промежуточные типа 128+512.
    Тут ограничение в том, что двухпортовая SRAM на 5В в нашем случае ограничена объемами 64Кх8, 64Кх16 и 128Кх8, от чего и следует "плясать" с лимитом памяти.
    "Байт-48"

  3. #83
    Moderator
    Регистрация
    14.08.2006
    Адрес
    Владимир
    Сообщений
    4,577
    Спасибо Благодарностей отдано 
    61
    Спасибо Благодарностей получено 
    106
    Поблагодарили
    92 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от andreil Посмотреть сообщение
    двухпортовая
    Лучше сделать и жалеть, чем не сделать и жалеть.

    Некоторые из моих поделок тут: https://github.com/serge-404

  4. #84
    Guru Аватар для HardWareMan
    Регистрация
    26.02.2011
    Адрес
    г. Павлодар, Казахстан
    Сообщений
    4,404
    Спасибо Благодарностей отдано 
    319
    Спасибо Благодарностей получено 
    598
    Поблагодарили
    444 сообщений
    Mentioned
    10 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от andreil Посмотреть сообщение
    ведь условия вида `elsif (((h_cnt = 10D"392") and (h480en = '0')) or ((h_cnt = 10D"488") and (h480en = '1'))) then` в железо воплотить будет очень дорого по корпусам "рассыпухи"
    Вот у современных "железостроителей" мозги совсем жиром заплыли. Зачем делать сравниватель (между прочим == а не =), когда можно побитное умножение? Занимает 1 ячейку максимум.

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

    Цитата Сообщение от Error404 Посмотреть сообщение
    И не говори! НИ-КО-МУ!

  5. #85
    Master Аватар для andreil
    Регистрация
    20.06.2005
    Адрес
    Светлогорск
    Сообщений
    885
    Спасибо Благодарностей отдано 
    9
    Спасибо Благодарностей получено 
    23
    Поблагодарили
    20 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от HardWareMan Посмотреть сообщение
    (между прочим == а не =)
    Это справедливо только в Verilog'е, а я пишу на VHDL, где оператор сравнения - именно "=".
    А по поводу двухпортовости - иначе при обращении процессора к памяти будут "выпадать" 1-2 столбца по 8 пикселей на таких частотах.

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

    Цитата Сообщение от HardWareMan Посмотреть сообщение
    Вот у современных "железостроителей" мозги совсем жиром заплыли.
    Вот честно - я больше программист, чем разработчик железа. Последнее является только хобби, да и опыта ещё маловато, так что подобные ляпы пока буду допускать.

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

    По поводу памяти, вот картинка.
    Красными прямоугольниками выделил вывод столбца из 8 пикселей, то есть 1 байта из памяти.
    Если организовывать на стандартной памяти, то для устранения проблем следует организовывать буфер минимум для 2-х байт (4-х, если точнее, поскольку 2 плоскости), в которых будут храниться промежуточные значения - по адресам N+1 и N+2, а N+0 уже выводится на экран. В оригинальном Орионе частота вывода изображения значительно меньше, поэтому хватило одного буфера - для значений N+1.
    Подумать над такой схемой вполне возможно, что бы использовать стандартную SRAM, чем скорее всего и займусь после оптимизации формирования видеосигналов.

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

    Сейчас вот посмотрел на длительности сигналов процессора WR и RD в модели - оба занимают "в ширину" ровно 6 пикселей вывода.
    При частоте тактирования всего (и памяти) в 25МГц получается, что на чтение видеоданных у нас максимум 80нс. Для большинства типов памяти хватит, конечно же. Но это справедливо только для ВМ80А - я не в курсе временных диаграмм этих сигналов у Z80.
    Вот картинки с анализатора:
    Чтение - Запись -
    Второй ряд - Ф2, третий - Ф2.
    То есть у нас, грубо говоря, в наихудшем случае около 40нс на цикл чтения байта из памяти.
    Если не успеть прочитать байт - 8 пикселей "выпадут" из картинки.

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

    Vslav, ты у нас более знаком с циклами ВМ80А - как можно их "обрезать" на графиках выше? В моей логике пока что используются "сырые" сигналы с процессора, то есть обращение к памяти формируется как "cpu_rd or cpu_wr".
    Из того, что я вижу - можно делать сигнал обращения к памяти как "cpu_F2 and (cpu_rd or cpu_wr)", с защелкиванием данных на выходном буффере при чтении.
    Последний раз редактировалось andreil; 06.02.2018 в 19:26.
    "Байт-48"

  6. #86
    Guru Аватар для Vslav
    Регистрация
    31.03.2013
    Адрес
    г. Киев
    Сообщений
    2,413
    Спасибо Благодарностей отдано 
    132
    Спасибо Благодарностей получено 
    755
    Поблагодарили
    353 сообщений
    Mentioned
    86 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от andreil Посмотреть сообщение
    Vslav, ты у нас более знаком с циклами ВМ80А - как можно их "обрезать" на графиках выше?
    Похоже у тебя F1/F2 взяты с ножек pin_F1/F2, а они внутри обертки еще защелкиваются, то есть реально задержаны на такт. Если у тебя F1/F2 формируются внутри ПЛИС и синхронизированы с clk что на ядро подается, то защелки можно убрать.

    А обрезать - уменьшить простой после F2, тогда быстрее молотить будет, сейчас частота делится на 6, потому что у тебя после F2 пауза в фазах есть - не подана ни одна из F1/F2.

  7. #87
    Master Аватар для andreil
    Регистрация
    20.06.2005
    Адрес
    Светлогорск
    Сообщений
    885
    Спасибо Благодарностей отдано 
    9
    Спасибо Благодарностей получено 
    23
    Поблагодарили
    20 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Vslav Посмотреть сообщение
    Похоже у тебя F1/F2 взяты с ножек pin_F1/F2, а они внутри обертки еще защелкиваются, то есть реально задержаны на такт. Если у тебя F1/F2 формируются внутри ПЛИС и синхронизированы с clk что на ядро подается, то защелки можно убрать.

    А обрезать - уменьшить простой после F2, тогда быстрее молотить будет, сейчас частота делится на 6, потому что у тебя после F2 пауза в фазах есть - не подана ни одна из F1/F2.
    Паузы - это для задания тактовой частоты, она сейчас 2,5МГц. Я же делаю модель компа, а не тестовой числодробилки, мне нужно блюсти частоты Хотя тут я с делителем накосячил - надо было делить на 5, а не на 6 =/
    Корка затактирована на 25МГц, Ф1 и Ф2 - 2,5МГц на картинках.
    Ф1 = orion_cpu:cpu|vm80a:cpu|pin_f1, то есть сигнал с ножки, а не с ядра. Как вижу, это до защелки ещё.

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

    Вот, исправил счётчик для формирования тактов:

    Уже минимум 2 такта на чтение видео-данных, неплохо
    То есть при неактивных RD и WR по фронту F1 выставляем адрес для чтения, по фронту F2 помещаем данные в буфер.
    "Байт-48"

  8. #88
    Master
    Регистрация
    24.05.2005
    Адрес
    г. Запорожье, Украина
    Сообщений
    992
    Спасибо Благодарностей отдано 
    571
    Спасибо Благодарностей получено 
    364
    Поблагодарили
    239 сообщений
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от HardWareMan Посмотреть сообщение
    Вот у современных "железостроителей" мозги совсем жиром заплыли.
    там же оптимизатор сам вроде сделает побитовое ? да и код читать удобнее всё таки.

  9. #89
    Guru Аватар для Vslav
    Регистрация
    31.03.2013
    Адрес
    г. Киев
    Сообщений
    2,413
    Спасибо Благодарностей отдано 
    132
    Спасибо Благодарностей получено 
    755
    Поблагодарили
    353 сообщений
    Mentioned
    86 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от andreil Посмотреть сообщение
    Паузы - это для задания тактовой частоты, она сейчас 2,5МГц.
    Если хочешь использовать старую корку vm80a, то попробуй паузы сделать через HOLD.
    Новая корка vm80_wb содержит встроенный клок-модератор, имеет отдельный вход vm_cena. На него надо подавать импульсы высокого уровня в зависимости от желаемой эмулируемой частоты ядра, при этом ввод-вывод на шине от него не зависит. Например, затактируешь корку от 25МГц, если на vm_cena постоянно высокий то корка работает на 25МГц, если туда подавать единичку только каждый 10-ый такт - получишь 2.5МГц, каждый 5-ый такт - 5МГц. Можно получить и 10 МГц, подавая частоту на 2 такта каждые 5, или реализовать фазовый аккумулятор для генерации vm_cena. И vm_cena лучше регистром фиксировать, для устойчивости.

    PS. Кстати, в новой корке я зря рестарт по прерыванию в halt выбросил, оказывается нужная штука, halt используется и прерывание из него выводит оказ. Совсем забыл, исправлю сейчас.

  10. #90
    Master Аватар для andreil
    Регистрация
    20.06.2005
    Адрес
    Светлогорск
    Сообщений
    885
    Спасибо Благодарностей отдано 
    9
    Спасибо Благодарностей получено 
    23
    Поблагодарили
    20 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Vslav Посмотреть сообщение
    Если хочешь использовать старую корку vm80a, то попробуй паузы сделать через HOLD.
    Новая корка vm80_wb содержит встроенный клок-модератор, имеет отдельный вход vm_cena. На него надо подавать импульсы высокого уровня в зависимости от желаемой эмулируемой частоты ядра, при этом ввод-вывод на шине от него не зависит. Например, затактируешь корку от 25МГц, если на vm_cena постоянно высокий то корка работает на 25МГц, если туда подавать единичку только каждый 10-ый такт - получишь 2.5МГц, каждый 5-ый такт - 5МГц. Можно получить и 10 МГц, подавая частоту на 2 такта каждые 5, или реализовать фазовый аккумулятор для генерации vm_cena. И vm_cena лучше регистром фиксировать, для устойчивости.
    Не, я на старой корке делаю, для новой надо делать "прослойку", поскольку сигналы чутка другие и шина данных у меня полностью двунаправленная.
    У меня там не паузы, а сигналы со счётчика Вход 25МГц, выход - 2,5МГц. Делаю специально так, что бы потом "в железе" схему составить без проблем для генерации тактов.
    Код:
    clk_F		<= (not cnt_clk(1)) and (not cnt_clk(2));clk_F1	<= clk_F and (not cnt_clk(0));
    clk_F2	<= clk_F and cnt_clk(0);
    	process (clk)
    	begin
    		if (rising_edge(clk)) then
    			if (cnt_clk = 3D"4") then
    				cnt_clk <= (others => '0');
    			else
    				cnt_clk <= cnt_clk + '1';
    			end if;
    		end if;
    	end process;
    - - - Добавлено - - -

    Цитата Сообщение от shurik-ua Посмотреть сообщение
    там же оптимизатор сам вроде сделает побитовое ? да и код читать удобнее всё таки.
    Внутри ПЛИС - да. Но для воплощения "в железе" приходится всё сравнивать выборочно побитово, иначе плата раздуется на много-много корпусов для полноценного сравнения.

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

    Глянул ДШ на Z80 - там примерно та же схема по циклам.
    В итоге попробую завтра организовать работу с 1-портовой памятью.
    Сигнал обращения к памяти будет формироваться как "F2 and (cpu_rd or cpu_wr)".
    Для растягивания чтения добавится защёлка на памяти (сейчас её нет).
    ША памяти будет переключаться на адреса видео при условии "F1 or F2".
    Копирование видео-данных в буфер (DD47, DD48 в оригинальном Орионе) будет происходить по положительному фронту F2.
    В итоге на чтение видео-данных отводится 40нс на любой частоте тактирования (2.5, 5, 10).

    PS: Расписал больше для себя, что бы не забыть потом. Но может я где-то ошибся в своих рассуждениях...
    "Байт-48"

Страница 9 из 67 ПерваяПервая ... 5678910111213 ... ПоследняяПоследняя

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

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

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

Похожие темы

  1. Эмулятор ZX-Poly
    от Raydac в разделе Эмуляторы
    Ответов: 106
    Последнее: 24.01.2024, 11:52
  2. ОРИОН-2010 на ПЛИС.
    от Ewgeny7 в разделе Орион
    Ответов: 447
    Последнее: 23.11.2016, 12:27
  3. Еще один Ленинград 48
    от Ewgeny7 в разделе Ленинград
    Ответов: 0
    Последнее: 16.10.2007, 22:31
  4. Ещё один Д.Р.
    от GNTB в разделе Поздравления
    Ответов: 4
    Последнее: 19.07.2006, 01:52
  5. Ещё один подраздел
    от CityAceE в разделе Форум
    Ответов: 2
    Последнее: 22.05.2005, 11:57

Ваши права

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