mirror of
https://github.com/MPSU/APS.git
synced 2025-09-15 17:20:10 +00:00
Перенос drawio-изображений в svg-формат
This commit is contained in:
@@ -22,7 +22,7 @@
|
||||
|
||||
Давайте начнем с примера и сложим в столбик какую-нибудь пару чисел, например 42 и 79:
|
||||
|
||||

|
||||

|
||||
|
||||
```text
|
||||
2 + 9 = 11 ➨ 1 пишем, 1 "в уме"
|
||||
@@ -36,7 +36,7 @@
|
||||
|
||||
Теперь попробуем сделать то же самое, только в двоичной системе исчисления. К примеру, над числами 3 и 5. Три в двоичной системе записывается как 011. Пять записывается как 101.
|
||||
|
||||

|
||||

|
||||
|
||||
Поскольку в двоичной системе всего две цифры: 0 и 1, один разряд не может превысить 1. Складывая числа 1 и 1, вы получаете 2, что не умещается в один разряд, поэтому мы пишем 0 и держим 1 "в уме". Это снова перенос разряда. Поскольку в двоичной арифметике разряд называют битом, перенос разряда называют переносом бита, а сам разряд, который перенесли — битом переноса.
|
||||
|
||||
@@ -58,25 +58,25 @@
|
||||
|
||||

|
||||
|
||||
*Таблица истинности одноразрядного сложения*
|
||||
_Таблица истинности одноразрядного сложения._
|
||||
|
||||
`S` — это цифра, записываемая в столбце сложения под числами `a` и `b`. `C` (*carry*, перенос) — это цифра, записываемая левее, если произошел перенос разряда. Как мы видим, перенос разряда происходит только в случае, когда оба числа одновременно равны единице. При этом в этот момент значение `S` обращается в `0`, и результат записывается как `10`, что в двоичной системе означает `2`. Кроме того, `S = 0` и в случае, когда оба операнда одновременно равны нулю. Вы можете заметить, что `S` равно нулю в тех случаях, когда `а` и `b` равны, и не равно нулю в противоположном случае. Подобным свойством обладает логическая операция **Исключающее ИЛИ** (**eXclusive OR**, **XOR**):
|
||||
`S` — это цифра, записываемая в столбце сложения под числами `a` и `b`. `C` (_carry_, перенос) — это цифра, записываемая левее, если произошел перенос разряда. Как мы видим, перенос разряда происходит только в случае, когда оба числа одновременно равны единице. При этом в этот момент значение `S` обращается в `0`, и результат записывается как `10`, что в двоичной системе означает `2`. Кроме того, `S = 0` и в случае, когда оба операнда одновременно равны нулю. Вы можете заметить, что `S` равно нулю в тех случаях, когда `а` и `b` равны, и не равно нулю в противоположном случае. Подобным свойством обладает логическая операция **Исключающее ИЛИ** (**eXclusive OR**, **XOR**):
|
||||
|
||||

|
||||
|
||||
*Таблица истинности операции Исключающее ИЛИ (XOR)*
|
||||
_Таблица истинности операции Исключающее ИЛИ (XOR)._
|
||||
|
||||
Для бита переноса всё ещё проще — он описывается операцией логическое И:
|
||||
|
||||

|
||||
|
||||
*Таблица истинности операции И*
|
||||
_Таблица истинности операции И._
|
||||
|
||||
Давайте нарисуем цифровую схему, связывающую входные и выходные сигналы с помощью логических элементов, соответствующих ожидаемому поведению:
|
||||
|
||||

|
||||

|
||||
|
||||
*Рисунок 1. Цифровая схема устройства, складывающего два операнда с сохранением переноса (полусумматора)*
|
||||
_Рисунок 1. Цифровая схема устройства, складывающего два операнда с сохранением переноса (полусумматора)._
|
||||
|
||||
Вроде все замечательно, но есть проблема. В описании полного однобитного сумматора сказано, что у него есть три входа, а в наших таблицах истинности и на схеме выше их только два. На самом деле, на каждом этапе сложения в столбик мы всегда складывали три числа: цифру верхнего числа, цифру нижнего числа, и единицу в случае переноса разряда из предыдущего столбца (если с предыдущего разряда не было переноса, прибавление нуля неявно опускалось).
|
||||
|
||||
@@ -84,7 +84,7 @@
|
||||
|
||||

|
||||
|
||||
*Таблица истинности сигналов полного однобитного сумматора*
|
||||
_Таблица истинности сигналов полного однобитного сумматора._
|
||||
|
||||
Поскольку теперь у нас есть и входной и выходной биты переноса, для их различия добавлены индексы “in” и “out”.
|
||||
|
||||
@@ -98,9 +98,9 @@
|
||||
|
||||
Цифровая схема устройства с описанным поведением выглядит следующим образом:
|
||||
|
||||

|
||||

|
||||
|
||||
*Рисунок 2. Цифровая схема полного однобитного сумматора*
|
||||
_Рисунок 2. Цифровая схема полного однобитного сумматора._
|
||||
|
||||
## Практика
|
||||
|
||||
@@ -150,15 +150,15 @@ module half_adder(
|
||||
endmodule
|
||||
```
|
||||
|
||||
*Листинг 1. SystemVerilog-код модуля half_adder*
|
||||
_Листинг 1. SystemVerilog-код модуля half_adder._
|
||||
|
||||
По данному коду, САПР может реализовать следующую схему:
|
||||
|
||||

