С любовью к вам, Yandex.Direct
Размещение рекламы на форуме способствует его дальнейшему развитию
Тогда тебе надо не на HDL писать, а использовать схемный ввод, из кубиков серии 74xxx. Потому что при таком подходе как сейчас ты и возможности HDL/FPGA не используешь нормально, а потом когда это все на логику будешь раскладывать - там свои проблемы вылезут. В итоге это все может отравить тебе фан, имхо.
Сейчас добиваюсь хоть какой-то работы от модели, потом да, буду в "кубики" модель переделывать.
Рисовать схему сразу в HDL'я - это изврат, который выйдет боком.
- - - Добавлено - - -
Тогда только TechMap. В RTL'е всё упрощено - те же сравнения так и записаны - блок Equal и 2 оператора на входе для сравнения:
"Байт-48"
О чем и речь. Жду техмап. Он, кстати, зависим от конкретной FPGA.
Это да. В альтерах там просто куча LOGIC_CELL_COMB'ов =/ Зачастую каждый разбит на куски, раскиданные по "схеме". И внутри ещё хрен пойми какая логика - тяжело её вкуривать вообще =/ Приходится каждый элемент на бумажке расписывать.
Это может ещё от неопытности просто - это ведь мой первый проект на FPGA, lol До этого не в счёт - баловство в виде написания светофора и прочего, без вникания в суть работы.
"Байт-48"
Итак, сегодня весь день "убил" на перевод схемы на однопортовую память, и оно даже заработало. Правда, при частоте процессора 2,5МГц пока что имеются проблемы, но начиная с 3,125МГц (25МГц/8) всё идеально работает. Буду бороться за сокращение переднего фронта сигнала DSYN - он-то и препятствует обращению к памяти...
- - - Добавлено - - -
Итак, решение пока не самое лучшее, но оно работает 100%:
То есть мы по DSYN мультиплексируем шину адреса памяти, а для арбитража данных задерживаем DSYN на 4 такта (25МГц). Если не делать доп. сигнал с задержкой, то бывают ситуации, когда фронт чтения в буфер приходится на спад DSYN и память естественно ещё не успевает считать данные.Код:process (h_cnt(0)) begin if (rising_edge(h_cnt(0))) then dsyn_delayed <= dsyn; end if; end process; mem_to_vbuf <= h_cnt(1) and (not (dsyn or dsyn_delayed)); process (mem_to_vbuf) begin if (rising_edge(mem_to_vbuf)) then vdata <= mem_data1 & mem_data0; end if; end process; mem_addr <= vaddr when (dsyn = '0') else addr;
Позже запаяю на макетке подручную SRAM'ку и протестирую без этой задержки с изменением кода на защёлку:
Код:process (mem_to_vbuf) begin if (mem_to_vbuf = '1') then vdata <= mem_data1 & mem_data0; end if; end process;
"Байт-48"
Сделал формирователь тактовых импульсов из частоты 25МГц. Выходные частоты - 2.5МГц, 5МГц, 10МГц.
Для теста снял все варианты анализатором, частота семплирования - 50МГц.
10МГц: реализовывал как счётчик до 5, но с генерацией импульсов в 0-ой и 2-ой фазах -
5МГц: счётчик до 5, генерация в 0-ой фазе -
2.5МГц: счётчик до 10, генерация в 0-ой фазе -
На частоте 2.5МГц надо задерживать передний фронт DSYN, пока не придумал как. Иначе на изображении постоянные черные полоски бегают из-за конфликта доступа.
Завтра ещё сперва оптимизирую формирование тактов, потом займусь DSYN...
Из минусов текущего решения - необходимы 2 раздельных счётчика после кварца для формирования сигналов для видео и для CPU. Но есть сдвоенные на подходящие частоты, можно попробовать.
"Байт-48"
Итак, сделал переключаемую тактовую 2.5/5/10МГц, а так же перевёл память на однопортовую. Пока что реализовано сильно "в лоб", но оно работает надёжно.
Так же пришлось ввести аналог сигнала CAS, по которому пишется положительный фронт DSYN, благодаря чему убрана цепочка задержки этого сигнала (из кода не убрал, но оно не используется уже).
"Байт-48"
Набросал формирователь видеосигналов из "кубиков" логики.
В качестве счётчиков использовал ИЕ19 (74393), имеются некоторые погрешности в синхросигналах (ровно на 1 такт, для упрощения логики).
Логику пока не упрощал, займусь этим только после стабильной работы с остальным компьютером.
21mux - в железе будет в виде джамперов.
"Байт-48"
Нипанятна. Есть оригинал?
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)