January 25th, 2013

Лабораторная работа 5: делаем процессор MIPS (5)

Предфинальный пост в серии Лабораторная работа 5: делаем процессор MIPS на Верилоге.

Итак, на прошлых лабах мы уже полностью сделали процессор с выбранным подмножеством архитектуры MIPS на Verilog - cсылки на предыдущие части лабы:

1. Определение архитектуры процессора, язык ассемблер: Лабораторная работа 5: делаем процессор MIPS (1)

Реализация на Verilog:
2. Ключевые модули - файл регистров, память данных, память инструкций, счетчик программы: Лабораторная работа 5: делаем процессор MIPS (2),
3. Шина данных и контроллер: Лабораторная работа 5: делаем процессор MIPS (3) и
4. Реализация команд ассемблера, ядро MIPS и модуль верхнего уровня: Лабораторная работа 5: делаем процессор MIPS (4)

Осталось провести его демонстрацию и тестовые испытания - для этого подключим базовые устройства ввода-вывода и запустим демонстрационные программы на ПЛИС.

6. Подключение устройств ввода-вывода и демо-запуск на ПЛИС

Для того, чтобы иметь возможность хоть каким-то образом убедиться в том, что процессор на Verilog действительно работает внутри ПЛИС и правильно выполняет загруженные туда программы, а также для того, чтобы иметь возможность интерактивно влиять на ход выподления этих программ, подключим к нашей плату ПЛИС несколько простых устройств ввода-вывода и определим интерфейсы взаимодействия с этими внешними устройствами в дизайн нашего процессора.

Как уже было заранее решено, в качестве устройства вывода используем уже знакомый любимый семисегментный диодный дисплей. Подключим к плате внешний дисплей к портам ввода-вывода общего назначения PIO. Всего для дисплея задействовано 8 портов (7 сегментов + 1 точка), т.е. 8мибитное двоичное число, направленное на эти порты, будет определять текущее значение, которое отображено на дисплее (каждый бит числа - один сегмент на дисплее) - далее будем называть его v (video memory - типа видео-память).

Для ввода данных будем использовать очевидно совершенно новый потрясающий способ ввода информации - рычажковый. На плате Digilent Basys2, на которой демонстрируются все примеры во всех лабораторных работах, изначально уже доступно 8 встроенных рычажков - будем использовать их. К другим платам, на которых таких рычажков нет, легко подключить внешние рычажки через те же порты ввода-вывода общего назначения.

Из 8ми доступных рычажков сделаем 2 устройства ввода:
- 4 рычага bs (button switch) - для ввода чисел в двоичной форме - каждый рычаг определяет один бит 1/0 в двоичном числе (4 рычага - 4 бита - максимальное число, которое можно ввести таким образом - 2^4=16 - для наших тестов будет вполне достаточно, но при желании можно подключить и дополнительные рычажки) - каждый рычаг является значени.
- один рычаг bsf (button switch flag): однобитный флаг 1/0 или вкл/выкл - его можно использовать, когда например потребуется подтвеждение некоторого действия (типа кнопки Enter на клавиатуре).

Технические подробности подключения рычажков и дисплея к плате ПЛИС можно вспомнить из материалов предыдущих лабораторных работ Лабораторная работа2: знакомство с платой ПЛИС (FPGA) - основы комбинаторной логики (1) (работа с рычажками) и Лабораторная работа2: знакомство с платой ПЛИС (FPGA) - основы комбинаторной логики (2) (подключение дисплея).



Collapse )

Устройства ввода-вывода подключены везде, где нужно. Выбираем нужный тест, генерируем прошивку и запускаем процессор с программой на ПЛИС. Подробные инструкции по геренации файла прошивки и запуску его на ПЛИС можно посмотреть в старой работе "Лабораторная работа2: знакомство с платой ПЛИС (FPGA) - основы комбинаторной логики (1)".

Продолжение Лабораторная работа 5: делаем процессор MIPS (6) >>

Лабораторная работа 5: делаем процессор MIPS (6)