|
||||
|
||||
*Рисунок 3. Цифровая схема модуля half_adder, сгенерированная САПР Vivado*
|
||||
_Рисунок 3. Цифровая схема модуля half_adder, сгенерированная САПР Vivado._
|
||||
|
||||
Схема похожа на рис. 1, но как проверить, что эта схема не содержит ошибок и делает именно то, что от нее ожидается?
|
||||
Схема похожа на _рис. 1_, но как проверить, что эта схема не содержит ошибок и делает именно то, что от нее ожидается?
|
||||
|
||||
Для этого необходимо провести моделирование этой схемы. Во время моделирования на вход схемы подаются входные воздействия. Каждое изменение входных сигналов схемы приводит к каскадному изменению состояния внутренних цепей, которые в итоге меняют выходные сигналы.
|
||||
|
||||
@@ -191,13 +191,13 @@ module testbench(); // <- Не имеет ни входов, ни
|
||||
endmodule
|
||||
```
|
||||
|
||||
*Листинг 2. SystemVerilog-код тестбенча для модуля example*
|
||||
_Листинг 2. SystemVerilog-код тестбенча для модуля example._
|
||||
|
||||

|
||||
|
||||
*Рисунок 4. Временная диаграмма, моделирующая работу схемы с рис.3*
|
||||
_Рисунок 4. Временная диаграмма, моделирующая работу схемы с рис. 3._
|
||||
|
||||
В данной лабораторной работе вам предстоит реализовать схему полного однобитного сумматора (*рис. 2*).
|
||||
В данной лабораторной работе вам предстоит реализовать схему полного однобитного сумматора (_рис. 2_).
|
||||
|
||||
### Полный четырехбитный сумматор
|
||||
|
||||
@@ -207,18 +207,19 @@ endmodule
|
||||
|
||||
Давайте посмотрим, как это будет выглядеть на схеме (для простоты, внутренняя логика однобитного сумматора скрыта, но вы должны помнить, что каждый прямоугольник — это та же самая схема с рис. 2).
|
||||
|
||||

|
||||
*Рисунок 5. Схема четырехбитного сумматора*
|
||||

|
||||
|
||||
_Рисунок 5. Схема четырехбитного сумматора._
|
||||
|
||||
Фиолетовой линией на схеме показаны провода, соединяющие выходной бит переноса сумматора предыдущего разряда, с входным битом переноса сумматора следующего разряда.
|
||||
|
||||
Как же реализовать модуль, состоящий из цепочки других модулей? Половину этой задачи мы уже сделали, когда писали тестбенч к однобитному полусумматору в *Листинге 2* — мы создавали модуль внутри другого модуля и подключали к нему провода. Теперь надо сделать то же самое, только с чуть большим числом модулей.
|
||||
Как же реализовать модуль, состоящий из цепочки других модулей? Половину этой задачи мы уже сделали, когда писали тестбенч к однобитному полусумматору в _Листинге 2_ — мы создавали модуль внутри другого модуля и подключали к нему провода. Теперь надо сделать то же самое, только с чуть большим числом модулей.
|
||||
|
||||
Для того, чтобы описать четырехбитный сумматор, необходимо подключить четыре однобитных подобно тому, как было описано в [`документе`](../../Basic%20Verilog%20structures/Modules.md#иерархия-модулей), который вы изучали перед лабораторной работой.
|
||||
|
||||

|
||||
|
||||
*Рисунок 6. Схема четырехбитного сумматора, сгенерированная САПР Vivado*
|
||||
_Рисунок 6. Схема четырехбитного сумматора, сгенерированная САПР Vivado._
|
||||
|
||||
Схема может показаться запутанной, но (если присмотреться) вы увидите, как от шин A, B и S отходят линии к каждому из сумматоров, а бит переноса передается от предыдущего сумматора к следующему.
|
||||
|
||||
@@ -242,7 +243,7 @@ module fulladder4(
|
||||
|
||||

|
||||
|
||||
*Рисунок 7. Пример использования конструкции generate for*
|
||||
_Рисунок 7. Пример использования конструкции generate for._
|
||||
|
||||
Как вы можете догадаться, в этом примере создано 3 модуля, имена которых оканчиваются на значение итератора, по которому шел цикл, а к самим модулям подключены соответствующие итератору провода из шин. Разумеется, для своих целей вы можете использовать и **i+1** и двойные циклы.
|
||||
|
||||
@@ -275,13 +276,13 @@ module fulladder32(
|
||||
1. Согласно [руководству по созданию проекта в Vivado](../../Vivado%20Basics/Vivado%20trainer.md):
|
||||
1. Создайте проект;
|
||||
2. В `Design Sources` проекта создайте `SystemVerilog`-файл `fulladder`.
|
||||
2. Опишите в файле модуль `fulladder`, схема которого представлена на *[Рис. 2](../../.pic/Labs/lab_01_adder/fig_02.drawio.png)*.
|
||||
2. Опишите в файле модуль `fulladder`, схема которого представлена на _[Рис. 2](../../.pic/Labs/lab_01_adder/fig_02.drawio.svg)_.
|
||||
3. В `Simulation Sources` проекта создайте `SystemVerilog`-файл `tb_fulladder`.
|
||||
4. Вставьте содержимое файла [`tb_fulladder.sv`](tb_fulladder.sv), расположенного рядом с данным документом.
|
||||
5. Запустите моделирование. Для запуска симуляции воспользуйтесь [`этой инструкцией`](../../Vivado%20Basics/Run%20Simulation.md).
|
||||
6. Убедитесь по сигналам временной диаграммы, что модуль работает корректно.
|
||||
7. В `Design Sources` проекта создайте `SystemVerilog`-файл `fulladder4`.
|
||||
8. Опишите модуль `fulladder4`, схема которого представлена на *Рис. 5 и 6*, используя [`иерархию модулей`](../../Basic%20Verilog%20structures/Modules.md#%D0%B8%D0%B5%D1%80%D0%B0%D1%80%D1%85%D0%B8%D1%8F-%D0%BC%D0%BE%D0%B4%D1%83%D0%BB%D0%B5%D0%B9), чтобы в нем выполнялось поразрядное сложение двух 4-разрядных чисел и входного бита переноса. Некоторые входы и выходы модуля будет необходимо описать в виде `векторов`.
|
||||
8. Опишите модуль `fulladder4`, схема которого представлена на _Рис. 5 и 6_, используя [`иерархию модулей`](../../Basic%20Verilog%20structures/Modules.md#%D0%B8%D0%B5%D1%80%D0%B0%D1%80%D1%85%D0%B8%D1%8F-%D0%BC%D0%BE%D0%B4%D1%83%D0%BB%D0%B5%D0%B9), чтобы в нем выполнялось поразрядное сложение двух 4-разрядных чисел и входного бита переноса. Некоторые входы и выходы модуля будет необходимо описать в виде `векторов`.
|
||||
9. Обратите внимание, что входной бит переноса должен подаваться на сумматор, выполняющий сложение нулевого разряда, выходной бит переноса соединяется с выходным битом переноса сумматора, выполняющего сложение 4-го разряда.
|
||||
10. В `Simulation Sources` проекта создайте `SystemVerilog`-файл `tb_fulladder4`.
|
||||
11. Вставьте содержимое файла [`tb_fulladder4.sv`](tb_fulladder4.sv). Нажмите по нему в окне `Sources` ПКМ и выберите `Set as Top`.
|
||||
|
Reference in New Issue
Block a user