Skip to content

Commit

Permalink
ЛР12. Добавление инструкций по реализации прерываний
Browse files Browse the repository at this point in the history
  • Loading branch information
HepoH3 committed Nov 16, 2023
1 parent b9dfcd2 commit 03d318c
Showing 1 changed file with 29 additions and 1 deletion.
30 changes: 29 additions & 1 deletion Labs/12. Peripheral units/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -206,6 +206,14 @@ module sw_sb_ctrl(
// совместимости с системной шиной
output logic [31:0] read_data_o,
/*
Часть интерфейса модуля, отвечающая за отправку запросов на прерывание
процессорного ядра
*/
output logic interrupt_request_o,
input logic interrupt_return_i,
/*
Часть интерфейса модуля, отвечающая за подключение к периферии
*/
Expand All @@ -223,6 +231,10 @@ endmodule
|-----|-------------|-------------------------------------------------|
|0x00 | R | Чтение значения, выставленного на переключателях|

При этом, будучи устройством ввода, данный модуль может генерировать прерывание, чтобы сообщить процессору о том, что данные на переключателях были изменены. Если на очередном такте `clk_i` данные на входе `sw_i` изменились (т.е. отличаются от тех, что были на предыдущем такте), модуль должен выставить значение `1` на выходе `interrupt_request_o` и удерживать его до получения сигнала о завершении обработки прерывания `interrupt_return_i`.

Для отслеживания изменений на входе `sw_i` между тактами синхроимпульса вам потребуется вспомогательный регистр, каждый такт сохраняющий значение `sw_i`. При реализации данного регистра, не забывайте о том, что его необходимо сбрасывать посредством сигнала `rst_i`.

### Светодиоды

Как и переключатели, светодиоды являются простейшим устройством вывода. Поэтому, чтобы задание было интересней, для их управления был добавлен регистр, управляющий режимом вывода данных на светодиоды.
Expand Down Expand Up @@ -303,6 +315,13 @@ module ps2_sb_ctrl(
input logic write_enable_i,
output logic [31:0] read_data_o,
/*
Часть интерфейса модуля, отвечающая за отправку запросов на прерывание
процессорного ядра
*/
output logic interrupt_request_o,
/*
Часть интерфейса модуля, отвечающая за подключение к модулю,
осуществляющему прием данных с клавиатуры
Expand All @@ -327,6 +346,8 @@ endmodule

В случае запроса на запись по адресу `0x24` со значением `1`, необходимо осуществить сброс регистров `scan_code` и `scan_code_is_unread` в `0`.

Регистр `scan_code_is_unread` необходимо подключить к выходу `interrupt_request_o`. Таким образом процессор может узнавать о нажатых клавишах как посредством программного опроса путем чтения значения регистра`scan_code_is_unread`, так и посредством прерываний через сигнал`interrupt_request_o`.

Адресное пространство контроллера:

|Адрес|Режим доступа|Допустимые значения| Функциональное назначение |
Expand Down Expand Up @@ -478,6 +499,13 @@ module uart_rx_sb_ctrl(
input logic write_enable_i,
output logic [31:0] read_data_o,
/*
Часть интерфейса модуля, отвечающая за отправку запросов на прерывание
процессорного ядра
*/
output logic interrupt_request_o,
/*
Часть интерфейса модуля, отвечающая за подключение передающему,
входные данные по UART
Expand Down Expand Up @@ -537,7 +565,7 @@ endmodule

В регистр `data` модуля `uart_rx_sb_ctrl` записывается значение одноименного выхода модуля `uart_rx` в моменты положительного фронта `clk_i`, когда сигнал `rx_valid_o` равен единице. Доступ на чтение этого регистра осуществляется по адресу `0x00`.

В регистр `valid` модуля `uart_rx_sb_ctrl` записывается единица по положительному фронту clk_i, когда выход `rx_valid_o` равен единице. Данный регистр сбрасывается в ноль при выполнении запроса на чтение по адресу `0x00`. Сам регистр доступен для чтения по адресу `0x04`.
В регистр `valid` модуля `uart_rx_sb_ctrl` записывается единица по положительному фронту clk_i, когда выход `rx_valid_o` равен единице. Данный регистр сбрасывается в ноль при выполнении запроса на чтение по адресу `0x00`. Сам регистр доступен для чтения по адресу `0x04`. Регистр `valid` подключается к выходу `interrupt_request_o`. Что позволяет узнать о пришедших данных и посредством прерывания.

На вход `tx_data_i` модуля `uart_tx` подаются данные из регистра `data` модуля `uart_tx_sb_ctrl`. Доступ на запись в этот регистр происходит по адресу `0x00` в моменты положительного фронта `clk_i`, когда сигнал `busy_o` равен нулю. Доступ на чтение этого регистра может осуществляться в любой момент времени.

Expand Down

0 comments on commit 03d318c

Please sign in to comment.