И наконец, финальный пост в серии Лабораторная работа 5: делаем процессор MIPS на Верилоге.

На прошлых лабах мы уже полностью сделали процессор с выбранным подмножеством архитектуры MIPS на Verilog - cсылки на предыдущие части лабы:

1. Определение архитектуры процессора, язык ассемблер: Лабораторная работа 5: делаем процессор MIPS (1)

Реализация на Verilog:
2. Ключевые модули - файл регистров, память данных, память инструкций, счетчик программы: Лабораторная работа 5: делаем процессор MIPS (2),
3. Шина данных и контроллер: Лабораторная работа 5: делаем процессор MIPS (3) и
4. Реализация команд ассемблера, ядро MIPS и модуль верхнего уровня: Лабораторная работа 5: делаем процессор MIPS (4)
5. Подключение простых устройств ввода-вывода: Лабораторная работа 5: делаем процессор MIPS (5)


Весь Verilog код проекта:
mips.v - модули основной логики.
datamem.v - память данных.
instrmem.v - память инструкций.
mips_top.v - модуль верхнего уровня - для генерации файла прошивки ПЛИС и подключения устройств ввода-вывода.

Осталось провести его демонстрацию и тестовые испытания - базовые устройства ввода-вывода в прошлый раз подключили, теперь запустим демонстрационные программы на ПЛИС.

7. Тестовые программы

Итак, процессор под себя мы написали, пришло время загрузить его в память.

Внутри модуля instrmem перечислены все тестовые программы, каждая из которых находится в отдельном модуле - перед запуском на ПЛИС нужно выбрать один, раскомментировать соответствующую строку и перегенерировать прошивку. Ничего концептуального - чисто для удобства организации кода.

instrmem.v
/**
 * Instruction memory - contains program instructions.
 */

module instrmem (
    /* read address */
    input [31:0] addr,
    /* instruction value */
    output [31:0] instr);

    // раскомментировать нужный модуль для теста

    //instrmem_test_7segment_draw_8 instrmem_program(addr, instr);
    //instrmem_test_7segment_draw_5 instrmem_program(addr, instr);
    //instrmem_test_beq_input instrmem_program(addr, instr);
    //instrmem_test_sw_lw instrmem_program(addr, instr);
    //instrmem_test_input_4bits instrmem_program(addr, instr);
    instrmem_test_io_calc instrmem_program(addr, instr);
endmodule

Каждый тест - программа на ассемблере MIPS, переведенная в двоичный машинный код и обернутая в модуль Verilog. Во всех программах используются только выбранные заранее и реализованные на Verilog внутри процессора команды. Подробности перевода ассемблера в машинный код можно вспомнить из первой части лабы.

Проверка "видео-памяти" - выводим цифру 8

Проверим, что все сегменты дисплея подключены - нарисуем цифру 8 с точкой. Отправляем b'11111111 в регистр $s0 при помощи операции addi (прибавляем константу в выставленными битами к нулю $0). Из $s0 отправляем в видео-память - sw в память данных по адресу 0x0000f000.

  // put 11111111 value (8 with dot 'on') to s0 (switch on all display segments)
    addi $s0, $0, b0000000011111111
    // send value to video memory (7-segment display) device at 0xf000
    sw $s0, 0x0000f000 ($0)

То же самое на верилоге:
instrmem.v
module instrmem_test_7segment_draw_8 (
    /* read address */
    input [31:0] addr,
    /* instruction value */
    output reg [31:0] instr);

    // hardcode program data - as soon as instruction memory is read-only,
    // implement it in ROM-way
    always @ (addr)
        case (addr)
            32'h00000000: instr <= 32'b001000_00000_10000_0000000011111111; // addi $s0, $0, b0000000011111111
            32'h00000004: instr <= 32'b101011_00000_10000_1111000000000000; // sw $s0, 0xf000 ($0)

            default: instr <= 0;
    endcase
endmodule

