diff --git a/.pic/Basic Verilog structures/controllers/fig_01.drawio.svg b/.pic/Basic Verilog structures/controllers/fig_01.drawio.svg index ec25e75..fdfa53d 100644 --- a/.pic/Basic Verilog structures/controllers/fig_01.drawio.svg +++ b/.pic/Basic Verilog structures/controllers/fig_01.drawio.svg @@ -1,4 +1,4 @@ -
clk_i
rst_i
write_data_i
addr_i
write_enable_i
req_i
led_o
read_data_o
\ No newline at end of file +
clk_i
rst_i
addr_i
write_enable_i
req_i
led_o
read_data_o
write_data_i
\ No newline at end of file diff --git a/.pic/Basic Verilog structures/controllers/fig_02.drawio.svg b/.pic/Basic Verilog structures/controllers/fig_02.drawio.svg index 17d1982..8c21c7b 100644 --- a/.pic/Basic Verilog structures/controllers/fig_02.drawio.svg +++ b/.pic/Basic Verilog structures/controllers/fig_02.drawio.svg @@ -1,4 +1,4 @@ -
clk_i
rst_i
write_data_i
addr_i
write_enable_i
req_i
write_req
read_req
led_o
read_data_o
\ No newline at end of file +
clk_i
rst_i
addr_i
write_enable_i
req_i
write_req
read_req
led_o
read_data_o
write_data_i
\ No newline at end of file diff --git a/.pic/Basic Verilog structures/controllers/fig_03.drawio.svg b/.pic/Basic Verilog structures/controllers/fig_03.drawio.svg index 7866ceb..ca28a22 100644 --- a/.pic/Basic Verilog structures/controllers/fig_03.drawio.svg +++ b/.pic/Basic Verilog structures/controllers/fig_03.drawio.svg @@ -1,4 +1,4 @@ -
clk_i
rst_i
write_data_i
addr_i
write_enable_i
req_i
32'h0
write_req
read_req
32'h4
is_val_addr
is_mode_addr
=
=
=
32'hffff
<=
32'd1
<
32'd2
val_valid
mode_valid
rst_valid
32'h24
is_rst_addr
=
val_valid
led_o
read_data_o
\ No newline at end of file +
clk_i
rst_i
addr_i
write_enable_i
req_i
32'h0
write_req
read_req
32'h4
is_val_addr
is_mode_addr
=
=
32'h24
is_rst_addr
=
led_o
read_data_o
write_data_i
\ No newline at end of file diff --git a/.pic/Basic Verilog structures/controllers/fig_04.drawio.svg b/.pic/Basic Verilog structures/controllers/fig_04.drawio.svg index ad97fc2..83a2b56 100644 --- a/.pic/Basic Verilog structures/controllers/fig_04.drawio.svg +++ b/.pic/Basic Verilog structures/controllers/fig_04.drawio.svg @@ -1,4 +1,4 @@ -
clk_i
rst_i
write_data_i
addr_i
write_enable_i
req_i
32'h0
write_req
read_req
32'h4
is_val_addr
is_mode_addr
=
=
=
32'hffff
<=
32'd1
<
32'd2
val_valid
mode_valid
rst_valid
32'h24
is_rst_addr
=
rst_valid
write_req
is_rst_addr
rst
val_valid
led_o
read_data_o
\ No newline at end of file +
clk_i
rst_i
addr_i
write_enable_i
req_i
32'h0
write_req
read_req
32'h4
is_val_addr
is_mode_addr
=
=
32'h24
is_rst_addr
=
write_req
is_rst_addr
rst
led_o
read_data_o
write_data_i
=
32'd1
\ No newline at end of file diff --git a/.pic/Basic Verilog structures/controllers/fig_05.drawio.svg b/.pic/Basic Verilog structures/controllers/fig_05.drawio.svg index 384b67c..26ad796 100644 --- a/.pic/Basic Verilog structures/controllers/fig_05.drawio.svg +++ b/.pic/Basic Verilog structures/controllers/fig_05.drawio.svg @@ -1,4 +1,4 @@ -
clk_i
rst_i
write_data_i
addr_i
write_enable_i
req_i
32'h0
write_req
read_req
32'h4
is_val_addr
is_mode_addr
=
=
=
32'hffff
<=
32'd1
<
32'd2
val_valid
mode_valid
rst_valid
32'h24
is_rst_addr
=
rst_valid
write_req
is_rst_addr
rst
val_valid
write_req
is_val_addr
val_en
val_valid
led_o
read_data_o
\ No newline at end of file +
clk_i
rst_i
addr_i
write_enable_i
req_i
32'h0
write_req
read_req
32'h4
is_val_addr
is_mode_addr
=
=
32'h24
is_rst_addr
=
write_req
is_rst_addr
rst
write_req
is_val_addr
val_en
led_o
read_data_o
write_data_i
=
32'd1
\ No newline at end of file diff --git a/.pic/Basic Verilog structures/controllers/fig_06.drawio.svg b/.pic/Basic Verilog structures/controllers/fig_06.drawio.svg index 622c866..99e2331 100644 --- a/.pic/Basic Verilog structures/controllers/fig_06.drawio.svg +++ b/.pic/Basic Verilog structures/controllers/fig_06.drawio.svg @@ -1,4 +1,4 @@ -
clk_i
rst_i
write_data_i
addr_i
write_enable_i
req_i
led
val
32'h0
write_req
read_req
32'h4
is_val_addr
is_mode_addr
=
=
=
32'hffff
<=
32'd1
<
32'd2
val_valid
mode_valid
rst_valid
32'h24
is_rst_addr
=
rst_valid
write_req
is_rst_addr
rst
val_valid
write_req
is_val_addr
val_en
val_valid
val_en
rst
clk_i
write_data_i[15:0]
led_val
led_o
read_data_o
\ No newline at end of file +
clk_i
rst_i
addr_i
write_enable_i
req_i
led
val
32'h0
write_req
read_req
32'h4
is_val_addr
is_mode_addr
=
=
32'h24
is_rst_addr
=
write_req
is_rst_addr
rst
write_req
is_val_addr
val_en
val_en
rst
clk_i
write_data_i[15:0]
led_val
led_o
read_data_o
write_data_i
=
32'd1
\ No newline at end of file diff --git a/.pic/Basic Verilog structures/controllers/fig_07.drawio.svg b/.pic/Basic Verilog structures/controllers/fig_07.drawio.svg index aeb594a..1722990 100644 --- a/.pic/Basic Verilog structures/controllers/fig_07.drawio.svg +++ b/.pic/Basic Verilog structures/controllers/fig_07.drawio.svg @@ -1,4 +1,4 @@ -
clk_i
rst_i
write_data_i
addr_i
write_enable_i
req_i
led
val
32'h0
write_req
read_req
32'h4
is_val_addr
is_mode_addr
=
=
=
32'hffff
<=
32'd1
<
32'd2
val_valid
mode_valid
rst_valid
32'h24
is_rst_addr
=
rst_valid
write_req
is_rst_addr
rst
val_valid
write_req
is_val_addr
val_en
mode_valid
write_req
is_mode_addr
mode_en
val_valid
val_en
rst
clk_i
write_data_i[15:0]
mod
mode_en
rst
clk_i
write_data_i[0]
led_val
led_o
read_data_o
led_val
\ No newline at end of file +
clk_i
rst_i
addr_i
write_enable_i
req_i
led
val
32'h0
write_req
read_req
32'h4
is_val_addr
is_mode_addr
=
=
32'h24
is_rst_addr
=
write_req
is_rst_addr
rst
write_req
is_val_addr
val_en
write_req
is_mode_addr
mode_en
val_en
rst
clk_i
write_data_i[15:0]
mod
mode_en
rst
clk_i
write_data_i[0]
led_val
led_o
read_data_o
write_data_i
=
32'd1
led_mode
\ No newline at end of file diff --git a/.pic/Basic Verilog structures/controllers/fig_08.drawio.svg b/.pic/Basic Verilog structures/controllers/fig_08.drawio.svg index 9a1f581..e21c7fa 100644 --- a/.pic/Basic Verilog structures/controllers/fig_08.drawio.svg +++ b/.pic/Basic Verilog structures/controllers/fig_08.drawio.svg @@ -1,4 +1,4 @@ -
clk_i
rst_i
write_data_i
addr_i
write_enable_i
req_i
led
val
32'h0
write_req
read_req
32'h4
is_val_addr
is_mode_addr
=
=
=
32'hffff
<=
32'd1
<
32'd2
val_valid
mode_valid
rst_valid
32'h24
is_rst_addr
=
rst_valid
write_req
is_rst_addr
rst
val_valid
write_req
is_val_addr
val_en
mode_valid
write_req
is_mode_addr
mode_en
val_valid
val_en
rst
clk_i
write_data_i[15:0]
mod
mode_en
rst
clk_i
write_data_i[0]
cntr
rst
clk_i
+
32'd1
32
led_val
<
107
16'd0
led_val
led_o
read_data_o
>=
2*107
cntr

