From 06dc07c03f5084540138e392f3c5179704d30672 Mon Sep 17 00:00:00 2001 From: Andrei Solodovnikov Date: Mon, 1 Jul 2024 16:58:11 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A1=D1=82=D0=B8=D0=BB=D0=B8=D1=81=D1=82?= =?UTF-8?q?=D0=B8=D1=87=D0=B5=D1=81=D0=BA=D0=B8=D0=B5=20=D0=BF=D1=80=D0=B0?= =?UTF-8?q?=D0=B2=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Introduction/Implementation steps.md | 4 +-- Labs/01. Adder/README.md | 4 +-- Labs/02. Arithmetic-logic unit/README.md | 8 ++--- .../README.md | 2 +- Labs/05. Main decoder/README.md | 30 ++++++++----------- Labs/13. Peripheral units/README.md | 2 +- Labs/15. Programming device/README.md | 2 +- Labs/16. Coremark/README.md | 2 +- README.md | 2 +- 9 files changed, 26 insertions(+), 30 deletions(-) diff --git a/Introduction/Implementation steps.md b/Introduction/Implementation steps.md index cb4cdb12..aa320bf0 100644 --- a/Introduction/Implementation steps.md +++ b/Introduction/Implementation steps.md @@ -10,7 +10,7 @@ В русскоязычной литературе не сложилось устоявшихся терминов для этапов 1 и 3, но **elaboration** можно назвать как "**предобработку**" или "**развертывание**", а **implementation** как "**реализацию**" или "**построение**". Этапы 2 и 4 переводятся дословно: **синтез** и "**генерация двоичного файла конфигурации** (**битстрима**)". -Более того, граница между этапами весьма условна и в зависимости от используемой **системы автоматизированного проектирования** (**САПР**), задачи, выполняемые на различных этапах могут перетекать из одного в другой. Описание этапов будет даваться для маршрута проектирования под ПЛИС, однако, с некоторыми оговорками, эти же этапы используются и при проектировании сверхбольших интегральных схем (СБИС). +Более того, граница между этапами весьма условна и в зависимости от используемой **системы автоматизированного проектирования** (**САПР**), задачи, выполняемые на различных этапах, могут перетекать из одного в другой. Описание этапов будет даваться для маршрута проектирования под ПЛИС, однако, с некоторыми оговорками, эти же этапы используются и при проектировании сверхбольших интегральных схем (СБИС). Остановимся на каждом шаге подробнее. @@ -124,7 +124,7 @@ _Рисунок 3. Результат этапа синтеза._ ## Implementation -После получения нетлиста, где в качестве элементов используются ресурсы конкретной ПЛИС, происходит **размещение** этой схемы на элементы заданной ПЛИС: выбираются конкретные логические ячейки. Затем происходит **трассировка** (маршрутизация) связей между ними. Для этих процедур часто используется термин **place & route** (размещение и трассировка). Например, реализация 32-битного сумматора с ускоренным переносом может потребовать 32 LUT-а и 8 примитивов вычисления быстрого переноса (`CARRY4`). Будет неразумно использовать для этого примитивы, разбросанные по всему кристаллу ПЛИС, ведь тогда придётся выполнять сложную трассировку сигнала, да и временные характеристики устройства так же пострадают (сигналу, идущему от предыдущего разряда к следующему придётся проходить больший путь). Вместо этого, САПР будет пытаться разместить схему таким образом, чтобы использовались близлежащие примитивы ПЛИС, для получения оптимальных характеристик. +После получения нетлиста, где в качестве элементов используются ресурсы конкретной ПЛИС, происходит **размещение** этой схемы на элементы заданной ПЛИС: выбираются конкретные логические ячейки. Затем происходит **трассировка** (маршрутизация) связей между ними. Для этих процедур часто используется термин **place & route** (размещение и трассировка). Например, реализация 32-битного сумматора с ускоренным переносом может потребовать 32 LUT-а и 8 примитивов вычисления быстрого переноса (`CARRY4`). Будет неразумно использовать для этого примитивы, разбросанные по всему кристаллу ПЛИС, ведь тогда придётся выполнять сложную трассировку сигнала, да и временные характеристики устройства так же пострадают (сигналу, идущему от предыдущего разряда к следующему, придётся проходить больший путь). Вместо этого, САПР будет пытаться разместить схему таким образом, чтобы использовались близлежащие примитивы ПЛИС, для получения оптимальных характеристик. Что именно считается "оптимальным" зависит от двух вещей: настроек САПР и **ограничений** (**constraints**), учитываемых при построении итоговой схемы в ПЛИС. Ограничения сужают область возможных решений по размещению примитивов внутри ПЛИС под определенные характеристики (временны́е и физические). Например, можно сказать, внутри ПЛИС схема должна быть размещена таким образом, чтобы время прохождения по **критическому пути** не превышало `20ns`. Это временно́е ограничение. Также нужно сообщить САПР, к какой ножке ПЛИС необходимо подключить входы и выходы нашей схемы — это физическое ограничение. diff --git a/Labs/01. Adder/README.md b/Labs/01. Adder/README.md index 638cc135..996437fc 100644 --- a/Labs/01. Adder/README.md +++ b/Labs/01. Adder/README.md @@ -4,7 +4,7 @@ Познакомиться с САПР Vivado и научиться реализовывать в нём простейшие схемотехнические модули с помощью конструкций языка SystemVerilog. -## Материал для подготовки к лабораторной работе +## Материалы для подготовки к лабораторной работе [Описание модулей на языке SystemVerilog](../../Basic%20Verilog%20structures/Modules.md). @@ -63,7 +63,7 @@ _Таблица истинности одноразрядного сложения._ -`S` — это младший разряд суммы, записываемый в столбце сложения под слагаемыми `a` и `b`. `C` (_carry_, перенос) — это старший разряд суммы, записываемый левее, если произошел перенос разряда. Как мы видим, перенос разряда происходит только в случае, когда оба числа одновременно равны единице. При этом значение `S` обращается в `0`, и результат записывается как `10`, что в двоичной системе означает `2`. Кроме того, значение `S` равно `0` и в случае, когда оба операнда одновременно равны нулю. Вы можете заметить, что `S` равно нулю в тех случаях, когда `а` и `b` равны, и не равно нулю в противоположном случае. Подобным свойством обладает логическая операция **Исключающее ИЛИ** (**eXclusive OR**, **XOR**): +`S` — это младший разряд 2-битного результата суммы, записываемый в столбце сложения под слагаемыми `a` и `b`. `C` (_carry_, перенос) — это старший разряд суммы, записываемый левее, если произошел перенос разряда. Как мы видим, перенос разряда происходит только в случае, когда оба числа одновременно равны единице. При этом значение `S` обращается в `0`, и результат записывается как `10`, что в двоичной системе означает `2`. Кроме того, значение `S` равно `0` и в случае, когда оба операнда одновременно равны нулю. Вы можете заметить, что `S` равно нулю в тех случаях, когда `а` и `b` равны, и не равно нулю в противоположном случае. Подобным свойством обладает логическая операция **Исключающее ИЛИ** (**eXclusive OR**, **XOR**): ![../../.pic/Labs/lab_01_adder/tt2.png](../../.pic/Labs/lab_01_adder/tt2.png) diff --git a/Labs/02. Arithmetic-logic unit/README.md b/Labs/02. Arithmetic-logic unit/README.md index 73bfc0db..7c0accc3 100644 --- a/Labs/02. Arithmetic-logic unit/README.md +++ b/Labs/02. Arithmetic-logic unit/README.md @@ -6,7 +6,7 @@ Используя навыки по описанию мультиплексоров, писать блок арифметико-логического устройства (АЛУ) на языке SystemVerilog. -## Допуск к лабораторной работе +## Материалы для подготовки к лабораторной работе Освоить [описание мультиплексора на языке SystemVerilog](../../Basic%20Verilog%20structures/Multiplexors.md). @@ -20,7 +20,7 @@ ## Теория -Арифметико-логическое устройство (АЛУ, Arithmetic Logic Unit – ALU) – это блок процессора, выполняющий арифметические и поразрядно логические операции. Разница между арифметическими и логическими операциями в отсутствии у последних бита переноса, так как логические операции происходят между однобитными числами и дают однобитный результат, а в случае АЛУ (в рамках данной лабораторной работы) одновременно между 32-мя однобитными парами чисел. В логических операциях результаты значений отдельных битов друг с другом никак не связаны. +Арифметико-логическое устройство (АЛУ, Arithmetic Logic Unit – ALU) – это блок процессора, выполняющий арифметические и поразрядно логические операции. Разница между арифметическими и логическими операциями в отсутствии у последних бита переноса, так как логические операции происходят между 1-битными числами и дают 1-битный результат, а в случае АЛУ (в рамках данной лабораторной работы) одновременно между 32-мя 1-битными парами чисел. В логических операциях результаты значений отдельных битов друг с другом никак не связаны. Также, кроме результата операций, АЛУ формирует флаги, которые показывают выполняется ли заданное условие. Например, выведет `1`, если один операнд меньше другого. @@ -30,11 +30,11 @@ _Рисунок 1. Структурное обозначение элемента АЛУ[1, стр. 305]._ -На рис. 1 изображен пример АЛУ, используемый в книге "Цифровая схемотехника и архитектура компьютера" Харрис и Харрис. На входы `A` и `B` поступают операнды с разрядностью _N_. На трехбитный вход `F` подается код операции. Например, если туда подать `000`, то на выходе `Y` появится результат операции _логическое И_ между битами операндов `A` и `B`. Если на `F` подать `010`, то на выходе появится результат сложения. Это лишь пример, разрядность и коды могут отличаться в зависимости от количества выполняемых операций и архитектуры. +На рис. 1 изображен пример АЛУ, используемый в книге "Цифровая схемотехника и архитектура компьютера" Харрис и Харрис. На входы `A` и `B` поступают операнды с разрядностью _N_. На 3-битный вход `F` подается код операции. Например, если туда подать `000`, то на выходе `Y` появится результат операции _логическое И_ между битами операндов `A` и `B`. Если на `F` подать `010`, то на выходе появится результат сложения. Это лишь пример, разрядность и коды могут отличаться в зависимости от количества выполняемых операций и архитектуры. Существует несколько подходов к реализации АЛУ, отличающиеся внутренней организацией. В лабораторных работах применяется повсеместно используемый подход мультиплексирования операций, то есть подключения нескольких операционных устройств (которые выполняют какие-то операции, например сложения, логическое И и т.п.) к мультиплексору, который будет передавать результат нужного операционного устройства на выходы АЛУ. -Рассмотрим на примере все того же АЛУ MIPS из книги Харрисов. На рис. 2, в левой его части, изображена внутренняя организация этого АЛУ, справа – таблица соответствия кодов операциям. На выходе схемы (внизу) стоит четырехвходовый мультиплексор, управляемый двумя из трех битов `F`. К его входам подключены _N_ логических И (побитовое И _N_-разрядных операндов), _N_ логических ИЛИ, _N_-разрядный сумматор и Zero Extend – устройство делающее из однобитного числа _N_-битное число, дополняя нулями слева. +Рассмотрим на примере все того же АЛУ MIPS из книги Харрисов. На рис. 2, в левой его части, изображена внутренняя организация этого АЛУ, справа – таблица соответствия кодов операциям. На выходе схемы (внизу) стоит четырехвходовый мультиплексор, управляемый двумя из трех битов `F`. К его входам подключены _N_ логических И (побитовое И _N_-битных операндов), _N_ логических ИЛИ, _N_-битный сумматор и Zero Extend – устройство делающее из 1-битного числа _N_-битное число, дополняя нулями слева. К одному из входов этих операционных устройств подключен `A` без изменений, а ко второму подключен выход двухвходового мультиплексора, управляемого оставшимся битом _F_. То есть `F[2]` определяет, что будет вторым операндом: `B` или `~B`. Вдобавок `F[2]` подается на входной перенос сумматора, то есть, когда `F[2] == 1` на выходе сумматора появляется результат операции `A + ~B + 1`, что (с учетом [дополнительного кода](https://ru.wikipedia.org/wiki/Дополнительный_код)) эквивалентно `A – B`. diff --git a/Labs/04. Primitive programmable device/README.md b/Labs/04. Primitive programmable device/README.md index 9aa7c0b6..50385a76 100644 --- a/Labs/04. Primitive programmable device/README.md +++ b/Labs/04. Primitive programmable device/README.md @@ -2,7 +2,7 @@ В этой лабораторной работе на основе ранее разработанных блоков памяти и АЛУ ты соберешь простой учебный процессор с архитектурой `CYBERcobra 3000 Pro 2.1`. Это нужно для более глубокого понимания принципов работы программируемых устройств, чтобы проще было понять архитектуру RISC-V в будущем. -## Допуск к лабораторной работе +## Материал для подготовки к лабораторной работе Для выполнения этой лабораторной работы, необходимо в полной мере освоить следующие элементы синтаксиса языка SystemVerilog: diff --git a/Labs/05. Main decoder/README.md b/Labs/05. Main decoder/README.md index 72d18b7a..379887af 100644 --- a/Labs/05. Main decoder/README.md +++ b/Labs/05. Main decoder/README.md @@ -338,35 +338,31 @@ _Таблица 5. Описание портов дешифратора кома Рассмотрим пример ниже. Внутри конструкции `always_comb`, перед конструкцией `case` указываются значения по-умолчанию. Благодаря этому пропадает необходимость указывать все сигналы внутри каждого обработчика `case`, достаточно указать только те, что имеют значение отличное от значения по-умолчанию. Представленный пример реализует комбинационную схему, которая при `cucumber == 4'b1100` будет выставлять сигнал `c == 1'b0`, то есть отличное, от значения по-умолчанию. Сигнал `a` никак не меняется, поэтому он не указан в соответствующем обработчике. Если сигнал `size == 1'b0`, то `b` будет равен 1, а `d` равен 0. Если сигнал `size == 1'b1`, то наоборот – `b` будет равен 0, а `d` равен 1. ```SystemVerilog - - -// ... какие-то еще дефайны - -module tequila ( - input logic [3:0] cucumber; - input logic size; +module example ( + input logic [3:0] control_signal; + input logic sub_signal; output logic a, b, c, d; ); - parameter logic [3:0] PICKLE = 4'b1100; + parameter logic [3:0] SOME_PARAM = 4'b1100; always_comb begin a = 1'b0; // значения по-умолчанию b = 1'b0; // обратите внимание, что в блоке c = 1'b1; // always_comb используется оператор d = 1'b0; // блокирующего присваивания - case(cucumber) + case(control_signal) // ... какие-то еще комбинации - PICKLE: begin // если на cucumber значение PICKLE + SOME_PARAM: begin // если на control_signal значение SOME_PARAM c = 1'b0; - case (size) - 1'b0: b = 1'b1; // если на size значение 1'b0 - 1'b1: d = 1'b1; // если на size значение 1'b1 + case (sub_signal) + 1'b0: b = 1'b1; // если на sub_signal значение 1'b0 + 1'b1: d = 1'b1; // если на sub_signal значение 1'b1 endcase end - // ... какие-то еще обработчики + // ... какие-то еще обработчики default: begin // так как описаны не все значения - a = 1'b0; // cucumber, то чтобы case не было - b = 1'b0; // защелки (latch) на выходе - c = 1'b1; // нужно обязательно добавлять + a = 1'b0; // control_signal, то чтобы результатом + b = 1'b0; // case не было защелки (latch), + c = 1'b1; // на выходе нужно обязательно добавлять d = 1'b0; // default end endcase diff --git a/Labs/13. Peripheral units/README.md b/Labs/13. Peripheral units/README.md index 6f55ff6c..3921c195 100644 --- a/Labs/13. Peripheral units/README.md +++ b/Labs/13. Peripheral units/README.md @@ -8,7 +8,7 @@ --- -## Допуск к лабораторной работе +## Материал для подготовки к лабораторной работе Для успешного выполнения лабораторной работы, вам необходимо: diff --git a/Labs/15. Programming device/README.md b/Labs/15. Programming device/README.md index 253caed8..7e3bd707 100644 --- a/Labs/15. Programming device/README.md +++ b/Labs/15. Programming device/README.md @@ -1,6 +1,6 @@ # Лабораторная работа 15 "Программатор" -Чтобы выпустить микроконтроллер в "дикую природу", то есть, чтобы его можно было использовать не в лабораторных условиях, а независимо от всего этого дополнительного оборудования, необходимо придусмотреть механизм замены исполняемой программы. +Чтобы выпустить микроконтроллер в "дикую природу", то есть, чтобы его можно было использовать не в лабораторных условиях, а независимо от всего этого дополнительного оборудования, необходимо предусмотреть механизм замены исполняемой программы. ## Цель diff --git a/Labs/16. Coremark/README.md b/Labs/16. Coremark/README.md index 9a2bff70..54f0db2a 100644 --- a/Labs/16. Coremark/README.md +++ b/Labs/16. Coremark/README.md @@ -1,6 +1,6 @@ # Лабораторная работа 16 "Оценка производительности" -## Допуск к лабораторной работе +## Материал для подготовки к лабораторной работе Данная лабораторная работа будет полностью опираться на навыки, полученные в ходе выполнения лабораторных работ: diff --git a/README.md b/README.md index 634acf8d..3d19eec5 100644 --- a/README.md +++ b/README.md @@ -141,7 +141,7 @@ | Барков Евгений Сергеевич | Профессиональные консультации по деталям языка SystemVerilog, спецификации RISC-V и RTL-разработки, тематике синтеза и констрейнов. | | Булавин Никита Сергеевич | Отработка материалов, подготовка тестбенчей и модулей верхнего уровня для плат Nexys A7 для лабораторных работ. | | Козин Алексей Александрович | Отработка материалов, подготовка обфусцированных модулей для лабораторных работ. | -| Коршунов Андрей Владимирович | Профессиональные консультации по темам проектирования синтеза цифровых схем, помощь в написании документа "Этапы реализации проекта в ПЛИС" | +| Коршунов Андрей Владимирович | Профессиональные консультации по темам проектирования синтеза цифровых схем, помощь в написании документа "Этапы реализации проекта в ПЛИС". | | [Кулешов Владислав Константинович](https://t.me/SaintLiver) | Вычитка и исправление ошибок в методических материалах, сбор обратной связи от студентов. | | Орлов Александр Николаевич | Профессиональные консультации по деталям языка SystemVerilog, спецификации RISC-V и RTL-разработки, примерами программ иллюстрирующим особенности архитектуры. | | Примаков Евгений Владимирович | Профессиональные консультации по деталям языка SystemVerilog, спецификации RISC-V и RTL-разработки и вопросам микроархитектуры. |