2015-12-08 2 views
1

Я планирую создать MIPS-подобный процессор в VHDL на FPGA. Процессор будет иметь классический пятиступенчатый конвейер без пересылки и предотвращения опасности. В курсе компьютерной архитектуры я узнал, что первые MIPS-процессоры, используемые для чтения из файла регистров на восходящем фронте тактовой частоты и записи на фронте падения часов. FPGA, который я использую, не поддерживает использование нарастающего и падающего фронта часов в то же время (относительно чтения и записи в регистры), поэтому я не могу точно сделать то же самое, что и оригинальный MIPS, и должен сделать все это при увеличении фронта часов ,Одновременное чтение и запись в регистры

Итак, вот часть, в которой у меня возникла проблема. Инструкция записывает обратно в регистр на этапе записи. Этап обратной записи отправляет данные непосредственно на этап декодирования. Другая инструкция на этапе декодирования хочет прочитать тот же регистр, который также хочет записать сцена обратной записи.

Что происходит в этом случае? Получает ли этап декодирования новое значение для инструкции или старое значение, которое все еще находится в файле регистров?

+2

«Большинство ПЛИС не поддерживают падение фронта часов» ... какая любопытная идея, где вы ее читали? то, что они не поддерживают, синхронизирует один и тот же регистр на обоих краях тактовых импульсов (и исключения, как правило, блоки ввода/вывода) ... Однако чтение и запись на одном и том же фронте так же хороши, поскольку данные чтения и записи являются отдельными сигналы. Если вы переместите те регистры в BlockRam, обязательно прочитайте его данные относительно одновременного чтения и записи (обычно на отдельных портах). –

+0

Вы правы. В этом вопросе руководство пользователя для платы было не таким ясным. FPGA поддерживает задний фронт, но не использует оба края одновременно. – fsasm

+0

Я думаю, что если вы прочитаете старое значение, вам понадобится еще один цикл перенаправления результатов (чтение нового значения обеспечивает пересылку через файл регистра). –

ответ

0

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

0

Вопрос: что вы понимаете под термином «зарегистрироваться». Или, более конкретно, как вы хотите сопоставить банк регистров с ПЛИС.

Самый простой, но не очень эффективный способ - сопоставить каждый регистр MIPS с несколькими триггерами в соответствии с размером регистра. Вы можете обновлять эти триггеры только на краю часов (например, на заднем фронте). После этого вы можете прочитать новое содержимое в любое время, также известное как асинхронное чтение. Это решение не так эффективно, потому что мультиплексор для выбора одного регистра MIPS из банка регистров требует много логических ресурсов.

Если у вас есть ПЛИС, где LUT могут использоваться как распределенная память, тогда почти все логические ресурсы для мультиплексоров могут быть сохранены. Распределенная память обычно также обеспечивает асинхронное чтение (и синхронная запись). Пожалуйста, прочитайте документацию вендера инструмента синтеза о том, как описать этот тип памяти для синтеза.

И последнее, но не менее важное: вы можете отобразить полный банк регистров в память блока на кристалле. Они обычно обеспечивают только синхронное считывание, то есть считывание начинается с краю синхронизации. (Конечно, они также обеспечивают только синхронную запись). Однако это, как правило, двухпортовые ОЗУ. Таким образом, вы можете писать на заднем фронте на одном порту и читать с ростом на другом порту. Прочтите, документация вашей FPGA о сроках записи. Например, на некоторых ПЛИС Altera запись задерживается на следующий противоположный фронт (здесь передний фронт) часов.