Видим результат - простая цифра 8 с точкой на дисплее, но мы-то знаем, что это цифра 8 нарисована не прямым проводом от батарейки и даже не простым комбинаторным модулем, как на первых лабах, а при помощи настоящего аппаратного процессора.



Collapse )

8. Лаба окончена

Ну вот, на этот раз действительно всё - процессор спроектирован, реализован на Verilog, запрограммирован асемблером и проверен на работоспособность на ПЛИС. Подведем промежуточные итоги по курсу лабораторных работ. Думаю, что можно считать, что все математики и программисты, ознакомившиеся с курсом - студенты группы Прикладная Математики, на которых этот курс был испытан в аудитории, те, кто прочитал отчеты по лабам в онлайне (если такие вообще есть) и я лично, - пропасть от физики к программированию пересекли. Т.к. начав с мигающих лампочек с батарейками и проводами на 1й лабе (она отвечала за физику) к пятой лабе добрались до собственной реализации подмножества процессора MIPS и даже сумели запрограммировать его программой на языке программирования ассемблер (вот собственно и программирование). В рамках курса для полноты картины планируется опубликовать отчет по финальной 6й лабораторной работе - знакомство с промышленной реализацией процессора MIPS на примере контроллера с PIC32.

Но по цифровому дизайну на верилоге лабы в рамках курса окончены. Зато после них начинается самое интересное - практическое применение полученных навыков. Я бы рекомендовал двинуться в следующих направлениях:
- Научиться подключить ПЛИС к обычному контроллеру в виде внешнего устройства, на которое можно перекладывать вспомогательные задачи, для которых может быть целесообразно аппаратное ускорение.
- Подключить к ПЛИС модуль внешней памяти и сделать так, чтобы процессор научился с ним работать через модуль память данных - без решения этой задачи вообще сложно говорить о каком-то сколько-нибудь полезном применении этого дизайна.
- Далее для особо усидчивых - реализовать все 85 команд архитектуры MIPS и попробовать запустить на своем ядре какой-нибудь линукс.
- Гораздо более интересно - разработать собственный аппаратный вычислитель для каких-нибудь специфических задач и получить на них ускорение в 60 раз по сравнению с процессорами общего назначения.
- В частности можно двигаться в направлении многоядерных систем и параллельных вычислений.
- Например можно попробовать сделать проект уровня adapteva.
- Зайти на сайт проекта opencores.org и попробовать сделать там что-нибудь полезное.

По случаю окончания верилоговской части курса хочу провести небольшой опрос.

Poll #1892395 Цифровая микроэлектроника для математиков и программистов

Помог ли вам курс лабораторных работ по ПЛИС и Verilog пересечь пропасть от физики к программированию?

Помог
2(50.0%)
Не помог
1(25.0%)
Для меня и так не было никакой пропасти
1(25.0%)
Пропасть есть, но я её пересекать не собираюсь
0(0.0%)
Не понимаю, какая еще пропасть
0(0.0%)

Есть ли у вас плата ПЛИС (FPGA)?

Есть и я на ней воспроизвел некоторые лабы из курса
1(25.0%)
Есть, но я и так знаю, что с ней делать, без курса
1(25.0%)
Нет, но как раз собираюсь купить и попробовать запустить лабы из курса
1(25.0%)
Мне хватило фоток и видео в отчетах по лабам
1(25.0%)
Нет и не собираюсь покупать
0(0.0%)
Я не знаю, ни что такое ПЛИС, ни FPGA
0(0.0%)

Интересен ли вам цифровой дизайн аппаратного обеспечения с Verilog и ПЛИС?

Я Java/PHP-программист и мне интересно знать, как все устроено на аппаратном уровне
1(25.0%)
Я Java/Php-программист и хочу заняться цифровым дизайном, чтобы создавать новые интересные аппаратно-программные системы
1(25.0%)
Я Java/Php-программист и мне цифровой дизайн не интересен
0(0.0%)
Я и так занимаюсь цифровым дизайном
2(50.0%)
Просто не интересен
0(0.0%)