1

0

\ No newline at end of file +
clk_i
rst_i
addr_i
write_enable_i
req_i
led
val
32'h0
write_req
read_req
32'h4
is_val_addr
is_mode_addr
=
=
32'h24
is_rst_addr
=
write_req
is_rst_addr
rst
write_req
is_val_addr
val_en
write_req
is_mode_addr
mode_en
val_en
rst
clk_i
write_data_i[15:0]
mod
mode_en
rst
clk_i
write_data_i[0]
cntr
rst
clk_i
+
32'd1
32
led_val
<
107
16'd0
led_val
led_o
read_data_o
>=
2*107
cntr

1

0

write_data_i
=
32'd1
\ No newline at end of file diff --git a/.pic/Basic Verilog structures/controllers/fig_09.drawio.svg b/.pic/Basic Verilog structures/controllers/fig_09.drawio.svg index 6b03acb..6c4692b 100644 --- a/.pic/Basic Verilog structures/controllers/fig_09.drawio.svg +++ b/.pic/Basic Verilog structures/controllers/fig_09.drawio.svg @@ -1,4 +1,4 @@ -
clk_i
rst_i
write_data_i
addr_i
write_enable_i
req_i
led
val
32'h0
write_req
read_req
32'h4
is_val_addr
is_mode_addr
=
=
=
32'hffff
<=
32'd1
<
32'd2
val_valid
mode_valid
rst_valid
32'h24
is_rst_addr
=
rst_valid
write_req
is_rst_addr
rst
val_valid
write_req
is_val_addr
val_en
mode_valid
write_req
is_mode_addr
mode_en
val_valid
val_en
rst
clk_i
write_data_i[15:0]
mod
mode_en
rst
clk_i
write_data_i[0]
cntr
rst
clk_i
+
32'd1
32
led_val
<
107
16'd0
led_val
led_o
read_data_o
rd
rst
clk_i
read_req
>=
2*107
cntr
{16'd0, led_val}
is_val_addr

1

0

0

1

{31'd0, led_mode}
is_val_addr
is_mode_addr
en
\ No newline at end of file +
clk_i
rst_i
addr_i
write_enable_i
req_i
led
val
32'h0
write_req
read_req
32'h4
is_val_addr
is_mode_addr
=
=
32'h24
is_rst_addr
=
write_req
is_rst_addr
rst
write_req
is_val_addr
val_en
write_req
is_mode_addr
mode_en
val_en
rst
clk_i
write_data_i[15:0]
mod
mode_en
rst
clk_i
write_data_i[0]
cntr
rst
clk_i
+
32'd1
32
led_val
<
107
16'd0
led_val
led_o
read_data_o
rd
rst
clk_i
read_req
>=
2*107
cntr
{16'd0, led_val}
is_val_addr

1

0

0

1

{31'd0, led_mode}
is_val_addr
is_mode_addr
en
write_data_i
=
32'd1
\ No newline at end of file diff --git a/Basic Verilog structures/Controllers.md b/Basic Verilog structures/Controllers.md index 4de94d8..a3e9640 100644 --- a/Basic Verilog structures/Controllers.md +++ b/Basic Verilog structures/Controllers.md @@ -14,31 +14,30 @@ 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`). +Обратите внимание на то, что **запрос на чтение** должен обрабатываться **синхронно** (выходные данные должны выдаваться по положительному фронту `clk_i`) так же как был реализован порт на чтение памяти данных в [ЛР№6](../06.%20Main%20memory/). -При описании поддерживаемых режимов доступа по данному адресу используется интуитивно понятное обозначение: +При описании поддерживаемых режимов доступа по данному адресу используются следующее обозначения: -* R — доступ **только на чтение**; -* W — доступ **только на запись**; -* RW — доступ на **чтение и запись**. +- R — доступ **только на чтение**; +- W — доступ **только на запись**; +- RW — доступ на **чтение и запись**. В случае отсутствия **запроса на чтение**, на выходе `read_data_o` не должно меняться значение (тоже самое было сделано в процессе разработки памяти данных). Если пришел **запрос на запись** или **чтение**, это еще не значит, что контроллер должен его выполнить. В случае, если запрос происходит по адресу, не поддерживающему этот запрос (например **запрос на запись** по адресу, поддерживающему только чтение), данный запрос должен игнорироваться. В случае **запроса на чтение** по недоступному адресу, на выходе `read_data_o` должно остаться прежнее значение. -К примеру, в случае запроса на чтение по адресу `0x0100004` (четвертый байт в адресном пространстве периферийного устройства "переключатели"), на выходе `read_data_o` должно оказаться значение `32'hdead_beef`. В случае отсутствия запроса на чтение (`req_i == 0` или `write_enable_i == 1`), на выходе `read_data_o` контроллера переключателей должно оказаться значение `32'hfa11_1eaf`. - В случае осуществления записи по принятому запросу, необходимо записать данные с сигнала `write_data_i` в регистр, ассоциированный с адресом `addr_i` (если разрядность регистра меньше разрядности сигнала `write_data_i`, старшие биты записываемых данных отбрасываются). В случае осуществления чтения по принятому запросу, необходимо по положительному фронту `clk_i` выставить данные с сигнала, ассоциированного с адресом `addr_i` на выходной сигнал `read_data_o` (если разрядность сигнала меньше разрядности выходного сигнала `read_data_o`, возвращаемые данные должны дополниться нулями в старших битах). ### Светодиоды -Светодиоды являются простейшим устройством вывода. Поэтому, чтобы задание было интересней, для их управления был добавлен регистр, управляющий режимом вывода данных на светодиоды. +светодиоды являются простейшим устройством вывода. Поэтому, чтобы задание было интересней, для их управления был добавлен регистр, управляющий режимом вывода данных на светодиоды. Рассмотрим прототип модуля, который вам необходимо реализовать: ```SystemVerilog @@ -47,7 +46,7 @@ module led_sb_ctrl( Часть интерфейса модуля, отвечающая за подключение к системной шине */ input logic clk_i, - input logic rst_i + input logic rst_i, input logic req_i, input logic write_enable_i, input logic [31:0] addr_i, @@ -57,7 +56,7 @@ module led_sb_ctrl( /* Часть интерфейса модуля, отвечающая за подключение к периферии */ - output logic [15:0] led_o + output logic [15:0] led_o ); logic [15:0] led_val; @@ -66,13 +65,15 @@ logic led_mode; endmodule ``` -Данный модуль должен выводить на выходной сигнал `led_o` данные с регистра `led_val`. Запись и чтение регистра `led_val` осуществляется по адресу `0x00`. Запись любого значения, превышающего `2¹⁶-1` должна игнорироваться. +Данный модуль должен подавать на выходной сигнал `led_o` данные с регистра `led_val`. Запись и чтение регистра `led_val` осуществляется по адресу `0x00`. -Регистр `led_mode` отвечает за режим вывода данных на светодиоды. Когда этот регистр равен единице, светодиоды должны "моргать" выводимым значением. Под морганием подразумевается вывод значения из регистра `led_val` на выход `led_o` на одну секунду (загорится часть светодиодов, соответствующие которым биты шины `led_o` равны единице), после чего на одну секунду выход `led_o` необходимо подать нули. Запись и чтение регистра `led_mode` осуществляется по адресу `0x04`. Запись любого значения, отличного от `0` и `1` должна игнорироваться. +Регистр `led_mode` отвечает за режим вывода данных на светодиоды. Когда этот регистр равен единице, светодиоды должны "моргать" выводимым значением. Под морганием подразумевается вывод значения из регистра `led_val` на выход `led_o` на одну секунду (загорится часть светодиодов, соответствующие которым биты шины `led_o` равны единице), после чего на одну секунду выход `led_o` необходимо подать нули. Запись и чтение регистра `led_mode` осуществляется по адресу `0x04`. -Отсчет времени можно реализовать простейшим счетчиком, каждый такт увеличивающимся на 1 и сбрасывающимся по достижении определенного значения, чтобы продолжить считать с нуля. Зная тактовую частоту, нетрудно определить до скольки должен считать счетчик. При тактовой частоте в 10 МГц происходит 10 миллионов тактов в секунду. Это означает, что при такой тактовой частоте через секунду счетчик будет равен `10⁷-1` (счет идет с нуля). +Отсчет времени можно реализовать простейшим счетчиком, каждый такт увеличивающимся на 1 и сбрасывающимся по достижении определенного значения, чтобы продолжить считать с нуля. Зная тактовую частоту, нетрудно определить до скольки должен считать счетчик. При тактовой частоте в 10 МГц происходит 10 миллионов тактов в секунду. Это означает, что при такой тактовой частоте через секунду счетчик будет равен `10⁷-1` (счет идет с нуля). Тем не менее удобней будет считать не до `10⁷-1` (что было бы достаточно очевидным и тоже правильным решением), а до `2*10⁷-1`. В этом случае старший бит счетчика каждую секунду будет инвертировать свое значение, что может быть использовано при реализации логики "моргания". -Обратите внимание на то, что адрес `0x24` является адресом сброса. В случае записи по этому адресу единицы вы должны сбросить регистры `led_val`, `led_mode` и все вспомогательные регистры, которые вы создали. Для реализации сброса вы можете как создать отдельный регистр `led_rst`, в который будет происходить запись, а сам сброс будет происходить по появлению единицы в этом регистре (в этом случае необходимо не забыть сбрасывать и этот регистр), так и создать обычный провод, формирующий единицу в случае выполнения всех указанных условий (условий запроса на запись, адреса сброса и значения записываемых данных равному единице). +Важно отметить, что счетчик должен работать только при `led_mode == 1`, в противном случае счетчик должен быть равен нулю. + +Обратите внимание на то, что адрес `0x24` является адресом сброса. В случае **запроса на запись** по этому адресу значения `1`. вы должны сбросить регистры `led_val`, `led_mode` и все вспомогательные регистры, которые вы создали. Для реализации сброса вы можете как создать отдельный регистр `led_rst`, в который будет происходить запись, а сам сброс будет происходить по появлению единицы в этом регистре (в этом случае необходимо не забыть сбрасывать и этот регистр тоже), так и создать обычный провод, формирующий единицу в случае выполнения всех указанных условий (условий **запроса на запись**, адреса сброса и значения записываемых данных равному единице). Адресное пространство контроллера: @@ -80,7 +81,7 @@ endmodule |-----|-------------|-------------------|-----------------------------------------------------------------------------------| |0x00 | RW | [0:65535] | Чтение и запись в регистр `led_val` отвечающий за вывод данных на светодиоды | |0x04 | RW | [0:1] | Чтение и запись в регистр `led_mode`, отвечающий за режим "моргания" светодиодами | -|0x24 | W | 1 | Запись сигнала сброса +|0x24 | W | 1 | Запись сигнала сброса | ## Реализация схемы контроллера @@ -92,7 +93,7 @@ endmodule ![../.pic/Basic%20Verilog%20structures/controllers/fig_02.drawio.svg](../.pic/Basic%20Verilog%20structures/controllers/fig_02.drawio.svg) -Далее, спецификация накладывает ограничение на допустимые адреса и значения. Поэтому создадим вспомогательные сигналы, сигнализирующие о том, что текущий адрес соответствует одному из регистров контроллера, а данные для записи соответствуют диапазону допустимых значений этих регистров: +Помимо прочего, спецификация описывает адресное пространство контроллера. Поэтому создадим вспомогательные сигналы, сигнализирующие о том, что текущий адрес соответствует одному из регистров контроллера: ![../.pic/Basic%20Verilog%20structures/controllers/fig_03.drawio.svg](../.pic/Basic%20Verilog%20structures/controllers/fig_03.drawio.svg) @@ -100,21 +101,15 @@ endmodule ![../.pic/Basic%20Verilog%20structures/controllers/fig_04.drawio.svg](../.pic/Basic%20Verilog%20structures/controllers/fig_04.drawio.svg) -Продолжим описание контроллера, создав первый из **архитектурных регистров** — `led_val`. Запись в этот регистр возможна только в случае выполнения трех условий: - -* произошел **запрос на запись**; -* `addr_i == 0x00`; -* `write_data_i` находится в диапазоне [0:65535]. - -Создадим вспомогательный сигнал `val_en`, который будет равен единице только в случае выполнения этих трех условий: +Продолжим описание контроллера, создав первый из **архитектурных регистров** — `led_val`. Запись в этот регистр возможна только при запросе на запись по адресу `0x00`. Создадим вспомогательный сигнал `val_en`, который будет равен единице только в случае выполнения этих условий: ![../.pic/Basic%20Verilog%20structures/controllers/fig_05.drawio.svg](../.pic/Basic%20Verilog%20structures/controllers/fig_05.drawio.svg) Теперь реализация регистра `lev_val` становится совершенно тривиальной задачей, ведь у нас есть: -* сигнал сброса регистра `rst`; -* сигнал разрешения записи в регистр `val_en`; -* сигнал данных для записи в регистр `write_data_i`(из которого мы будем брать только младшие 16 бит данных). +- сигнал сброса регистра `rst`; +- сигнал разрешения записи в регистр `val_en`; +- сигнал данных для записи в регистр `write_data_i`(из которого мы будем брать только младшие 16 бит данных). ![../.pic/Basic%20Verilog%20structures/controllers/fig_06.drawio.svg](../.pic/Basic%20Verilog%20structures/controllers/fig_06.drawio.svg) @@ -129,16 +124,16 @@ endmodule Для реализации счета времени нам потребуется вспомогательный **неархитектурный регистр** `cntr`, который станет простейшим счетчиком со сбросом. Мы знаем, что тактовый сигнал нашей схемы будет работать с периодом в 10 МГц. Если каждый такт инкрементировать счетчик на единицу, то за одну секунду счетчик досчитает до 10 миллионов. Первой мыслью может показаться, что нам нужно, чтобы счетчик считал до 10 миллионов, дойдя до которых он бы сбрасывался в ноль, однако в этом случае у нас будут сложности при дальнейшей реализации. Будет куда удобней, если вместо этого счетчик будет считать до 20 миллионов (полного периода смены значения с `led_val` на `16'd0` и обратно). В этом случае, нам останется всего лишь добавить условие вывода значения на мультиплексор: -* пока значение счетчика меньше 10 миллионов, на выходе `led_o` будет значение `led_val` -* в противном случае, на выходе `led_o` будет значение `16'd0`. +- пока значение счетчика меньше 10 миллионов, на выходе `led_o` будет значение `led_val` +- в противном случае, на выходе `led_o` будет значение `16'd0`. Таким образом, поведение счетчика описывается следующим образом: -* счетчик сбрасывается, в следующих случаях: - * произошел сброс (`rst == 1`); - * произошло отключение "моргания" светодиодов (`led_mode == 0`); - * счетчик досчитал до 20 миллионов (`cntr >= 32'd20_000_000`); -* в остальных ситуациях, счетчик инкрементирует свое значение. +- счетчик сбрасывается, в следующих случаях: + - произошел сброс (`rst == 1`); + - произошло отключение "моргания" светодиодов (`led_mode == 0`); + - счетчик досчитал до 20 миллионов (`cntr >= 32'd20_000_000`); +- в остальных ситуациях, счетчик инкрементирует свое значение. ![../.pic/Basic%20Verilog%20structures/controllers/fig_08.drawio.svg](../.pic/Basic%20Verilog%20structures/controllers/fig_08.drawio.svg) @@ -146,9 +141,9 @@ endmodule На управление этим сигналом наложены следующие требования: -* изменения этого сигнала должны быть **синхронными** (значит перед выходным сигналом должен стоять регистр); -* в случае **запроса на чтение** по поддерживаемому адресу, данный сигнал должен принять значение ассоциированного с этим адресом регистра (дополнив это значение нулями в старших разрядах). -* в случае отсутствия **запроса на чтение**, или запроса на чтение по неподдерживаемому адресу, регистр должен сохранить значение +- изменения этого сигнала должны быть **синхронными** (значит перед выходным сигналом должен стоять регистр); +- в случае **запроса на чтение** по поддерживаемому адресу, данный сигнал должен принять значение ассоциированного с этим адресом регистра (дополнив это значение нулями в старших разрядах). +- в случае отсутствия **запроса на чтение**, или запроса на чтение по неподдерживаемому адресу, регистр должен сохранить значение Чтобы регистр сохранял значение между **запросами на чтение** по поддерживаемому адресу, добавим ему сигнал enable, а на вход данных подадим выход с мультиплексора, выбирающего между доступными источниками данных для чтения.