diff --git a/.pic/Labs/board files/alu_9.png b/.pic/Labs/board files/alu_9.png
deleted file mode 100644
index e488d34..0000000
Binary files a/.pic/Labs/board files/alu_9.png and /dev/null differ
diff --git a/.pic/Labs/board files/nexys_adder_structure.drawio.svg b/.pic/Labs/board files/nexys_adder_structure.drawio.svg
index 696340b..4aa6673 100644
--- a/.pic/Labs/board files/nexys_adder_structure.drawio.svg
+++ b/.pic/Labs/board files/nexys_adder_structure.drawio.svg
@@ -1,4 +1,4 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/.pic/Labs/board files/nexys_alu.png b/.pic/Labs/board files/nexys_alu.png
deleted file mode 100644
index 7889b42..0000000
Binary files a/.pic/Labs/board files/nexys_alu.png and /dev/null differ
diff --git a/.pic/Labs/board files/nexys_alu_12_plus_minus_16.drawio.svg b/.pic/Labs/board files/nexys_alu_12_plus_minus_16.drawio.svg
new file mode 100644
index 0000000..bfd1abe
--- /dev/null
+++ b/.pic/Labs/board files/nexys_alu_12_plus_minus_16.drawio.svg
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/.pic/Labs/board files/nexys_alu_structure.drawio.svg b/.pic/Labs/board files/nexys_alu_structure.drawio.svg
new file mode 100644
index 0000000..b22d8bc
--- /dev/null
+++ b/.pic/Labs/board files/nexys_alu_structure.drawio.svg
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/Labs/01. Adder/board files/README.md b/Labs/01. Adder/board files/README.md
index cf95de2..1737b54 100644
--- a/Labs/01. Adder/board files/README.md
+++ b/Labs/01. Adder/board files/README.md
@@ -1,37 +1,24 @@
# Проверка работы полного 32-битного сумматора в ПЛИС
-После того, как вы создали проверили на моделировании 32-разрядный сумматор,
-вам необходимо проверить его работу на прототипе в ПЛИС.
+После того, как вы создали проверили на моделировании 32-разрядный сумматор, вам необходимо проверить его работу на прототипе в ПЛИС.
Инструкция по реализации прототипа описана [здесь](../../../Vivado%20Basics/How%20to%20program%20an%20fpga%20board.md).
-
-
-
На _рис. 1_ представлена схема прототипа в ПЛИС.

_Рисунок 1. Структурная схема модуля `nexys_adder`._
-Модуль `nexys_adder` позволяет подавать данные с переключателей ❶ на входы `a_i`, `b_i`,
-а так же передавать входной бит переноса с помощью кнопки ❷ `BTND` на вход `carry_i`.
+Модуль `nexys_adder` позволяет подавать данные с переключателей ❶ на входы `a_i`, `b_i`, а так же передавать входной бит переноса с помощью кнопки ❷ `BTND` на вход `carry_i`.
-Переключатели делятся пополам между операндами `a_i`, `b_i` (переключатели `sw[7:0]` относятся к
-операнду `b_i`, переключатели `sw[15:8]` относятся к операнду `a_i`). Так как переключателей
-всего 16, каждому операнду достается только по 8. Таким образом, с переключателей можно ввести
-8 младших бит каждого из операнда.
+Переключатели делятся пополам между операндами `a_i`, `b_i` (переключатели `sw[7:0]` относятся к операнду `b_i`, переключатели `sw[15:8]` относятся к операнду `a_i`). Так как переключателей всего 16, каждому операнду достается только по 8. Таким образом, с переключателей можно ввести 8 младших бит каждого из операнда.
-Старшие биты дополняются нулями, это значит что на нашем прототипе можно складывать числа в
-диапазоне `[0:255]` (плюс можно прибавлять входной бит переноса),
-а значит диапазон результатов будет `[0:511]`.
+Старшие биты дополняются нулями, это значит что на нашем прототипе можно складывать числа в диапазоне `[0:255]` (плюс можно прибавлять входной бит переноса), а значит диапазон результатов будет `[0:511]`.
-Семисегментные индикаторы ❸ отображают на левом блоке значение операндов `a_i` и `b_i`
-в шестнадцатеричном формате, а на правом — результат сложения. Светодиоды ❹,
-расположенные над переключателями, дублируют сумму, представляя ее в двоичном формате.
+Семисегментные индикаторы ❸ отображают на левом блоке значение операндов `a_i` и `b_i` в шестнадцатеричном формате, а на правом — результат сложения. Светодиоды ❹, расположенные над переключателями, дублируют сумму, представляя ее в двоичном формате.
-На _рис. 2_ показан пример сложения `0x48 + 0x18 = 0x60` при нулевом входном переносе.
-(нулевом, т.к. не нажата кнопка `BTND`)
+На _рис. 2_ показан пример сложения `0x48 + 0x18 = 0x60` при нулевом входном переносе (нулевом, т.к. не нажата кнопка `BTND`).

