diff --git a/.pic/Labs/lab_10_irq/fig_05.drawio.svg b/.pic/Labs/lab_10_irq/fig_05.drawio.svg index fd13990..1912b44 100644 --- a/.pic/Labs/lab_10_irq/fig_05.drawio.svg +++ b/.pic/Labs/lab_10_irq/fig_05.drawio.svg @@ -1,4 +1,4 @@ -
irq_h
D
Q
RST
exc_h
D
Q
RST
reset
set
reset
set
mret_i
irq_req_i
mie_i
exception_i
irq_o
irq_ret_o
irq_cause_o
32'h1000_0010
clk_i
rst_i
clk_i
rst_i
\ No newline at end of file +
irq_h
D
Q
RST
exc_h
D
Q
RST
reset
set
reset
set
mret_i
irq_req_i
mie_i
exception_i
irq_o
irq_ret_o
irq_cause_o
32'h8000_0010
clk_i
rst_i
clk_i
rst_i
32
\ No newline at end of file diff --git a/Labs/10. Interrupt subsystem/README.md b/Labs/10. Interrupt subsystem/README.md index 743be5e..de17b96 100644 --- a/Labs/10. Interrupt subsystem/README.md +++ b/Labs/10. Interrupt subsystem/README.md @@ -147,7 +147,7 @@ _Таблица 5. Кодирование причины перехвата в Нас интересуют части, выделенные красным. В первую очередь то, как кодируется старший бит регистра `mcause`. Он зависит от типа причины перехвата (`1` в случае прерывания, `0` в случае исключения). Оставшиеся 31 бит регистра отводятся под коды различных причин. Поскольку мы создаем учебный процессор, который не будет использован в реальной жизни, он не будет поддерживать большую часть прерываний/исключений (таких как невыровненный доступ к памяти, таймеры и т.п.). В рамках данного курса мы должны поддерживать исключение по нелегальной инструкции (код 0x02) и должны уметь поддерживать прерывания периферийных устройств (под которые зарезервированы коды начиная с 16-го). В рамках данной лабораторной работы процессор будет поддерживать только один источник прерывания, поэтому для кодирования причины прерывания нам потребуется только первый код из диапазона _"Designated for platform use"_. -Таким образом: в случае если произошло исключение (в связи с нелегальной инструкцией), значение `mcause` должно быть `0x00000002`. Если произошло прерывание, значение `mcause` должно быть `0x10000010`. +Таким образом: в случае если произошло исключение (в связи с нелегальной инструкцией), значение `mcause` должно быть `0x00000002`. Если произошло прерывание, значение `mcause` должно быть `0x80000010`. При желании, процессор можно будет улучшить, добавив поддержку большего числа периферийных устройств. В этом случае потребуется только расширить контроллер прерываний. @@ -175,7 +175,7 @@ _Таблица 5. Кодирование причины перехвата в Контроллер прерываний – это блок процессора, обеспечивающий взаимодействие с устройствами, запрашивающими прерывания, формирование кода причины прерывания для процессора, маскирование прерываний, а также, в других реализациях, может реагировать на прерывания в соответствии с приоритетом и тому подобное. -Периферийное устройство, которое может генерировать прерывание, подключается к контроллеру прерывания паре проводов: запрос на прерывание (`irq_req_i`) и прерывание обслужено (`irq_ret_o`). Предположим, к контроллеру прерываний подключили клавиатуру. Когда на ней нажимают клавишу, код этой клавиши попадает в буферный регистр с дополнительным управляющим битом, выставленным в единицу, который подключен к входу запроса на прерывание. Если прерывание не замаскировано (в нашем процессоре это означает, что нулевой бит регистра `mie` выставлен в 1), то контроллер прерывания сгенерирует код причины прерывания (в нашем случае — это константа `0x10000010`). Кроме этого, контроллер прерывания подаст сигнал `irq_o`, чтобы устройство управления процессора узнало, что произошло прерывание и разрешило обновить содержимое регистра причины `mcause`, сохранило адрес прерванной инструкции в `mepc` и загрузило в `PC` вектор прерывания `mtvec`. +Периферийное устройство, которое может генерировать прерывание, подключается к контроллеру прерывания паре проводов: запрос на прерывание (`irq_req_i`) и прерывание обслужено (`irq_ret_o`). Предположим, к контроллеру прерываний подключили клавиатуру. Когда на ней нажимают клавишу, код этой клавиши попадает в буферный регистр с дополнительным управляющим битом, выставленным в единицу, который подключен к входу запроса на прерывание. Если прерывание не замаскировано (в нашем процессоре это означает, что нулевой бит регистра `mie` выставлен в 1), то контроллер прерывания сгенерирует код причины прерывания (в нашем случае — это константа `0x80000010`). Кроме этого, контроллер прерывания подаст сигнал `irq_o`, чтобы устройство управления процессора узнало, что произошло прерывание и разрешило обновить содержимое регистра причины `mcause`, сохранило адрес прерванной инструкции в `mepc` и загрузило в `PC` вектор прерывания `mtvec`. Когда будет выполняться инструкция `mret`, устройство управления подаст сигнал контроллеру прерывания, чтобы тот, в свою очередь, направил его в виде сигнала «прерывание обслужено» для соответствующего устройства. После этого периферийное устройство обязано снять сигнал запроса прерывания хотя бы на один такт. В нашем примере сигнал «прерывание обслужено» может быть подключен непосредственно к сбросу буферного регистра клавиатуры. @@ -309,7 +309,7 @@ trap_handler: # Проверяем произошло ли прерывание 50: csrr x6, mcause # x6 = mcause -54: li x7, 0x10000010 # загружаем в x7 код того, что произошло прерывание +54: li x7, 0x80000010 # загружаем в x7 код того, что произошло прерывание 58: # данная псевдоинструкция будет разбита на две # инструкции: lui и addi 5C: bne x6, x7, exc_handler # если коды не совпадают, переходим к проверке