Ref(01_Adder): Применение правок по MD bordfiles после ревью

Co-authored-by: Andrei Solodovnikov <VoultBoy@yandex.ru>
This commit is contained in:
BROsandr
2024-02-12 22:05:45 +03:00
committed by GitHub
parent 7932ac6f88
commit 8019c497ef

View File

@@ -1,18 +1,29 @@
# Проверка работы полного 32-битного сумматора в ПЛИС
После того, как вы создали свой сумматор и проверили его в симуляции, вы можете использовать предложенный модуль окружения [`nexys_adder.sv`](nexys_adder.sv), который позволяет связать вашу логику с периферией, расположенной на плате `Nexys-A7`. Для его подключения, скачайте и добавьте файл в проект, либо скопируйте содержимое в новый `.sv` файл вашего проекта. В окне `Sources` нажмите на него ПКМ и выберите `Set as Top`, после чего в иерархии он станет главным (название главного модуля выделено **жирным** шрифтом). Для того, чтобы дизайн мог физически подключиться к периферии, нужно в проекте выбрать `Add or create constraints` и подключить файл [`nexys_a7_100t.xdc`](nexys_a7_100t.xdc). Иерархия проекта, готового к созданию битстрима, показана на *рисунке 1*.
После того, как вы создали проверили на моделировании 32-разрядный сумматор, вам необходимо проверить его работу на прототипе в ПЛИС.
Для этого вам потребуется модуль верхнего уровня [`nexys_adder.sv`](nexys_adder.sv), который позволяет связать вашу логику с периферией, расположенной на плате `Nexys-A7`. Для его подключения, скачайте и добавьте файл в проект, либо скопируйте содержимое в новый `.sv` файл вашего проекта. В окне `Sources` нажмите на него ПКМ и выберите `Set as Top`, после чего в иерархии он станет главным (название главного модуля выделено **жирным** шрифтом).
Для того, чтобы входы и выходы этого модуля были соединены с нужными входами и выходами ПЛИС, нужно в проекте выбрать `Add or create constraints` и подключить файл [`nexys_a7_100t.xdc`](nexys_a7_100t.xdc). На _рис. 1_ представлен пример иерархии проекта, готовой к созданию битстрима (двоичного файла, предназначенного для конфигурации ПЛИС таким образом, чтобы она воспроизводила логику описанного вами модуля).
![../../../.pic/Labs/board%20files/nexys_adder0.png](../../../.pic/Labs/board%20files/nexys_adder0.png)
*Рисунок 1. Иерархия проекта полного тридцатидвухбитного сумматора*
_Рисунок 1. Пример иерархии проекта с модулем верхнего уровня `nexys_adder`._
После этого наше устройство будет выглядеть, как представлено на *рисунке 2*:
После этого наше устройство будет выглядеть, как представлено на _рис. 2_:
![../../../.pic/Labs/board%20files/nexys_adder1.png](../../../.pic/Labs/board%20files/nexys_adder1.png)
*Рисунок 2. Структурная схема модуля `nexys_adder`*, где `A`, `B` - операнды, `Pin` - входной перенос (`carry`), `S` - сумма, `Pout` - выходной перенос для тридцати двух битов (не подключен), `Semseg` - сигнал подаваемый на семисегментные индикаторы
_Рисунок 2. Структурная схема модуля `nexys_adder`._
Подключенное окружение позволяет производить ввод входных значений для сумматора (`A`, `B` и `carry` aka `Pin`) с помощью переключателей (номер переключателя написан под ним же) и кнопки `BTND`. Так как переключателей всего 16, то ими можно задать значение для нижних восьми бит тридцатидвухбитных операндов `A` и `B` (на остальные двадцать четыре бита подается константный `0`). Таким образом нижние восемь бит операнд `A` задается переключателями `15-8`, а нижние восемь бит операнда `B` - переключателями `7-0`, входной бит переноса `carry` - кнопкой `BTND` (нижняя кнопка в группе из пяти кнопок). Максимальное беззнаковое число, которое можно подать на операнд - `2⁸ = 256`. Максимальная сумма будет `255 + 255 = 510 = 0x1FE`. В таком случае сумма двух восьмибитных чисел занимает восемь бит (`0xFE`) плюс бит переноса (`1`). Семисегментные индикаторы в шестнадцатеричном формате отображают на левом блоке слагаемые `A` и `B` (их нижние восемь бит, разделенные точкой), а на правом - результат сложения (двенадцать бит для отображения еще и переноса). Светодиоды, расположенные над переключателями, дублируют сумму, представляя ее в двоичном формате.
Модуль `nexys_adder` позволяет подавать данные с переключателей на входы `a_i`, `b_i`, а так же передавать входной бит переноса с помощью кнопки `BTND`.
Переключатели делятся пополам между операндами `a_i`, `b_i` (переключатели `sw[7:0]` относятся к операнду `b_i`, переключатели `sw[15:8]` относятся к операнду `a_i`). Так как переключателей всего 16, каждому операнду достается только по 8. Таким образом, с переключателей можно ввести 8 младших бит каждого из операнда.
Старшие биты дополняются нулями, это значит что на нашем прототипе можно складывать числа в диапазоне [0:255] (плюс можно прибавлять входной бит переноса), а значит диапазон результатов будет [0:511].
Семисегментные индикаторы отображают на левом блоке значение операндов `a_i` и `b_i` в шестнадцатеричном формате, а на правом — результат сложения. Светодиоды, расположенные над переключателями, дублируют сумму, представляя ее в двоичном формате.
На *рисунке 3* показано сложение `(A=0x48) + (B=0x18) == 0x60` при нулевом входном преносе (нулевом, тк не нажата кнопка `BTND` aka сигнал `Pin`)