diff --git a/Labs/02. Arithmetic-logic unit/board files/README.md b/Labs/02. Arithmetic-logic unit/board files/README.md
index 728b1df..4ee9d92 100644
--- a/Labs/02. Arithmetic-logic unit/board files/README.md
+++ b/Labs/02. Arithmetic-logic unit/board files/README.md
@@ -1,17 +1,41 @@
# Проверка работы арифметико-логического устройства в ПЛИС
+После того, как вы проверили на моделировании АЛУ, вам необходимо проверить его работу на прототипе в ПЛИС.
+
Инструкция по реализации прототипа описана [здесь](../../../Vivado%20Basics/How%20to%20program%20an%20fpga%20board.md).
-После того, как вы создали свое АЛУ и проверили его на прохождение тестирующего модуля, вы можете использовать предложенный модуль окружения [`nexys_alu.v`](nexys_alu.v), который позволяет связать вашу логику с периферией, расположенной на плате `Nexys-A7`. Для его подключения, скачайте и добавьте файл в проект, либо скопируйте содержимое в новый `.v` файл вашего проекта. В окне `Sources` нажмите на него ПКМ и выберите `Set as Top`, после чего в иерархии он станет главным, подключив ваш собственный модуль АЛУ. Для того, чтобы дизайн мог физически подключиться к периферии, нужно в проекте выбрать `Add Sources`, `Add or create constraints` и подключить файл [`nexys_a7_100t.xdc`](nexys_a7_100t.xdc). Если у вас уже подключен этот файл, необходимо заменить данные на те, которые предложены в текущей лабе.
+На _рис. 1_ представлена схема прототипа в ПЛИС.
-После этого наше устройство будет выглядеть так:
+
-
+_Рисунок 1. Структурная схема модуля `nexys_alu`, где блоки `SE` — [знакорасширители](https://ru.wikipedia.org/wiki/Дополнительный_код#Расширение_знака)._
-Подключенное окружение позволяет производить ввод входных значений (А и В) и управляющего сигнала (ALUOp) с помощью переключателей (номер переключателя отображен на самом краю платы), расположенных на плате. А: 15-11, В: 10-6, ALUOp: 4-0, а переключатель №5 активирует семисегментные индикаторы, на которых отображается на левом блоке операнды А и В, а на правом - ALUOp. На светодиодах, расположенных над переключателями отображается выходное значение в двоичном формате, а 15-й светодиод отвечает за сигнал `Flag`
+Модуль `nexys_alu` позволяет подавать данные на входы `a_i`, `b_i`, `alu_op_i`, а также управлять интерпретацией знака операндов/результата с помощью переключателей.
-Управление АЛУ через плату
+Переключатели `sw[15:0]` и сигналы, ими задаваемые, соотносятся следующим образом:
+- `sw[15:11]` — операнд `a_i`.
+- `sw[10:6]` — операнд `b_i`.
+- `sw[5]` — `sign_on` (назначение этого сигнала подробнее описано дальше по тексту).
+- `sw[4:0]` — `alu_op_i`.
-
+Сигнал `sign_on` — определяет интерпретацию (знаковый/беззнаковый) операндов `a_i`, `b_i` и результата `result_o`:
+- Если сигнал принимает значение `1` ("верхнее" положение переключателя), то операнды и результат интерпретируются и отображаются как **знаковые** числа.
+- Если сигнал принимает значение `0` ("нижнее" положение переключателя), то операнды и результат интерпретируются и отображаются как **беззнаковые** числа.
-Попробуйте выставить на переключателях различные опкоды, такие как сложение, вычитание, сдвиг и сравнения, убедитесь, что все работает исправно и сдавайте работу.
+Таким образом, область допустимых значений операндов:
+- При знаковой интерпретации: `[-16:15]`
+- При беззнаковой интерпретации: `[0:31]`
+
+Числа на семисегментных индикаторах отображаются в **десятичной** системе счисления.
+
+Блок результата отображает знак и 3 наименее значимые **цифры** (разряды сотен, десятков, единиц) результата с учетом его интерпретации как знаковое/беззнаковое число. Например, результат операции вычитания `0 - 1` при знаковой интерпретации отобразится как `-1` на семисегментых индикаторах, а при беззнаковой интерпретации как `295` (3 наименее значимые цифры числа `4 294 967 295`).
+
+Светодиоды, расположенные над переключателями, отображают 15 бит результата и флаг. То есть `led[15]` соединен с `flag_o` сигналом `alu`, а `led[14:0]` — с `result_o[14:0]`.
+
+На _рис. 2_ показан пример сложения `12 + (-16) = -4`.
+
+
+
+_Рисунок 2. Использование АЛУ для вычисления выражения `12 + (-16)` в ПЛИС._
+
+Попробуйте выставить на переключателях различные операции (сложение, вычитание, сдвиг и сравнения), посмотрите различие между знаковыми/беззнаковыми операциями, убедитесь, что все работает исправно, и сдавайте работу.
diff --git a/Labs/02. Arithmetic-logic unit/board files/nexys_a7_100t.xdc b/Labs/02. Arithmetic-logic unit/board files/nexys_a7_100t.xdc
index 4838c49..d74cfc7 100644
--- a/Labs/02. Arithmetic-logic unit/board files/nexys_a7_100t.xdc
+++ b/Labs/02. Arithmetic-logic unit/board files/nexys_a7_100t.xdc
@@ -4,45 +4,45 @@
## - 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
@@ -53,30 +53,30 @@ set_property -dict { PACKAGE_PIN V11 IOSTANDARD LVCMOS33 } [get_ports { LED[15
#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 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 }]; #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 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 C12 IOSTANDARD LVCMOS33 } [get_ports { resetn
#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/02. Arithmetic-logic unit/board files/nexys_alu.sv b/Labs/02. Arithmetic-logic unit/board files/nexys_alu.sv
index 0780001..5e2707e 100644
--- a/Labs/02. Arithmetic-logic unit/board files/nexys_alu.sv
+++ b/Labs/02. Arithmetic-logic unit/board files/nexys_alu.sv
@@ -1,94 +1,181 @@
+/* -----------------------------------------------------------------------------
+* Project Name : Architectures of Processor Systems (APS) lab work
+* File : nexys_alu.sv
+* Organization : National Research University of Electronic Technology (MIET)
+* Department : Institute of Microdevices and Control Systems
+* Author(s) : Alexander Kharlamov
+* Email(s) : sasha_xarlamov@org.miet.ru
+
+See LICENSE file for licensing details.
+* ------------------------------------------------------------------------------
+*/
+
module nexys_alu(
- input CLK100,
- input resetn,
- input [15:0] SW,
- output [15:0] LED,
- output CA, CB, CC, CD, CE, CF, CG,
- output [7:0] AN
- );
-import alu_opcodes_pkg::*;
-wire [4:0] operator_i;
-wire [31:0] operand_a_i;
-wire [31:0] operand_b_i;
-
-wire [31:0] result_o;
-wire comparison_result_o;
-
-localparam pwm = 1000;
-reg [9:0] counter;
-reg [3:0] semseg;
-reg [7:0] ANreg;
-reg CAr, CBr, CCr, CDr, CEr, CFr, CGr;
-reg [15:0] LEDr;
-reg minus;
-
-alu_riscv DUT
-(
- .alu_op_i (operator_i),
- .a_i (operand_a_i),
- .b_i (operand_b_i),
-
- .result_o (result_o),
- .flag_o (comparison_result_o)
+ input logic clk_i,
+ input logic arstn_i,
+ input logic [15:0] sw_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
);
+ logic sign_on;
+ assign sign_on = sw_i[5];
-assign operator_i = SW[4:0];
-assign operand_b_i = {{28{SW[10]}},SW[9:6]};
-assign operand_a_i = {{28{SW[15]}},SW[14:11]};
+ logic sext_operand_a;
+ assign sext_operand_a = sign_on;
+ logic sext_operand_b;
+ assign sext_operand_b = sign_on;
-assign LED[15:0] = LEDr[15:0];
+ import alu_opcodes_pkg::*;
-assign AN[7:0] = ANreg[7:0];
-assign {CA, CB, CC, CD, CE, CF, CG} = {CAr, CBr, CCr, CDr, CEr, CFr, CGr};
+ logic [4:0] operator;
+ assign operator = sw_i[4:0];
-initial ANreg[7:0] = 8'b11111110;
+ logic [31:0] operand_b;
+ assign operand_b = {(sext_operand_b ? {27{sw_i[10]}} : 27'b0), sw_i[10: 6]};
-always @(posedge CLK100) begin
- if (!resetn) begin
- LEDr[15:0] <= 'b0;
- counter <= 'b0;
- ANreg[7:0] <= 8'b11111111;
- {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b1111111;
- end
- else begin
- LEDr[14:0] <= result_o[14:0];
- LEDr[15] <= comparison_result_o;
- 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] <= !(SW[5] && (ANreg[6:0] == 7'b1111111));
- end
- case (1'b0)
- ANreg[0]: semseg <= result_o[31] ? ( ~result_o + 1 ) % 4'd10: (result_o ) % 4'd10;
- ANreg[1]: semseg <= result_o[31] ? ((~result_o + 1) / 'd10 ) % 4'd10: (result_o / 'd10 ) % 4'd10;
- ANreg[2]: semseg <= result_o[31] ? ((~result_o + 1) / 'd100 ) % 4'd10: (result_o / 'd100 ) % 4'd10;
- ANreg[3]: semseg <= result_o[31] ? ((~result_o + 1) / 'd1000) % 4'd10: (result_o / 'd1000) % 4'd10;
- ANreg[4]: semseg <= operand_b_i[31] ? ( ~operand_b_i + 1 ) % 4'd10: (operand_b_i ) % 4'd10;
- ANreg[5]: semseg <= operand_b_i[31] ? ((~operand_b_i + 1) / 'd10) % 4'd10: (operand_b_i / 'd10) % 4'd10;
- ANreg[6]: semseg <= operand_a_i[31] ? ( ~operand_a_i + 1 ) % 4'd10: (operand_a_i ) % 4'd10;
- ANreg[7]: semseg <= operand_a_i[31] ? ((~operand_a_i + 1) / 'd10) % 4'd10: (operand_a_i / 'd10) % 4'd10;
- endcase
- minus <= (operator_i == ALU_ADD || operator_i == ALU_SUB || operator_i == ALU_SLTS || operator_i == ALU_SRA || operator_i == ALU_LTS || operator_i == ALU_GES);
- case (semseg)
- 4'd0: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= (((!ANreg[5] & operand_b_i[31]) || (!ANreg[7] & operand_a_i[31]) || (!ANreg[3] & result_o[31])) && minus) ? 7'b1111110: 7'b0000001;
- 4'd1: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= (((!ANreg[5] & operand_b_i[31]) || (!ANreg[7] & operand_a_i[31]) || (!ANreg[3] & result_o[31])) && minus) ? 7'b1001110: 7'b1001111;
- 4'd2: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b0010010;
- 4'd3: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b0000110;
- 4'd4: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b1001100;
- 4'd5: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b0100100;
- 4'd6: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b0100000;
- 4'd7: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b0001111;
- 4'd8: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b0000000;
- 4'd9: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b0000100;
- endcase
- end
-end
+ logic [31:0] operand_a;
+ assign operand_a = {(sext_operand_a ? {27{sw_i[15]}} : 27'b0), sw_i[15:11]};
+
+ logic [31:0] result;
+ logic flag;
+
+ alu_riscv alu_riscv (
+ .alu_op_i (operator),
+ .a_i (operand_a),
+ .b_i (operand_b),
+
+ .result_o (result),
+ .flag_o (flag)
+ );
+
+ 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
+
+ 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
+
+ logic is_result_negative;
+ assign is_result_negative = result[$left(result)] & sign_on;
+ logic is_operand_a_negative;
+ assign is_operand_a_negative = operand_a[$left(operand_a)];
+ logic is_operand_b_negative;
+ assign is_operand_b_negative = operand_b[$left(operand_b)];
+
+ logic [31:0] result_sign_regard;
+ assign result_sign_regard = is_result_negative ? (~result + 32'b1) : result;
+ logic [4:0] operand_a_sign_regard;
+ assign operand_a_sign_regard = is_operand_a_negative ? (~operand_a[4:0] + 5'b1) : (operand_a[4:0]);
+ logic [4:0] operand_b_sign_regard;
+ assign operand_b_sign_regard = is_operand_b_negative ? (~operand_b[4:0] + 5'b1) : (operand_b[4:0]);
+
+ logic [63:0] bcd_result;
+ logic [11:0] bcd_operand_a;
+ logic [11:0] bcd_operand_b;
+
+ bin2bcd #($bits(result_sign_regard)) bin2bcd_result (
+ .bin_i (result_sign_regard),
+ .bcd_o (bcd_result )
+ );
+
+ bin2bcd #($bits(operand_a_sign_regard)) bin2bcd_operand_a (
+ .bin_i (operand_a_sign_regard),
+ .bcd_o (bcd_operand_a )
+ );
+
+ bin2bcd #($bits(operand_b_sign_regard)) bin2bcd_operand_b (
+ .bin_i (operand_b_sign_regard),
+ .bcd_o (bcd_operand_b )
+ );
+
+ localparam bit [6:0] MINUS = 7'b1111110;
+ 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(bcd_result[ 3:0]);
+ an_ff[1]: semseg = hex2semseg(bcd_result[ 7:4]);
+ an_ff[2]: semseg = hex2semseg(bcd_result[11:8]);
+ an_ff[3]: semseg = is_result_negative ? MINUS : BLANK;
+ an_ff[4]: semseg = hex2semseg(bcd_operand_b[3:0]);
+ an_ff[5]: semseg = (is_operand_b_negative ? MINUS : BLANK) & (|bcd_operand_b[5:4] ? hex2semseg({2'b0, bcd_operand_b[5:4]}) : BLANK);
+ an_ff[6]: semseg = hex2semseg(bcd_operand_a[3:0]);
+ an_ff[7]: semseg = (is_operand_a_negative ? MINUS : BLANK) & (|bcd_operand_a[5:4] ? hex2semseg({2'b0, bcd_operand_a[5:4]}) : BLANK);
+ endcase
+ end
+
+ assign {ca_o, cb_o, cc_o, cd_o, ce_o, cf_o, cg_o} = semseg;
+ assign dp_o = an_ff[6] ? 1'b1 : 1'b0;
+
+ assign led_o[14:0] = result[14:0];
+ assign led_o[15] = flag;
+
+ assign an_o = an_ff;
+
+endmodule
+
+module bin2bcd #(
+ parameter int IN_WIDTH = 32,
+ localparam int OUT_WIDTH_DIGITS = (2 * IN_WIDTH + 3) / 4, // each byte is represented as 2 digits.
+ // And ceiling
+ localparam int OUT_WIDTH = 4 * OUT_WIDTH_DIGITS
+) (
+ input logic [IN_WIDTH -1:0] bin_i,
+ output logic [OUT_WIDTH-1:0] bcd_o
+);
+
+ always @(bin_i) begin
+ bcd_o = '0;
+ for (int unsigned bit_number = 0; bit_number < IN_WIDTH; ++bit_number) begin // Iterate once for each bit in input number
+ for (int unsigned digit_num = 0; digit_num < OUT_WIDTH_DIGITS; ++digit_num) begin
+ if (bcd_o[4*digit_num+:4] >= 4'd5) bcd_o[4*digit_num+:4] = bcd_o[4*digit_num+:4] + 4'd3; // If any BCD digit is >= 5, add three
+ end
+ bcd_o = {bcd_o[$left(bcd_o)-1:0], bin_i[$left(bin_i)-bit_number]}; // Shift one bit, and shift in proper bit from input
+ end
+ end
endmodule