diff --git a/.pic/Labs/board files/nexys_rf1.jpg b/.pic/Labs/board files/nexys_rf1.jpg
deleted file mode 100644
index 3e2c492..0000000
Binary files a/.pic/Labs/board files/nexys_rf1.jpg and /dev/null differ
diff --git a/.pic/Labs/board files/nexys_rf2.jpg b/.pic/Labs/board files/nexys_rf2.jpg
deleted file mode 100644
index 0e9c72f..0000000
Binary files a/.pic/Labs/board files/nexys_rf2.jpg and /dev/null differ
diff --git a/.pic/Labs/board files/nexys_rf3.jpg b/.pic/Labs/board files/nexys_rf3.jpg
deleted file mode 100644
index e3008d9..0000000
Binary files a/.pic/Labs/board files/nexys_rf3.jpg and /dev/null differ
diff --git a/.pic/Labs/board files/nexys_rf4.jpg b/.pic/Labs/board files/nexys_rf4.jpg
deleted file mode 100644
index 66ec03b..0000000
Binary files a/.pic/Labs/board files/nexys_rf4.jpg and /dev/null differ
diff --git a/.pic/Labs/board files/nexys_rf5.jpg b/.pic/Labs/board files/nexys_rf5.jpg
deleted file mode 100644
index be36bb2..0000000
Binary files a/.pic/Labs/board files/nexys_rf5.jpg and /dev/null differ
diff --git a/.pic/Labs/board files/nexys_rf_riscv_control.drawio.svg b/.pic/Labs/board files/nexys_rf_riscv_control.drawio.svg
new file mode 100644
index 0000000..59af08a
--- /dev/null
+++ b/.pic/Labs/board files/nexys_rf_riscv_control.drawio.svg
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/.pic/Labs/board files/nexys_rf_riscv_read.drawio.svg b/.pic/Labs/board files/nexys_rf_riscv_read.drawio.svg
new file mode 100644
index 0000000..052a018
--- /dev/null
+++ b/.pic/Labs/board files/nexys_rf_riscv_read.drawio.svg
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/.pic/Labs/board files/nexys_rf_riscv_structure.drawio.svg b/.pic/Labs/board files/nexys_rf_riscv_structure.drawio.svg
new file mode 100644
index 0000000..30c8241
--- /dev/null
+++ b/.pic/Labs/board files/nexys_rf_riscv_structure.drawio.svg
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/.pic/Labs/board files/nexys_rf_riscv_write_addr_5.drawio.svg b/.pic/Labs/board files/nexys_rf_riscv_write_addr_5.drawio.svg
new file mode 100644
index 0000000..139d98d
--- /dev/null
+++ b/.pic/Labs/board files/nexys_rf_riscv_write_addr_5.drawio.svg
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/.pic/Labs/board files/nexys_rf_riscv_write_addr_6.drawio.svg b/.pic/Labs/board files/nexys_rf_riscv_write_addr_6.drawio.svg
new file mode 100644
index 0000000..90ee94f
--- /dev/null
+++ b/.pic/Labs/board files/nexys_rf_riscv_write_addr_6.drawio.svg
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/.pic/Labs/board files/nexys_rf_riscv_write_data_1234.drawio.svg b/.pic/Labs/board files/nexys_rf_riscv_write_data_1234.drawio.svg
new file mode 100644
index 0000000..5f6ffdf
--- /dev/null
+++ b/.pic/Labs/board files/nexys_rf_riscv_write_data_1234.drawio.svg
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/.pic/Labs/board files/nexys_rf_riscv_write_data_5678.drawio.svg b/.pic/Labs/board files/nexys_rf_riscv_write_data_5678.drawio.svg
new file mode 100644
index 0000000..5e2332e
--- /dev/null
+++ b/.pic/Labs/board files/nexys_rf_riscv_write_data_5678.drawio.svg
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/Labs/03. Register file and memory/board files/README.md b/Labs/03. Register file and memory/board files/README.md
index f4d6edf..ce89047 100644
--- a/Labs/03. Register file and memory/board files/README.md
+++ b/Labs/03. Register file and memory/board files/README.md
@@ -1,39 +1,101 @@
# Проверка работы регистрового файла на ПЛИС
-Если вы не понимаете, что лежит в этой папке, или если надо вспомнить, как прошить ПЛИС, можно воспользоваться [`этой инструкцией`](../../../Vivado%20Basics/How%20to%20program%20an%20fpga%20board.md)
+После того, как вы проверили на моделировании регистровый файл, вам необходимо проверить его работу на прототипе в ПЛИС.
-Для работы с регистровым файлом, необходимо выставлять сигналы адресов и данных.
-У платы недостаточно переключателей, для такого количества входов регистрового файла, поэтому подача сигналов на вход происходит в несколько этапов.
-Сперва можно ввести один из адресов регистрового файла (`A1`/`A2`/`A3`). Ввод осуществляется через `SW[4:0]`. Для того, чтобы выставить введенный адрес на какой-то из входов адреса, необходимо нажать одну из следующих кнопок:
+Инструкция по реализации прототипа описана [здесь](../../../Vivado%20Basics/How%20to%20program%20an%20fpga%20board.md).
-1. `BTNL` чтобы выставить значение с `SW[4:0]` на `A1`
-2. `BTNC` чтобы выставить значение с `SW[4:0]` на `A2`
-3. `BTNR` чтобы выставить значение с `SW[4:0]` на `A3`
+На _рис. 1_ представлена схема прототипа в ПЛИС.
-(расположение кнопок смотри на изображениях ниже).
+
-После выставления адресов, переключатели можно использовать в качестве ввода первых шестнадцате бит данных. Для записи введенных данных по адресу `A3` используется кнопка `BTND`, для чтения данных по адресам `A1`, `A2` (с выводом результатов чтения на семисегментные индикаторы) используется кнопка `BTNU`.
+_Рисунок 1. Структурная схема модуля `nexys_rf_riscv`._
-Управление регистровым файлом.
+## Описание используемой периферии
-
+Периферия показана на _рис. 2_.
-Ниже показан пример последовательности действий для работы с платой.
+
-Установка значения `5'b10101` на входы `A1`,`A2`,`A3`.
+_Рисунок 2. Периферия, доступная прототипу._
-
+- ### Переключатели и кнопки.
-Запись информации по адресу А3.
+ Для работы с регистровым файлом необходимо выставлять сигналы адресов и данных.
+ У платы недостаточно переключателей для такого количества входов регистрового файла, поэтому адреса и данные задаются одним источником ввода:
-
+ 1. Ввод **адресов** (`read_addr1_i`/`read_addr2_i`/`write_addr_i`) регистрового файла осуществляется через переключатели `SW[14:0]`. Соответствие следующее:
-Чтение по адресам А1 и А2.
+ - `SW[ 4: 0]` — `write_addr_i`
+ - `SW[ 9: 5]` — `read_addr2_i`
+ - `SW[14:10]` — `read_addr1_i`
-
+ Для того чтобы выставить введенные адреса на входные порты регистрового файла, необходимо нажать кнопку `BTND` (`addr_en` на _рис. 2_). Таким образом, происходит запоминание адресов в элемент памяти.
+ 1. Ввод **данных** (`write_data_i`) регистрового файла осуществляется через переключатели `SW[15:0]`. Таким образом, можно выставить только младшие 16 бит данных. Для записи введенных данных по адресу `write_addr_i` используется кнопка `BTNR` (`we` на _рис. 2_).
+- ### Светодиоды
-Для того чтобы считать информацию по любому адресу, достаточно установить желаемый адрес на один из портов чтения и нажать на кнопку чтения.
+ Светодиоды `LED[14:0]` отображают адреса (`read_addr1_i`/`read_addr2_i`/`write_addr_i`), которые выставлены в данный момент на порты регистрового файла:
-
+ - `LED[ 4: 0]` — `write_addr_i`
+ - `LED[ 9: 5]` — `read_addr2_i`
+ - `LED[14:10]` — `read_addr1_i`
-Попробуйте записать информацию в нулевой регистр, затем по другим адресам, после чего считайте записанную информацию и убедитесь, что она соответствует той, которую вы записывали (с учетом особенностей регистрового файла RISC-V).
+- ### Семисегментные индикаторы
+
+ На левом блоке семисегментных индикаторов (индикаторы 7-4) отображется значение младших 16-ти бит порта `read_data1_o`, а на правом блоке семисегментных индикаторов (индикаторы 3-0) отображается значение младших 16-ти бит порта `read_data2_o`.
+
+ Числа отображаются в **шестнадцатеричном** формате.
+
+## Выполнение операций с регистровым файлом на прототипе
+
+Доступные операции: запись, чтение.
+
+- ### Запись
+
+ Рассмотрим последовательность действий, которые надо осуществить для записи в регистровый файл, на примере.
+
+ 1. Запишем значение `0x1234` в регистр `5`.
+
+ 1. Сразу после прошивки, как видно по негорящим светодиодам, на портах регистрового файла выставлены нулевые адреса. Нам нужно изменить адрес записи, поэтому выставим на переключателях значение `5` и нажмем кнопку `BTND` (см. _рис. 3_).
+
+ 
+
+ _Рисунок 3. Выставление адреса `5` на порт `write_addr_i` регистрового файла._
+
+ Обратите внимание: на светодиодах сразу после нажатия кнопки отображается адрес `5`.
+ 1. Чтобы записать данные в указанный (пятый) регистр, выставим на переключателях значение `0x1234` и нажмем кнопку `BTNR` (см. _рис. 4_).
+
+ 
+
+ _Рисунок 4. Запись `0x1234` в регистр `5`._
+
+ 1. Запишем значение `0x5678` в регистр `6`.
+
+ 1. Выставим на блок переключателей, отвечающих за порт записи, значение `6` и нажмем кнопку `BTND` (см. _рис. 5_).
+
+ 
+
+ _Рисунок 5. Выставление адреса `6` на порт `write_addr_i` регистрового файла._
+
+ Обратите внимание: на светодиодах сразу после нажатия кнопки отображается адрес `6`.
+ 1. Чтобы записать данные в указанный (шестой) регистр, выставим на переключателях значение `0x5678` и нажмем кнопку `BTNR` (см. _рис. 6_).
+
+ 
+
+ _Рисунок 6. Запись `0x5678` в регистр `6`._
+
+- ### Чтение
+
+ Рассмотрим последовательность действий, которые надо осуществить для чтения из регистрового файла, на примере. Прочитаем из регистров `5` и `6` заранее записанные значения `0x1234` и `0x5678` соответственно и выведем его на оба блока семисегментных индикаторов 7-0 и 3-0.
+
+ Выставим значение `5` и `6` на блоки переключателей `ra1` и `ra2` (см. _рис. 2_) соответственно, и нажмем кнопку `BTND`, чтобы обновить адрес значением с переключателей (см. _рис. 7_).
+
+ 
+
+ _Рисунок 7. Чтение из регистров `5` и `6`._
+
+ Обратите внимание на то, что для чтения достаточно выставить нужный адрес на порт регистрового файла, и содержимое регистра оказывается считанным.
+
+> [!NOTE]
+> Кнопка сброса `CPU_RESETN` не сбрасывает содержимое регистрового файла, т.к. сигнал сброса не заведен в модуль регистрового файла, а модуль `nexys_rf_riscv` самостоятельно его не сбрасывает. Для сброса можно осуществить перепрошивку ПЛИС.
+
+Попробуйте записать информацию в нулевой регистр, затем по другим адресам. После чего считайте записанную информацию и убедитесь, что она соответствует той, которую вы записывали (с учетом особенностей регистрового файла RISC-V).
diff --git a/Labs/03. Register file and memory/board files/nexys_a7_100t.xdc b/Labs/03. Register file and memory/board files/nexys_a7_100t.xdc
index a27cb13..63b6e46 100644
--- a/Labs/03. Register file and memory/board files/nexys_a7_100t.xdc
+++ b/Labs/03. Register file and memory/board files/nexys_a7_100t.xdc
@@ -4,79 +4,79 @@
## - rename the used ports (in each line, after get_ports) according to the top level signal names in the project
# Clock signal
-set_property -dict { PACKAGE_PIN E3 IOSTANDARD LVCMOS33 } [get_ports { CLK100 }]; #IO_L12P_T1_MRCC_35 Sch=clk100mhz
-create_clock -add -name sys_clk_pin -period 10.00 -waveform {0 5} [get_ports {CLK100}];
+set_property -dict { PACKAGE_PIN E3 IOSTANDARD LVCMOS33 } [get_ports { clk_i }]; #IO_L12P_T1_MRCC_35 Sch=clk100mhz
+create_clock -add -name sys_clk_pin -period 10.00 -waveform {0 5} [get_ports {clk_i}];
#Switches
-set_property -dict { PACKAGE_PIN J15 IOSTANDARD LVCMOS33 } [get_ports { SW[0] }]; #IO_L24N_T3_RS0_15 Sch=sw[0]
-set_property -dict { PACKAGE_PIN L16 IOSTANDARD LVCMOS33 } [get_ports { SW[1] }]; #IO_L3N_T0_DQS_EMCCLK_14 Sch=sw[1]
-set_property -dict { PACKAGE_PIN M13 IOSTANDARD LVCMOS33 } [get_ports { SW[2] }]; #IO_L6N_T0_D08_VREF_14 Sch=sw[2]
-set_property -dict { PACKAGE_PIN R15 IOSTANDARD LVCMOS33 } [get_ports { SW[3] }]; #IO_L13N_T2_MRCC_14 Sch=sw[3]
-set_property -dict { PACKAGE_PIN R17 IOSTANDARD LVCMOS33 } [get_ports { SW[4] }]; #IO_L12N_T1_MRCC_14 Sch=sw[4]
-set_property -dict { PACKAGE_PIN T18 IOSTANDARD LVCMOS33 } [get_ports { SW[5] }]; #IO_L7N_T1_D10_14 Sch=sw[5]
-set_property -dict { PACKAGE_PIN U18 IOSTANDARD LVCMOS33 } [get_ports { SW[6] }]; #IO_L17N_T2_A13_D29_14 Sch=sw[6]
-set_property -dict { PACKAGE_PIN R13 IOSTANDARD LVCMOS33 } [get_ports { SW[7] }]; #IO_L5N_T0_D07_14 Sch=sw[7]
-set_property -dict { PACKAGE_PIN T8 IOSTANDARD LVCMOS18 } [get_ports { SW[8] }]; #IO_L24N_T3_34 Sch=sw[8]
-set_property -dict { PACKAGE_PIN U8 IOSTANDARD LVCMOS18 } [get_ports { SW[9] }]; #IO_25_34 Sch=sw[9]
-set_property -dict { PACKAGE_PIN R16 IOSTANDARD LVCMOS33 } [get_ports { SW[10] }]; #IO_L15P_T2_DQS_RDWR_B_14 Sch=sw[10]
-set_property -dict { PACKAGE_PIN T13 IOSTANDARD LVCMOS33 } [get_ports { SW[11] }]; #IO_L23P_T3_A03_D19_14 Sch=sw[11]
-set_property -dict { PACKAGE_PIN H6 IOSTANDARD LVCMOS33 } [get_ports { SW[12] }]; #IO_L24P_T3_35 Sch=sw[12]
-set_property -dict { PACKAGE_PIN U12 IOSTANDARD LVCMOS33 } [get_ports { SW[13] }]; #IO_L20P_T3_A08_D24_14 Sch=sw[13]
-set_property -dict { PACKAGE_PIN U11 IOSTANDARD LVCMOS33 } [get_ports { SW[14] }]; #IO_L19N_T3_A09_D25_VREF_14 Sch=sw[14]
-set_property -dict { PACKAGE_PIN V10 IOSTANDARD LVCMOS33 } [get_ports { SW[15] }]; #IO_L21P_T3_DQS_14 Sch=sw[15]
+set_property -dict { PACKAGE_PIN J15 IOSTANDARD LVCMOS33 } [get_ports { sw_i[0] }]; #IO_L24N_T3_RS0_15 Sch=sw[0]
+set_property -dict { PACKAGE_PIN L16 IOSTANDARD LVCMOS33 } [get_ports { sw_i[1] }]; #IO_L3N_T0_DQS_EMCCLK_14 Sch=sw[1]
+set_property -dict { PACKAGE_PIN M13 IOSTANDARD LVCMOS33 } [get_ports { sw_i[2] }]; #IO_L6N_T0_D08_VREF_14 Sch=sw[2]
+set_property -dict { PACKAGE_PIN R15 IOSTANDARD LVCMOS33 } [get_ports { sw_i[3] }]; #IO_L13N_T2_MRCC_14 Sch=sw[3]
+set_property -dict { PACKAGE_PIN R17 IOSTANDARD LVCMOS33 } [get_ports { sw_i[4] }]; #IO_L12N_T1_MRCC_14 Sch=sw[4]
+set_property -dict { PACKAGE_PIN T18 IOSTANDARD LVCMOS33 } [get_ports { sw_i[5] }]; #IO_L7N_T1_D10_14 Sch=sw[5]
+set_property -dict { PACKAGE_PIN U18 IOSTANDARD LVCMOS33 } [get_ports { sw_i[6] }]; #IO_L17N_T2_A13_D29_14 Sch=sw[6]
+set_property -dict { PACKAGE_PIN R13 IOSTANDARD LVCMOS33 } [get_ports { sw_i[7] }]; #IO_L5N_T0_D07_14 Sch=sw[7]
+set_property -dict { PACKAGE_PIN T8 IOSTANDARD LVCMOS18 } [get_ports { sw_i[8] }]; #IO_L24N_T3_34 Sch=sw[8]
+set_property -dict { PACKAGE_PIN U8 IOSTANDARD LVCMOS18 } [get_ports { sw_i[9] }]; #IO_25_34 Sch=sw[9]
+set_property -dict { PACKAGE_PIN R16 IOSTANDARD LVCMOS33 } [get_ports { sw_i[10] }]; #IO_L15P_T2_DQS_RDWR_B_14 Sch=sw[10]
+set_property -dict { PACKAGE_PIN T13 IOSTANDARD LVCMOS33 } [get_ports { sw_i[11] }]; #IO_L23P_T3_A03_D19_14 Sch=sw[11]
+set_property -dict { PACKAGE_PIN H6 IOSTANDARD LVCMOS33 } [get_ports { sw_i[12] }]; #IO_L24P_T3_35 Sch=sw[12]
+set_property -dict { PACKAGE_PIN U12 IOSTANDARD LVCMOS33 } [get_ports { sw_i[13] }]; #IO_L20P_T3_A08_D24_14 Sch=sw[13]
+set_property -dict { PACKAGE_PIN U11 IOSTANDARD LVCMOS33 } [get_ports { sw_i[14] }]; #IO_L19N_T3_A09_D25_VREF_14 Sch=sw[14]
+set_property -dict { PACKAGE_PIN V10 IOSTANDARD LVCMOS33 } [get_ports { sw_i[15] }]; #IO_L21P_T3_DQS_14 Sch=sw[15]
### LEDs
-set_property -dict { PACKAGE_PIN H17 IOSTANDARD LVCMOS33 } [get_ports { LED[0] }]; #IO_L18P_T2_A24_15 Sch=led[0]
-set_property -dict { PACKAGE_PIN K15 IOSTANDARD LVCMOS33 } [get_ports { LED[1] }]; #IO_L24P_T3_RS1_15 Sch=led[1]
-set_property -dict { PACKAGE_PIN J13 IOSTANDARD LVCMOS33 } [get_ports { LED[2] }]; #IO_L17N_T2_A25_15 Sch=led[2]
-set_property -dict { PACKAGE_PIN N14 IOSTANDARD LVCMOS33 } [get_ports { LED[3] }]; #IO_L8P_T1_D11_14 Sch=led[3]
-set_property -dict { PACKAGE_PIN R18 IOSTANDARD LVCMOS33 } [get_ports { LED[4] }]; #IO_L7P_T1_D09_14 Sch=led[4]
-set_property -dict { PACKAGE_PIN V17 IOSTANDARD LVCMOS33 } [get_ports { LED[5] }]; #IO_L18N_T2_A11_D27_14 Sch=led[5]
-set_property -dict { PACKAGE_PIN U17 IOSTANDARD LVCMOS33 } [get_ports { LED[6] }]; #IO_L17P_T2_A14_D30_14 Sch=led[6]
-set_property -dict { PACKAGE_PIN U16 IOSTANDARD LVCMOS33 } [get_ports { LED[7] }]; #IO_L18P_T2_A12_D28_14 Sch=led[7]
-set_property -dict { PACKAGE_PIN V16 IOSTANDARD LVCMOS33 } [get_ports { LED[8] }]; #IO_L16N_T2_A15_D31_14 Sch=led[8]
-set_property -dict { PACKAGE_PIN T15 IOSTANDARD LVCMOS33 } [get_ports { LED[9] }]; #IO_L14N_T2_SRCC_14 Sch=led[9]
-set_property -dict { PACKAGE_PIN U14 IOSTANDARD LVCMOS33 } [get_ports { LED[10] }]; #IO_L22P_T3_A05_D21_14 Sch=led[10]
-set_property -dict { PACKAGE_PIN T16 IOSTANDARD LVCMOS33 } [get_ports { LED[11] }]; #IO_L15N_T2_DQS_DOUT_CSO_B_14 Sch=led[11]
-set_property -dict { PACKAGE_PIN V15 IOSTANDARD LVCMOS33 } [get_ports { LED[12] }]; #IO_L16P_T2_CSI_B_14 Sch=led[12]
-set_property -dict { PACKAGE_PIN V14 IOSTANDARD LVCMOS33 } [get_ports { LED[13] }]; #IO_L22N_T3_A04_D20_14 Sch=led[13]
-set_property -dict { PACKAGE_PIN V12 IOSTANDARD LVCMOS33 } [get_ports { LED[14] }]; #IO_L20N_T3_A07_D23_14 Sch=led[14]
-set_property -dict { PACKAGE_PIN V11 IOSTANDARD LVCMOS33 } [get_ports { LED[15] }]; #IO_L21N_T3_DQS_A06_D22_14 Sch=led[15]
+set_property -dict { PACKAGE_PIN H17 IOSTANDARD LVCMOS33 } [get_ports { led_o[0] }]; #IO_L18P_T2_A24_15 Sch=led[0]
+set_property -dict { PACKAGE_PIN K15 IOSTANDARD LVCMOS33 } [get_ports { led_o[1] }]; #IO_L24P_T3_RS1_15 Sch=led[1]
+set_property -dict { PACKAGE_PIN J13 IOSTANDARD LVCMOS33 } [get_ports { led_o[2] }]; #IO_L17N_T2_A25_15 Sch=led[2]
+set_property -dict { PACKAGE_PIN N14 IOSTANDARD LVCMOS33 } [get_ports { led_o[3] }]; #IO_L8P_T1_D11_14 Sch=led[3]
+set_property -dict { PACKAGE_PIN R18 IOSTANDARD LVCMOS33 } [get_ports { led_o[4] }]; #IO_L7P_T1_D09_14 Sch=led[4]
+set_property -dict { PACKAGE_PIN V17 IOSTANDARD LVCMOS33 } [get_ports { led_o[5] }]; #IO_L18N_T2_A11_D27_14 Sch=led[5]
+set_property -dict { PACKAGE_PIN U17 IOSTANDARD LVCMOS33 } [get_ports { led_o[6] }]; #IO_L17P_T2_A14_D30_14 Sch=led[6]
+set_property -dict { PACKAGE_PIN U16 IOSTANDARD LVCMOS33 } [get_ports { led_o[7] }]; #IO_L18P_T2_A12_D28_14 Sch=led[7]
+set_property -dict { PACKAGE_PIN V16 IOSTANDARD LVCMOS33 } [get_ports { led_o[8] }]; #IO_L16N_T2_A15_D31_14 Sch=led[8]
+set_property -dict { PACKAGE_PIN T15 IOSTANDARD LVCMOS33 } [get_ports { led_o[9] }]; #IO_L14N_T2_SRCC_14 Sch=led[9]
+set_property -dict { PACKAGE_PIN U14 IOSTANDARD LVCMOS33 } [get_ports { led_o[10] }]; #IO_L22P_T3_A05_D21_14 Sch=led[10]
+set_property -dict { PACKAGE_PIN T16 IOSTANDARD LVCMOS33 } [get_ports { led_o[11] }]; #IO_L15N_T2_DQS_DOUT_CSO_B_14 Sch=led[11]
+set_property -dict { PACKAGE_PIN V15 IOSTANDARD LVCMOS33 } [get_ports { led_o[12] }]; #IO_L16P_T2_CSI_B_14 Sch=led[12]
+set_property -dict { PACKAGE_PIN V14 IOSTANDARD LVCMOS33 } [get_ports { led_o[13] }]; #IO_L22N_T3_A04_D20_14 Sch=led[13]
+set_property -dict { PACKAGE_PIN V12 IOSTANDARD LVCMOS33 } [get_ports { led_o[14] }]; #IO_L20N_T3_A07_D23_14 Sch=led[14]
+set_property -dict { PACKAGE_PIN V11 IOSTANDARD LVCMOS33 } [get_ports { led_o[15] }]; #IO_L21N_T3_DQS_A06_D22_14 Sch=led[15]
## RGB LEDs
-set_property -dict { PACKAGE_PIN R12 IOSTANDARD LVCMOS33 } [get_ports { LED16_B }]; #IO_L5P_T0_D06_14 Sch=led16_b
-set_property -dict { PACKAGE_PIN M16 IOSTANDARD LVCMOS33 } [get_ports { LED16_G }]; #IO_L10P_T1_D14_14 Sch=led16_g
-set_property -dict { PACKAGE_PIN N15 IOSTANDARD LVCMOS33 } [get_ports { LED16_R }]; #IO_L11P_T1_SRCC_14 Sch=led16_r
-set_property -dict { PACKAGE_PIN G14 IOSTANDARD LVCMOS33 } [get_ports { LED17_B }]; #IO_L15N_T2_DQS_ADV_B_15 Sch=led17_b
-set_property -dict { PACKAGE_PIN R11 IOSTANDARD LVCMOS33 } [get_ports { LED17_G }]; #IO_0_14 Sch=led17_g
-set_property -dict { PACKAGE_PIN N16 IOSTANDARD LVCMOS33 } [get_ports { LED17_R }]; #IO_L11N_T1_SRCC_14 Sch=led17_r
+#set_property -dict { PACKAGE_PIN R12 IOSTANDARD LVCMOS33 } [get_ports { LED16_B }]; #IO_L5P_T0_D06_14 Sch=led16_b
+#set_property -dict { PACKAGE_PIN M16 IOSTANDARD LVCMOS33 } [get_ports { LED16_G }]; #IO_L10P_T1_D14_14 Sch=led16_g
+#set_property -dict { PACKAGE_PIN N15 IOSTANDARD LVCMOS33 } [get_ports { LED16_R }]; #IO_L11P_T1_SRCC_14 Sch=led16_r
+#set_property -dict { PACKAGE_PIN G14 IOSTANDARD LVCMOS33 } [get_ports { LED17_B }]; #IO_L15N_T2_DQS_ADV_B_15 Sch=led17_b
+#set_property -dict { PACKAGE_PIN R11 IOSTANDARD LVCMOS33 } [get_ports { LED17_G }]; #IO_0_14 Sch=led17_g
+#set_property -dict { PACKAGE_PIN N16 IOSTANDARD LVCMOS33 } [get_ports { LED17_R }]; #IO_L11N_T1_SRCC_14 Sch=led17_r
##7 segment display
-set_property -dict { PACKAGE_PIN T10 IOSTANDARD LVCMOS33 } [get_ports { CA }]; #IO_L24N_T3_A00_D16_14 Sch=ca
-set_property -dict { PACKAGE_PIN R10 IOSTANDARD LVCMOS33 } [get_ports { CB }]; #IO_25_14 Sch=cb
-set_property -dict { PACKAGE_PIN K16 IOSTANDARD LVCMOS33 } [get_ports { CC }]; #IO_25_15 Sch=cc
-set_property -dict { PACKAGE_PIN K13 IOSTANDARD LVCMOS33 } [get_ports { CD }]; #IO_L17P_T2_A26_15 Sch=cd
-set_property -dict { PACKAGE_PIN P15 IOSTANDARD LVCMOS33 } [get_ports { CE }]; #IO_L13P_T2_MRCC_14 Sch=ce
-set_property -dict { PACKAGE_PIN T11 IOSTANDARD LVCMOS33 } [get_ports { CF }]; #IO_L19P_T3_A10_D26_14 Sch=cf
-set_property -dict { PACKAGE_PIN L18 IOSTANDARD LVCMOS33 } [get_ports { CG }]; #IO_L4P_T0_D04_14 Sch=cg
-set_property -dict { PACKAGE_PIN H15 IOSTANDARD LVCMOS33 } [get_ports { DP }]; #IO_L19N_T3_A21_VREF_15 Sch=dp
-set_property -dict { PACKAGE_PIN J17 IOSTANDARD LVCMOS33 } [get_ports { AN[0] }]; #IO_L23P_T3_FOE_B_15 Sch=an[0]
-set_property -dict { PACKAGE_PIN J18 IOSTANDARD LVCMOS33 } [get_ports { AN[1] }]; #IO_L23N_T3_FWE_B_15 Sch=an[1]
-set_property -dict { PACKAGE_PIN T9 IOSTANDARD LVCMOS33 } [get_ports { AN[2] }]; #IO_L24P_T3_A01_D17_14 Sch=an[2]
-set_property -dict { PACKAGE_PIN J14 IOSTANDARD LVCMOS33 } [get_ports { AN[3] }]; #IO_L19P_T3_A22_15 Sch=an[3]
-set_property -dict { PACKAGE_PIN P14 IOSTANDARD LVCMOS33 } [get_ports { AN[4] }]; #IO_L8N_T1_D12_14 Sch=an[4]
-set_property -dict { PACKAGE_PIN T14 IOSTANDARD LVCMOS33 } [get_ports { AN[5] }]; #IO_L14P_T2_SRCC_14 Sch=an[5]
-set_property -dict { PACKAGE_PIN K2 IOSTANDARD LVCMOS33 } [get_ports { AN[6] }]; #IO_L23P_T3_35 Sch=an[6]
-set_property -dict { PACKAGE_PIN U13 IOSTANDARD LVCMOS33 } [get_ports { AN[7] }]; #IO_L23N_T3_A02_D18_14 Sch=an[7]
+set_property -dict { PACKAGE_PIN T10 IOSTANDARD LVCMOS33 } [get_ports { ca_o }]; #IO_L24N_T3_A00_D16_14 Sch=ca
+set_property -dict { PACKAGE_PIN R10 IOSTANDARD LVCMOS33 } [get_ports { cb_o }]; #IO_25_14 Sch=cb
+set_property -dict { PACKAGE_PIN K16 IOSTANDARD LVCMOS33 } [get_ports { cc_o }]; #IO_25_15 Sch=cc
+set_property -dict { PACKAGE_PIN K13 IOSTANDARD LVCMOS33 } [get_ports { cd_o }]; #IO_L17P_T2_A26_15 Sch=cd
+set_property -dict { PACKAGE_PIN P15 IOSTANDARD LVCMOS33 } [get_ports { ce_o }]; #IO_L13P_T2_MRCC_14 Sch=ce
+set_property -dict { PACKAGE_PIN T11 IOSTANDARD LVCMOS33 } [get_ports { cf_o }]; #IO_L19P_T3_A10_D26_14 Sch=cf
+set_property -dict { PACKAGE_PIN L18 IOSTANDARD LVCMOS33 } [get_ports { cg_o }]; #IO_L4P_T0_D04_14 Sch=cg
+set_property -dict { PACKAGE_PIN H15 IOSTANDARD LVCMOS33 } [get_ports { dp_o }]; #IO_L19N_T3_A21_VREF_15 Sch=dp
+set_property -dict { PACKAGE_PIN J17 IOSTANDARD LVCMOS33 } [get_ports { an_o[0] }]; #IO_L23P_T3_FOE_B_15 Sch=an[0]
+set_property -dict { PACKAGE_PIN J18 IOSTANDARD LVCMOS33 } [get_ports { an_o[1] }]; #IO_L23N_T3_FWE_B_15 Sch=an[1]
+set_property -dict { PACKAGE_PIN T9 IOSTANDARD LVCMOS33 } [get_ports { an_o[2] }]; #IO_L24P_T3_A01_D17_14 Sch=an[2]
+set_property -dict { PACKAGE_PIN J14 IOSTANDARD LVCMOS33 } [get_ports { an_o[3] }]; #IO_L19P_T3_A22_15 Sch=an[3]
+set_property -dict { PACKAGE_PIN P14 IOSTANDARD LVCMOS33 } [get_ports { an_o[4] }]; #IO_L8N_T1_D12_14 Sch=an[4]
+set_property -dict { PACKAGE_PIN T14 IOSTANDARD LVCMOS33 } [get_ports { an_o[5] }]; #IO_L14P_T2_SRCC_14 Sch=an[5]
+set_property -dict { PACKAGE_PIN K2 IOSTANDARD LVCMOS33 } [get_ports { an_o[6] }]; #IO_L23P_T3_35 Sch=an[6]
+set_property -dict { PACKAGE_PIN U13 IOSTANDARD LVCMOS33 } [get_ports { an_o[7] }]; #IO_L23N_T3_A02_D18_14 Sch=an[7]
##Buttons
-set_property -dict { PACKAGE_PIN C12 IOSTANDARD LVCMOS33 } [get_ports { resetn }]; #IO_L3P_T0_DQS_AD1P_15 Sch=cpu_resetn
-set_property -dict { PACKAGE_PIN N17 IOSTANDARD LVCMOS33 } [get_ports { BTNC }]; #IO_L9P_T1_DQS_14 Sch=btnc
-set_property -dict { PACKAGE_PIN M18 IOSTANDARD LVCMOS33 } [get_ports { BTNU }]; #IO_L4N_T0_D05_14 Sch=btnu
-set_property -dict { PACKAGE_PIN P17 IOSTANDARD LVCMOS33 } [get_ports { BTNL }]; #IO_L12P_T1_MRCC_14 Sch=btnl
-set_property -dict { PACKAGE_PIN M17 IOSTANDARD LVCMOS33 } [get_ports { BTNR }]; #IO_L10N_T1_D15_14 Sch=btnr
-set_property -dict { PACKAGE_PIN P18 IOSTANDARD LVCMOS33 } [get_ports { BTND }]; #IO_L9N_T1_DQS_D13_14 Sch=btnd
+set_property -dict { PACKAGE_PIN C12 IOSTANDARD LVCMOS33 } [get_ports { arstn_i }]; #IO_L3P_T0_DQS_AD1P_15 Sch=cpu_resetn
+#set_property -dict { PACKAGE_PIN N17 IOSTANDARD LVCMOS33 } [get_ports { BTNC }]; #IO_L9P_T1_DQS_14 Sch=btnc
+#set_property -dict { PACKAGE_PIN M18 IOSTANDARD LVCMOS33 } [get_ports { BTNU }]; #IO_L4N_T0_D05_14 Sch=btnu
+#set_property -dict { PACKAGE_PIN P17 IOSTANDARD LVCMOS33 } [get_ports { BTNL }]; #IO_L12P_T1_MRCC_14 Sch=btnl
+set_property -dict { PACKAGE_PIN M17 IOSTANDARD LVCMOS33 } [get_ports { btnr_i }]; #IO_L10N_T1_D15_14 Sch=btnr
+set_property -dict { PACKAGE_PIN P18 IOSTANDARD LVCMOS33 } [get_ports { btnd_i }]; #IO_L9N_T1_DQS_D13_14 Sch=btnd
##Pmod Headers
@@ -208,4 +208,4 @@ set_property -dict { PACKAGE_PIN P18 IOSTANDARD LVCMOS33 } [get_ports { BTND }
#set_property -dict { PACKAGE_PIN K18 IOSTANDARD LVCMOS33 } [get_ports { QSPI_DQ[1] }]; #IO_L1N_T0_D01_DIN_14 Sch=qspi_dq[1]
#set_property -dict { PACKAGE_PIN L14 IOSTANDARD LVCMOS33 } [get_ports { QSPI_DQ[2] }]; #IO_L2P_T0_D02_14 Sch=qspi_dq[2]
#set_property -dict { PACKAGE_PIN M14 IOSTANDARD LVCMOS33 } [get_ports { QSPI_DQ[3] }]; #IO_L2N_T0_D03_14 Sch=qspi_dq[3]
-#set_property -dict { PACKAGE_PIN L13 IOSTANDARD LVCMOS33 } [get_ports { QSPI_CSN }]; #IO_L6P_T0_FCS_B_14 Sch=qspi_csn
\ No newline at end of file
+#set_property -dict { PACKAGE_PIN L13 IOSTANDARD LVCMOS33 } [get_ports { QSPI_CSN }]; #IO_L6P_T0_FCS_B_14 Sch=qspi_csn
diff --git a/Labs/03. Register file and memory/board files/nexys_rf_riscv.sv b/Labs/03. Register file and memory/board files/nexys_rf_riscv.sv
index 5505fe4..02b494c 100644
--- a/Labs/03. Register file and memory/board files/nexys_rf_riscv.sv
+++ b/Labs/03. Register file and memory/board files/nexys_rf_riscv.sv
@@ -2,147 +2,143 @@
* Project Name : Architectures of Processor Systems (APS) lab work
* Organization : National Research University of Electronic Technology (MIET)
* Department : Institute of Microdevices and Control Systems
-* Author(s) : Nikita Bulavin
-* Email(s) : nekkit6@edu.miet.ru
+* Author(s) : Alexander Kharlamov
+* Email(s) : sasha_xarlamov@org.miet.ru
See https://github.com/MPSU/APS/blob/master/LICENSE file for licensing details.
* ------------------------------------------------------------------------------
*/
module nexys_rf_riscv(
- input CLK100,
- input resetn,
- input BTND, BTNU, BTNL, BTNR, BTNC,
- input [15:0] SW,
- output [15:0] LED,
- output CA, CB, CC, CD, CE, CF, CG, DP,
- output [7:0] AN,
- output LED16_B, LED16_G, LED16_R, LED17_B, LED17_G, LED17_R
- );
-
-wire [31:0] WD3;
-wire WE;
-wire [31:0] RD1;
-wire [31:0] RD2;
-
-localparam pwm = 1000;
-reg [9:0] counter;
-reg [3:0] semseg;
-reg [7:0] ANreg;
-reg CAr, CBr, CCr, CDr, CEr, CFr, CGr, DPr;
-reg [15:0] LEDr;
-
-reg [4:0] a1;
-reg [4:0] a2;
-reg [4:0] a3;
-reg [31:0] rd1;
-reg [31:0] rd2;
-
-rf_riscv DUT
-(
- .clk_i (CLK100 ),
- .read_addr1_i (a1 ),
- .read_addr2_i (a2 ),
- .write_addr_i (a3 ),
- .write_data_i (WD3 ),
- .write_enable_i (WE ),
- .read_data1_o (RD1 ),
- .read_data2_o (RD2 )
+ input logic clk_i,
+ input logic arstn_i,
+ input logic [15:0] sw_i,
+ input logic btnd_i,
+ input logic btnr_i,
+ output logic [15:0] led_o,
+ output logic ca_o,
+ output logic cb_o,
+ output logic cc_o,
+ output logic cd_o,
+ output logic ce_o,
+ output logic cf_o,
+ output logic cg_o,
+ output logic dp_o,
+ output logic [ 7:0] an_o
);
-assign LED = {1'b0, a1, a2, a3};
-assign AN[7:0] = ANreg[7:0];
-assign {CA, CB, CC, CD, CE, CF, CG, DP} = {CAr, CBr, CCr, CDr, CEr, CFr, CGr, DPr};
-assign LED16_G = BTNC | BTNR;
-assign LED17_G = BTNL | BTNR;
-assign {LED16_R, LED17_R} = {2{BTND}};
-assign {LED16_B, LED17_B} = {2{BTNU}};
+ logic [ 4:0] ra1;
+ logic [ 4:0] ra2;
+ logic [ 4:0] wa;
+ logic [31:0] wd;
+ logic we;
+ logic [7:0][3:0] rd1;
+ logic [7:0][3:0] rd2;
-assign WD3 = 32'b0 | SW[15:0];
-assign WE = BTND;
+ rf_riscv rf_riscv (
+ .clk_i (clk_i),
+ .read_addr1_i (ra1 ),
+ .read_addr2_i (ra2 ),
+ .write_addr_i (wa ),
+ .write_data_i (wd ),
+ .write_enable_i (we ),
+ .read_data1_o (rd1 ),
+ .read_data2_o (rd2 )
+ );
+ function automatic logic [6:0] hex2semseg(input logic [3:0] hex);
+ unique case (hex)
+ 4'h0: return 7'b0000001;
+ 4'h1: return 7'b1001111;
+ 4'h2: return 7'b0010010;
+ 4'h3: return 7'b0000110;
+ 4'h4: return 7'b1001100;
+ 4'h5: return 7'b0100100;
+ 4'h6: return 7'b0100000;
+ 4'h7: return 7'b0001111;
+ 4'h8: return 7'b0000000;
+ 4'h9: return 7'b0000100;
+ 4'hA: return 7'b0001000;
+ 4'hB: return 7'b1100000;
+ 4'hC: return 7'b0110001;
+ 4'hD: return 7'b1000010;
+ 4'hE: return 7'b0110000;
+ 4'hF: return 7'b0111000;
+ endcase
+ endfunction
-always @(posedge CLK100) begin
- if (!resetn) begin
- counter <= 'b0;
- ANreg[7:0] <= 8'b11111111;
- {CAr, CBr, CCr, CDr, CEr, CFr, CGr, DPr} <= 8'b11111111;
- {a1, a2, a3} <= 'b0;
- {rd1, rd2} <= 'b0;
- end
- else begin
- if (counter < pwm) counter = counter + 'b1;
- else begin
- counter = 'b0;
- ANreg[1] <= ANreg[0];
- ANreg[2] <= ANreg[1];
- ANreg[3] <= ANreg[2];
- ANreg[4] <= ANreg[3];
- ANreg[5] <= ANreg[4];
- ANreg[6] <= ANreg[5];
- ANreg[7] <= ANreg[6];
- ANreg[0] <= !(ANreg[6:0] == 7'b1111111);
- end
- a1 <= BTNL? SW[4:0]: a1;
- a2 <= BTNC? SW[4:0]: a2;
- a3 <= BTNR? SW[4:0]: a3;
-
- rd1 <= BTNU? RD1: rd1;
- rd2 <= BTNU? RD2: rd2;
-
- case (1'b0)
- ANreg[0]: begin
- semseg <= (rd2) % 5'h10;
- //DPr <= 1'b1;
- end
- ANreg[1]: begin
- semseg <= (rd2 / 'h10) % 5'h10;
- //DPr <= 1'b1;
- end
- ANreg[2]: begin
- semseg <= (rd2 / 'h100) % 5'h10;
- //DPr <= 1'b1;
- end
- ANreg[3]: begin
- semseg <= (rd2 / 'h1000) % 5'h10;
- //DPr <= 1'b1;
- end
- ANreg[4]: begin
- semseg <= (rd1) % 5'h10;
- //DPr <= 1'b1;
- end
- ANreg[5]: begin
- semseg <= (rd1 / 'h10) % 5'h10;
- //DPr <= 1'b1;
- end
- ANreg[6]: begin
- semseg <= (rd1 / 'h100) % 5'h10;
- //DPr <= 1'b1;
- end
- ANreg[7]: begin
- semseg <= (rd1 / 'h1000) % 5'h10;
- //DPr <= 1'b1;
- end
- endcase
- case (semseg)
- 4'h0: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b0000001;
- 4'h1: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b1001111;
- 4'h2: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b0010010;
- 4'h3: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b0000110;
- 4'h4: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b1001100;
- 4'h5: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b0100100;
- 4'h6: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b0100000;
- 4'h7: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b0001111;
- 4'h8: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b0000000;
- 4'h9: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b0000100;
- 4'hA: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b0001000;
- 4'hB: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b1100000;
- 4'hC: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b0110001;
- 4'hD: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b1000010;
- 4'hE: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b0110000;
- 4'hF: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b0111000;
- default: {CAr,CBr,CCr,CDr, CEr, CFr, CGr} <= 7'b0111111;
- endcase
- end
+ localparam int COUNTER_WIDTH = 10;
+ logic [COUNTER_WIDTH-1:0] counter_next;
+ logic [COUNTER_WIDTH-1:0] counter_ff;
+ assign counter_next = counter_ff + COUNTER_WIDTH'('b1);
+ always_ff @(posedge clk_i or negedge arstn_i) begin
+ if (!arstn_i) counter_ff <= '0;
+ else counter_ff <= counter_next;
end
+ logic [7:0] an_ff;
+ logic [7:0] an_next;
+ logic an_en;
+ assign an_next = {an_ff[$left(an_ff)-1:0], an_ff[$left(an_ff)]};
+ assign an_en = ~|counter_ff;
+ always_ff @(posedge clk_i or negedge arstn_i) begin
+ if (!arstn_i) an_ff <= ~8'b1;
+ else if (an_en) an_ff <= an_next;
+ end
+
+ localparam bit [6:0] BLANK = 7'b1111111;
+
+ logic [6:0] semseg;
+ always_comb begin
+ semseg = BLANK;
+
+ unique case (1'b0)
+ an_ff[0]: semseg = hex2semseg(rd2[0]);
+ an_ff[1]: semseg = hex2semseg(rd2[1]);
+ an_ff[2]: semseg = hex2semseg(rd2[2]);
+ an_ff[3]: semseg = hex2semseg(rd2[3]);
+ an_ff[4]: semseg = hex2semseg(rd1[0]);
+ an_ff[5]: semseg = hex2semseg(rd1[1]);
+ an_ff[6]: semseg = hex2semseg(rd1[2]);
+ an_ff[7]: semseg = hex2semseg(rd1[3]);
+ endcase
+ end
+
+ logic [2:0][4:0] addresses_next;
+ assign addresses_next = sw_i[14:0];
+ logic [4:0] wa_ff;
+ logic [4:0] ra1_ff;
+ logic [4:0] ra2_ff;
+ logic [4:0] wa_next;
+ assign wa_next = addresses_next[0];
+ logic [4:0] ra1_next;
+ assign ra1_next = addresses_next[2];
+ logic [4:0] ra2_next;
+ assign ra2_next = addresses_next[1];
+ logic addresses_en;
+ assign addresses_en = btnd_i;
+ always_ff @(posedge clk_i or negedge arstn_i) begin
+ if (!arstn_i) begin
+ wa_ff <= '0;
+ ra1_ff <= '0;
+ ra2_ff <= '0;
+ end else if (addresses_en) begin
+ wa_ff <= wa_next;
+ ra1_ff <= ra1_next;
+ ra2_ff <= ra2_next;
+ end
+ end
+ assign wa = wa_ff;
+ assign ra1 = ra1_ff;
+ assign ra2 = ra2_ff;
+
+ assign wd = {16'b0, sw_i};
+ assign we = btnr_i;
+
+ assign {ca_o, cb_o, cc_o, cd_o, ce_o, cf_o, cg_o} = semseg;
+ assign dp_o = 1'b1;
+
+ assign led_o = {1'b0, ra1, ra2, wa};;
+
+ assign an_o = an_ff;
+
endmodule