Как реализовать ввод-вывод с отображением памяти

Я описываю систему на VHDL. Эта система уже содержит процессор, контроллер DDR SDRAM и контроллер VGA. VGA считывает пиксели из SDRAM (уже проверено и проверено в FPGA).

Хотя VGA и SDRAM уже взаимодействуют друг с другом, мне еще нужно реализовать связь между процессором и SDRAM. В конце концов, я намереваюсь получить процессор, который использует фреймбуфер, хранящийся в SDRAM. Затем происходит перелистывание страницы, и VGA начинает получать новое изображение, которое было нарисовано процессором.

Чтобы указать VGA для получения из нового местоположения, я хотел бы сообщить контроллеру VGA (используя отображение памяти io) новый адрес нового изображения. Простая стратегия, которую я использовал, заключалась в том, чтобы поставить мультиплексор и проверить, попадает ли диапазон адресов в регистры контроллера VGA или в диапазон адресов кеша. Кроме того, нужно ли мне заботиться о разных доменах часов? Если да, то о каких возможных проблемах мне следует беспокоиться?

Например, когда-то в прошлом я видел код от x86, который записывает (используя инструкцию outb), а следующая инструкция была inb в то же и/или связанное место. В этом случае мне нужно будет изменить логику процессора, чтобы он останавливался на таких операциях? Если да, то сколько случаев реализовать? Сколько интерфейсов нужно заботиться?

Кроме того, при загрузке, как используется кеш, если все записи недействительны? Я полагаю, что есть образ ПЗУ с кодом запуска. Может ли также существовать временное локальное ОЗУ для записей, сделанных кодом, хранящимся в ПЗУ (программные инструкции)?

Резюме: мне нужна информация о том, как реализовать схему иерархии памяти: кеши, ввод-вывод с отображением памяти, TLB, виртуальная память и т. д. И как все это взаимодействует друг с другом. Например, я знаю, как реализовать кэши и TLB. Но я не уверен, как соединить их вместе. Я мог бы просто использовать что-то, что работает (например, идея с мультиплексором). Но я хочу следовать конструкциям, которые зарекомендовали себя в промышленности.

Что я уже изучил: - как запускать mips - компьютерную архитектуру (Паттерсон) - руководства MIPS - руководства ARM - руководства Intel

Но подробно никто не объясняет.

Если есть много способов реализации, просто покажите мне тот, который вы знаете, пожалуйста. Даже если это исходный код или блок-схема. Опять же, мне не нужно объяснять, как это работает внутри. Мне просто нужно знать интерфейсы между модулями.

Спасибо вам всем

Жаль, что этот вопрос не привлек внимания. Не могли бы вы немного уточнить? Поделитесь своим кодом? Бетонные интерфейсы?
Конечно! Вот интерфейс sdram: ссылка . Это простой интерфейс с поддержкой трех клиентов. Первый клиент (client0) имеет приоритет над остальными. Остальные выбираются по круговой системе. Клиентам нужно только указать начальный адрес, количество байтов для чтения или записи и буфер, в который контроллер sdram извлекает или записывает.
@Dzarda, вот интерфейс VGA: vga . Он подключен как client0 в sdram, поэтому чтение в VGA является приоритетным.
Вот интерфейс процессора: процессор . Процессор - это VLIW 2-го выпуска (мой проект, с пользовательским набором инструкций). Хотя имена отображаются как dcache и icache, он подключен только к некоторым блочным ОЗУ, подключенным для проверки в FPGA.
Очень интересно. Хотите ответить на свой вопрос, так как прошло 11 месяцев?

Ответы (2)

Вот ссылка на краткое объяснение того, как ввод-вывод с отображением памяти работает в компьютерной системе старого стиля. Возможно, это ответит на несколько ваших вопросов:

http://www.cs.umd.edu/class/sum2003/cmsc311/Notes/IO/mapped.html

За все это время я не нашел ничего подробного о предмете. Я решил просто написать код, который будет работать, и забыть о том, как работает индустрия. Это было после прочтения некоторой документации по проекту шины Wishbone, в которой говорится, что в FPGA используется куча мультиплексоров для создания маршрутов между модулями.

Мой совет тем, кто пробует что-то подобное в FPGA: просто сделайте что-нибудь, что сработает. Я могу ошибаться, но подробной информации о том, как это сделать, просто нет.

Прежде всего, я принял свою реальность: я парень с ПЛИС, обычно ограниченный тактовой частотой 50 МГц. Я также не проектирую систему для взаимодействия с материнской платой, PCI или чем-то еще. Это простая SoC, и все физические интерфейсы, которые мне нужны (клавиатура, мышь, VGA, SDRAM и т. д.), готовы для использования посредством назначения контактов (конечно, мне еще нужно реализовать логику на VHDL).

Другими словами: мне просто нужно позаботиться о VHDL, потому что физический материал уже сделан ребятами из Altera/Xilinx/YourVendorHere.

Кратко объясню, как я это сделал:

  • Я не реализовал автобус. Сначала я хотел использовать автобус, потому что в целом так и делается. Но правда в том, что шина полезна только в том случае, если вы собираетесь подключать модули, а это не мой случай (пожалуйста, поправьте меня, если я ошибаюсь). Так что в итоге я просто использовал кучу мультиплексоров для сопоставления адресов.

  • Для регистров состояния/управления/данных в модулях я решил использовать простой «протокол», который можно представить как рукопожатие/опрос: в цикле я продолжаю читать регистр, пока он не предоставит ожидаемое значение, затем я выполняю операцию. Я хочу.

  • Я понятия не имею, как ребята из ARM и Intel делают свое дело, но здесь я просто добавил ПЗУ и ОЗУ (оба блочные) для кода начальной загрузки. Это просто и это работает.

  • Интерфейс между процессором и cache/tlb/mmu следующий: cache, tlb и mmu сами по себе не действуют. Если есть промах, процессор должен дать им указание получить необходимые данные.

Там столько деталей, что я не знаю, что следует объяснять, а что нет. Если кому-то из вас нужна подробная информация о том, как я это делал, просто напишите мне: hdhzero@gmail.com. Я буду рад сообщить что-нибудь здесь, в стеке, или в моей электронной почте.

Я также оставлю здесь несколько ссылок, которые мне помогли: http://www.st.ewi.tudelft.nl/~gemund/Publications/michel_bsc.pdf http://amir-shenodua.blogspot.com.br/2012/ 06/простое-управление-памятью-с-vhdl.html

Я также рекомендую следующую книгу, в которой есть несколько глав, описывающих, как можно связать процессор с модулями ввода-вывода: http://www.amazon.com/FPGA-Prototyping-VHDL-Examples-Spartan-3/dp/0470185317 .