diff --git a/Labs/13. Peripheral units/README.md b/Labs/13. Peripheral units/README.md index 7a2976ee..58209065 100644 --- a/Labs/13. Peripheral units/README.md +++ b/Labs/13. Peripheral units/README.md @@ -58,9 +58,9 @@ _Рисунок 1. Итоговая структура процессорной В зависимости от интерфейса используемой шины, периферийные устройства либо знают какой диапазон адресов им выделен (например, в интерфейсе I²C), либо нет (интерфейс APB). В первом случае, устройство понимает что к нему обратились непосредственно по адресу в данном обращении, во втором случае — по специальному сигналу. -На _рис. 1_ используется второй вариант — устройство понимает, что к нему обратились по специальному сигналу `req_i`. Данный сигнал формируется из двух частей: сигнала `req` исходящего из процессорного ядра (сигнал о том, обращение в память вообще происходит) и специального сигнала-селектора исходящего из 256-разрядной шины. Формирование значения на этой шине происходит с помощью [унитарного](https://ru.wikipedia.org/wiki/Унитарный_код) ([one-hot](https://en.wikipedia.org/wiki/One-hot)) кодирования. Процесс кодирования достаточно прост. В любой момент времени на выходной шине должен быть **ровно один** бит, равный единице. Индекс этого бита совпадает со значением старших восьми бит адреса. Поскольку для восьмибитного значения существует 256 комбинаций значений, именно такая разрядность будет на выходе кодировщика. Это означает, что в данной системе можно связать процессор с 256 устройствами (одним из которых будет память данных). +На _рис. 1_ используется второй вариант — устройство понимает, что к нему обратились по специальному сигналу `req_i`. Данный сигнал формируется из двух частей: сигнала `req` исходящего из процессорного ядра (сигнал о том, обращение в память вообще происходит) и специального сигнала-селектора исходящего из 256-разрядной шины. Формирование значения на этой шине происходит с помощью [унитарного](https://ru.wikipedia.org/wiki/Унитарный_код) ([one-hot](https://en.wikipedia.org/wiki/One-hot)) кодирования. Процесс кодирования достаточно прост. В любой момент времени на выходной шине должен быть **ровно один** бит, равный единице. Индекс этого бита совпадает со значением числа, формируемого из старших восьми бит адреса. Поскольку для восьмибитного значения существует 256 комбинаций значений, именно такая разрядность будет на выходе кодировщика. Это означает, что в данной системе можно связать процессор с 256 устройствами (одним из которых будет память данных). -Реализация такого кодирования предельно проста: +Реализация унитарного кодирования предельно проста: * Нулевой сигнал этой шины будет равен единице только если `data_addr_o[31:24] = 8'd0`. * Первый бит этой шины будет равен единице только если `data_addr_o[31:24] = 8'd1`. @@ -94,11 +94,11 @@ module riscv_unit( input logic rx_i, // Линия приема по UART output logic tx_o, // Линия передачи по UART - output logic [3:0] vga_r_o, // красный канал vga - output logic [3:0] vga_g_o, // зеленый канал vga - output logic [3:0] vga_b_o, // синий канал vga - output logic vga_hs_o, // линия горизонтальной синхронизации vga - output logic vga_vs_o // линия вертикальной синхронизации vga + output logic [3:0] vga_r_o, // Красный канал vga + output logic [3:0] vga_g_o, // Зеленый канал vga + output logic [3:0] vga_b_o, // Синий канал vga + output logic vga_hs_o, // Линия горизонтальной синхронизации vga + output logic vga_vs_o // Линия вертикальной синхронизации vga ); //... @@ -109,12 +109,12 @@ endmodule Обратите внимание на то, что изменился сигнал сброса (`resetn_i`). Буква `n` на конце означает, что сброс работает по уровню `0` (когда сигнал равен нулю — это сброс, когда единице — не сброс). -Помимо прочего, необходимо подключить к вашему модулю `блок делителя частоты`. Поскольку в данном курсе лабораторных работ вы выполняли реализацию однотактного процессора, инструкция должна пройти через все ваши блоки за один такт. Из-за этого критический путь вашей схемы не позволит использовать тактовый сигнал частотой в `100 МГц`, от которого работает отладочный стенд. Поэтому, необходимо создать отдельный сигнал с пониженной тактовой частотой, от которого будет работать ваша схема. +Помимо прочего, необходимо подключить к вашему модулю `блок делителя частоты`. Поскольку в данном курсе лабораторных работ вы выполняли реализацию однотактного процессора, инструкция должна пройти через все ваши блоки за один такт. Из-за этого критический путь схемы не позволит использовать тактовый сигнал частотой в `100 МГц`, от которого работает отладочный стенд. Поэтому, необходимо создать отдельный сигнал с пониженной тактовой частотой, от которого будет работать ваша схема. Для этого необходимо: 1. Подключить файл [`sys_clk_rst_gen.sv`](sys_clk_rst_gen.sv) в ваш проект. -2. Подключить этот модуль в начале описания модуля `riscv_unit` следующим образом: +2. Создать экземпляр этого модуля в начале описания модуля `riscv_unit` следующим образом: ```SystemVerilog logic sysclk, rst; @@ -146,7 +146,7 @@ _Рисунок 2. Карта памяти периферийных устрой 1. При получении сигнала `req_i`, записать в регистр или вернуть значение из регистра, ассоциированного с переданным адресом (адрес передается с обнуленной старшей частью). Если регистра, ассоциированного с таким адресом нет (например, для переключателей не ассоциировано ни одного адреса кроме `0x000000`), игнорировать эту операцию. 2. Выполнять управление периферийным устройством с помощью управляющих регистров. -Подробное описание периферийных устройств их управления и назначение управляющих регистров будет дано после порядка выполнения задания. +Подробное описание периферийных устройств их управления и назначение управляющих регистров описано **после порядка выполнения задания**. --- @@ -190,9 +190,10 @@ _Рисунок 2. Карта памяти периферийных устрой 3. На входе `write_enable_i` выставлено значение `1`. 4. На входе `addr_i` выставлено значение `0xАДРЕС` 2. Под "**запросом на чтение** по адресу `0xАДРЕС`" будет пониматься совокупность следующих условий: - 1. На входе `req_i` выставлено значение `1`. - 2. На входе `write_enable_i` выставлено значение `0`. - 3. На входе `addr_i` выставлено значение `0xАДРЕС` + 1. Происходит восходящий фронт `clk_i`. + 2. На входе `req_i` выставлено значение `1`. + 3. На входе `write_enable_i` выставлено значение `0`. + 4. На входе `addr_i` выставлено значение `0xАДРЕС` Обратите внимание на то, что **запрос на чтение** должен обрабатываться **синхронно** (выходные данные должны выдаваться по положительному фронту `clk_i`).