diff --git a/.pic/Labs/lab_01_adder/fig_07.png b/.pic/Labs/lab_01_adder/fig_07.png deleted file mode 100644 index a932801..0000000 Binary files a/.pic/Labs/lab_01_adder/fig_07.png and /dev/null differ diff --git a/Labs/01. Adder/README.md b/Labs/01. Adder/README.md index e9e1987..4156bf6 100644 --- a/Labs/01. Adder/README.md +++ b/Labs/01. Adder/README.md @@ -237,9 +237,21 @@ module fulladder( ); ``` -Далее, вам необходимо реализовать полный 32-разрядный сумматор. Соединять вручную 32 однотипных модуля чревато усталостью и ошибками, поэтому можно сначала создать 4-разрядный сумматор (либо другой разрядности), а затем из набора 4-разрядных сумматоров сделать 32-битный. +Далее, вам необходимо реализовать полный 32-разрядный сумматор со следующим прототипом: -Модуль должен быть описан в соответствии со следующим прототипом: +```systemverilog +module fulladder32( + іnput logic [31:0] a_i, + іnput logic [31:0] b_i, + іnput logic carry_i, + оutput logic [31:0] sum_o, + оutput logic carry_o +); +``` + +Соединять вручную 32 однотипных модуля чревато усталостью и ошибками, поэтому можно сначала создать 4-разрядный сумматор (либо другой разрядности), а затем из набора 4-разрядных сумматоров сделать 32-битный. + +Если вы решите делать 4-разрядный сумматор, то модуль должен быть описан в соответствии со следующим прототипом: ```SystemVerilog module fulladder4( @@ -251,36 +263,56 @@ module fulladder4( ); ``` -Либо же можно воспользоваться конструкцией `generate for`, пример использования которой вы можете увидеть на изображении ниже (так же существуют конструкции `generate if`, `generate case`). +либо же можно создать массив однобитных сумматоров. -![../../.pic/Labs/lab_01_adder/fig_07.png](../../.pic/Labs/lab_01_adder/fig_07.png) +Создание массива модулей схоже с созданием одного модуля за исключением того, что после имени сущности модуля указывается диапазон, определяющий количество модулей в массиве. При этом подключение сигналов к массиву модулей осуществляется следующим образом: -_Рисунок 7. Пример использования конструкции generate for._ +- если разрядность подключаемого сигнала совпадает с разрядностью порта модуля из массива, этот сигнал подключается к каждому из модулей в массиве; +- если разрядность подключаемого сигнала превосходит разрядность порта модуля из массива в `N` раз (где `N` — количество модулей в массиве), к модулю подключается соответствующий диапазон бит подключаемого сигнала (диапазон меньших бит будет подключен к модулю с меньшим индексом в массиве). +- если разрядность подключаемого сигнала не подходит ни под один из описанных выше пунктов, происходит ошибка синтеза схемы, поскольку в этом случае САПР не способен понять каким образом подключать данный сигнал к каждому модулю из массива. -Как вы можете догадаться, в этом примере создано 3 модуля, имена которых оканчиваются на значение итератора, по которому шел цикл, а к самим модулям подключены соответствующие итератору провода из шин. Разумеется, для своих целей вы можете использовать и **i+1** и двойные циклы. +Далее идет пример того, как можно создать массив модулей -Обратите внимание на `: newgen` стоящий после ключевого слова `begin`. В некоторых САПР, код может не собраться, если у конструкции `generate for` нет названия (**лейбла**) с помощью подобной записи (двоеточия и названия). - -**Обратите внимание**, что данный рисунок не является решением вашей задачи, поскольку у вашего сумматора три входа и два выхода, а у сумматора в примере нет бита переноса. - -Несмотря на то, что конструкция выглядит как [~~утка, плавает как утка и крякает как утка~~](https://ru.wikipedia.org/wiki/Утиный_тест) цикл и ведет себя как цикл, нужно понимать, что это не цикл в привычном вам понимании этого слова. Это по-прежнему не программа. Вместо этого, вы выделяете общую закономерность по размещению однотипных модулей на схеме и описываете эту закономерность в виде цикла. - -Если вы захотите воспользоваться этой конструкцией, вам будет нужно продумать как вы будете: - -1. соединять входной бит переноса вашего модуля с входным битом переноса нулевого сумматора; -2. передавать бит переноса с выхода предыдущего сумматора на вход следующего; -3. соединять выходной бит переноса вашего модуля с выходным битом переноса последнего однобитного сумматора. - -Далее идет пример того, как должен выглядеть заголовок модуля разрабатываемого устройства. - -```systemverilog -module fulladder32( - іnput logic [31:0] a_i, - іnput logic [31:0] b_i, - іnput logic carry_i, - оutput logic [31:0] sum_o, - оutput logic carry_o +```SystemVerilog +module example1( + input logic [3:0] a, + input logic b, + output logic c, + output logic d ); + + assign c = |a ^ b; + assign d = &a; + +endmodule + +module example2( + input logic [31:0] A, + input logic B, + output logic [ 8:0] C +); + +example1 instance_array[7:0]( // Создается массив из 8 модулей example1 + .a(A), // Поскольку разрядность сигнала A в 8 раз больше + // разрядности входа a, к каждому модулю в массиве + // будет подключен свой диапазон бит сигнала A + // (к instance_array[0] будет подключен диапазон + // A[3:0], к instance_array[7] будет подключен + // диапазон A[31:28]). + + .b(B) // Поскольку разрядность сигнала B совпадает с + // разрядностью входа b, сигнал B будет подключен + // как есть ко всем модулям в массиве. + + .c(C[7:0]) // Поскольку разрядность сигнала C не равна + // ни разрядности входа c, ни его увосьмиренной + // разрядности, мы должны выбрать такой диапазон + // бит, который будет удовлетворять одному из + // этих требований. + + .d(C[8]) // Аналогично предыдущему. +); +endmodule ``` ### Порядок выполнения задания @@ -303,7 +335,7 @@ module fulladder32( 4. Проверьте содержимое TCL-консоли. Убедитесь в появлении сообщения о завершении теста. В случае, если в tcl-консоли написано `CLICK THE BUTTON 'Run All'`, вам необходимо нажать соответствующую кнопку на панели моделирования. 5. Убедитесь по сигналам временной диаграммы, что модуль работает корректно. 8. В `Design Sources` проекта создайте `SystemVerilog`-файл `fulladder32`. -9. Опишите модуль `fulladder32` так, чтобы в нем выполнялось поразрядное сложение двух 32-разрядных чисел и входного бита переноса. Его можно реализовать через последовательное соединение восьми 4-битных сумматоров, либо же можно соединить 32 однобитных сумматора (как вручную, так и с помощью конструкции `generate for`). +9. Опишите модуль `fulladder32` так, чтобы в нем выполнялось поразрядное сложение двух 32-разрядных чисел и входного бита переноса. Его можно реализовать через последовательное соединение восьми 4-битных сумматоров, либо же можно соединить 32 однобитных сумматора (как вручную, так и с создания массива модулей). 1. Обратите внимание, что входной бит переноса должен подаваться на сумматор, выполняющий сложение нулевого разряда, выходной бит переноса соединяется с выходным битом переноса сумматора, выполняющего сложение 31-го разряда. 10. Проверьте 32-битный сумматор. Для этого: 1. В `Simulation Sources` проекта создайте `SystemVerilog`-файл `tb_fulladder32`.