From 03d318c5fbc090e0da5fcd092a987795179799d8 Mon Sep 17 00:00:00 2001 From: Andrei Solodovnikov Date: Thu, 16 Nov 2023 17:05:21 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9B=D0=A012.=20=D0=94=D0=BE=D0=B1=D0=B0?= =?UTF-8?q?=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=B8=D0=BD=D1=81=D1=82?= =?UTF-8?q?=D1=80=D1=83=D0=BA=D1=86=D0=B8=D0=B9=20=D0=BF=D0=BE=20=D1=80?= =?UTF-8?q?=D0=B5=D0=B0=D0=BB=D0=B8=D0=B7=D0=B0=D1=86=D0=B8=D0=B8=20=D0=BF?= =?UTF-8?q?=D1=80=D0=B5=D1=80=D1=8B=D0=B2=D0=B0=D0=BD=D0=B8=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Labs/12. Peripheral units/README.md | 30 ++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/Labs/12. Peripheral units/README.md b/Labs/12. Peripheral units/README.md index 546ffd3..1588834 100644 --- a/Labs/12. Peripheral units/README.md +++ b/Labs/12. Peripheral units/README.md @@ -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, + /* Часть интерфейса модуля, отвечающая за подключение к периферии */ @@ -223,6 +231,10 @@ endmodule |-----|-------------|-------------------------------------------------| |0x00 | R | Чтение значения, выставленного на переключателях| +При этом, будучи устройством ввода, данный модуль может генерировать прерывание, чтобы сообщить процессору о том, что данные на переключателях были изменены. Если на очередном такте `clk_i` данные на входе `sw_i` изменились (т.е. отличаются от тех, что были на предыдущем такте), модуль должен выставить значение `1` на выходе `interrupt_request_o` и удерживать его до получения сигнала о завершении обработки прерывания `interrupt_return_i`. + +Для отслеживания изменений на входе `sw_i` между тактами синхроимпульса вам потребуется вспомогательный регистр, каждый такт сохраняющий значение `sw_i`. При реализации данного регистра, не забывайте о том, что его необходимо сбрасывать посредством сигнала `rst_i`. + ### Светодиоды Как и переключатели, светодиоды являются простейшим устройством вывода. Поэтому, чтобы задание было интересней, для их управления был добавлен регистр, управляющий режимом вывода данных на светодиоды. @@ -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, + /* Часть интерфейса модуля, отвечающая за подключение к модулю, осуществляющему прием данных с клавиатуры @@ -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`. + Адресное пространство контроллера: |Адрес|Режим доступа|Допустимые значения| Функциональное назначение | @@ -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 @@ -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` равен нулю. Доступ на чтение этого регистра может осуществляться в любой момент времени.