Merge branch 'master' into module_array_ref
10
.github/Intro.md
vendored
@@ -76,21 +76,21 @@
|
||||
|
||||
Вне зависимости от вашего уровня подготовки, работу с этим курсом рекомендуется начать с прочтения документов из части: "Введение".
|
||||
|
||||
Далее можно приступать к разделу "Лабораторные работы". Перед каждым лабораторным занятием вам **рекомендуется** ознакомиться с методичкой, они очень подробные и их чтение требует какого-то времени. Время отведенное на лабораторное занятие рекомендуется использовать по-максимуму, то есть заниматься практической деятельностью, консультироваться с преподавателем, отлаживать разработанные блоки устройства и тому подобное, а для этого лучше прочитать методичку заранее.
|
||||
Далее можно приступать к разделу "Лабораторные работы". Перед каждым лабораторным занятием вам **рекомендуется** ознакомиться с методичкой, они очень подробные и их чтение требует какого-то времени. Время, отведенное на лабораторное, занятие рекомендуется использовать по-максимуму, то есть заниматься практической деятельностью, консультироваться с преподавателем, отлаживать разработанные блоки устройства и тому подобное, а для этого лучше прочитать методичку заранее.
|
||||
|
||||
Кроме того, важно отметить, что в начале каждой методички размещен раздел "Допуск", где перечислены все материалы со ссылками на главы раздела "Базовые конструкции SystemVerilog", которые студент **должен освоить** перед выполнением этой лабораторной работы. Данный раздел ориентирован в первую очередь на студентов, не работавших ранее с Verilog/SystemVerilog, однако, даже если вы работали с этими языками, рекомендуется пролистать данные главы и проверить свои знания в разделе "Проверь себя".
|
||||
|
||||
Традиционно, данные лабораторные считаются сложными. Однако за годы отработки методичек со студентами, было написано множество вспомогательных материалов, уточнений, а так же акцентов на места, которые могут привести к ошибке. В данный момент, для успешного выполнения лабораторной работы от студента требуется только внимательно прочитать предоставленный ему материал и не бояться задать вопрос, если что-то непонятно.
|
||||
Традиционно, данные лабораторные считаются сложными. Однако за годы отработки методичек со студентами, было написано множество вспомогательных материалов, уточнений, а также акцентов на места, которые могут привести к ошибке. В данный момент, для успешного выполнения лабораторной работы от студента требуется только внимательно прочитать предоставленный ему материал и не бояться задать вопрос, если что-то непонятно.
|
||||
|
||||
Лабораторные занятия будут проходить с использованием САПР `Vivado` (и отладочными стендами `Nexys A7`). Это очень сложный профессиональный инструмент, на полноценное изучение которого могут уйти годы. Во время данного курса лабораторных работ нет времени на эти годы, поэтому для вас собрана основная информация по взаимодействию с САПР в разделе "Основы Vivado". Этой информации хватит, чтобы с помощью `Vivado` реализовать весь цикл лабораторных работ.
|
||||
|
||||
Если вы читаете данную книгу не в рамках курса АПС, вы вольны в выборе как программных средств, так и способов отладки. [Репозиторий](https://github.com/MPSU/APS), сопровождающий эту книгу будет содержать некоторые файлы, специализированные для плат Nexys A7 (так называемые _ограничения_/_констрейны_), однако при должном уровне навыков вы с легкостью сможете портировать его под свою плату. В этому случае, авторы будут признательны, если вы предоставите получившиеся файлы и название платы, чтобы их можно было добавить в отдельную папку по другим платам для будущих читателей. По всем вопросам/замечаниям/предложениям вы можете связаться с авторами курса через механику `Issues` и `Discussions` данного репозитория.
|
||||
Если вы читаете данную книгу не в рамках курса АПС, вы вольны в выборе как программных средств, так и способов отладки. [Репозиторий](https://github.com/MPSU/APS), сопровождающий эту книгу будет содержать некоторые файлы, специализированные для плат Nexys A7 (так называемые _ограничения_/_констрейны_), однако при должном уровне навыков вы с легкостью сможете портировать его под свою плату. В этому случае, авторы будут признательны, если вы предоставите получившиеся файлы и название платы, чтобы их можно было добавить в отдельную папку по другим платам для будущих читателей. По всем вопросам/замечаниям/предложениям вы можете связаться с авторами курса через разделы `Issues` и `Discussions` данного репозитория.
|
||||
|
||||
Эта книга может быть интересна и полезна читателю, не имеющему никакой отладочной платы: проверка работоспособности осуществляется в первую очередь на моделировании, т.е. программно (на самом деле, 90% времени вы будете проверять все именно посредством моделирования).
|
||||
|
||||
В ходе выполнения лабораторных работ вы наверняка столкнетесь как с ошибками связанными с работой Vivado, так и с ошибками описания на языке SystemVerilog. В первую очередь, рекомендуется ознакомиться с текстом ошибки. В случае ошибок, связанных с языком SystemVerilog, чаще всего там содержится вся необходимая информация по её устранению. В случае, если текст непонятен, рекомендуется ознакомиться со [списком типичных ошибок](Other/FAQ.md).
|
||||
В ходе выполнения лабораторных работ вы наверняка столкнетесь как с ошибками, связанными с работой Vivado, так и с ошибками описания на языке SystemVerilog. В первую очередь, рекомендуется ознакомиться с текстом ошибки. В случае ошибок, связанных с языком SystemVerilog, чаще всего там содержится вся необходимая информация по её устранению. В случае, если текст непонятен, рекомендуется ознакомиться со [списком типичных ошибок](Other/FAQ.md).
|
||||
|
||||
Материал этой книги будет пестрить множеством ссылок, которые в электронной версии этой книги, разумеется, будут кликабельными. Однако, если вы имеете удовольствие читать эту книгу в "аналоговом" формате, для вашего удобства все ссылки будут представлены в виде сносок под соответствующей страницей в текстовом формате. Текстовый формат вместо QR-кодов выбран чтобы иметь возможность вбить ссылку вручную на компьютере (все ссылки будут представлены в формате Unicode, так что не беспокойтесь, что вам придется вводить что-то наподобие "https://ru.wikipedia.org/wiki/%D0%A2%D1%80%D0%B8%D0%B3%D0%B3%D0%B5%D1%80"). Кроме того, "умные" камеры современных смартфонов отлично справляются с распознаванием текстовых ссылок, поэтому авторы надеются что и с этой стороны отсутствие QR-кодов не произведет неудобств.
|
||||
Материал этой книги будет пестрить множеством ссылок, которые в электронной версии этой книги, разумеется, будут кликабельными. Однако, если вы имеете удовольствие читать эту книгу в "аналоговом" формате, для вашего удобства все ссылки будут представлены в виде сносок под соответствующей страницей в текстовом формате. Текстовый формат вместо QR-кодов выбран чтобы иметь возможность вбить ссылку вручную на компьютере (все ссылки будут представлены в формате Unicode, так что не беспокойтесь, что вам придется вводить что-то наподобие "https://ru.wikipedia.org/wiki/%D0%A2%D1%80%D0%B8%D0%B3%D0%B3%D0%B5%D1%80"). Кроме того, "умные" камеры современных смартфонов отлично справляются с распознаванием текстовых ссылок, поэтому авторы надеются, что и с этой стороны отсутствие QR-кодов не произведет неудобств.
|
||||
|
||||
Большая часть информации, касающаяся архитектуры RISC-V взята напрямую из спецификации. Поскольку работа над спецификацией все ещё идёт (хотя базовый набор инструкций rv32i уже заморожен и не изменится), чтобы ссылки на конкретные страницы спецификации имели смысл, они будут даваться на следующие версии двух документов:
|
||||
|
||||
|
Before Width: | Height: | Size: 330 KiB |
4
.pic/Labs/board files/nexys_cobra_operations.drawio.svg
Normal file
After Width: | Height: | Size: 393 KiB |
4
.pic/Labs/board files/nexys_cobra_structure.drawio.svg
Normal file
After Width: | Height: | Size: 1.7 MiB |
After Width: | Height: | Size: 250 KiB |
After Width: | Height: | Size: 1.7 MiB |
Before Width: | Height: | Size: 240 KiB After Width: | Height: | Size: 239 KiB |
@@ -93,7 +93,7 @@ logic Y;
|
||||
always_comb begin // 1) Используется always_comb, т.к. мы хотим подключить
|
||||
// выход мультиплексора к проводу
|
||||
if(S) begin // 2) if-else может находиться только внутри блока always.
|
||||
Y = D1; // 3) Используется оператор неблокирующего присваивания.
|
||||
Y = D1; // 3) Используется оператор блокирующего присваивания.
|
||||
end else begin
|
||||
Y = D0;
|
||||
end
|
||||
|
@@ -17,7 +17,7 @@
|
||||
|
||||
## История появления ПЛИС
|
||||
|
||||
До появления интегральных схем, электронные схемы собирались из отдельных элементов, как модель, собранная из кубиков Lego. В случае, если при сборке электронной схемы была допущена ошибка, вы могли исправить её ручной корректировкой соединения элементов подобно исправлению ошибки, допущенной при сборке модели Lego.
|
||||
До появления интегральных схем электронные схемы собирались из отдельных элементов, как модель, собранная из кубиков Lego. В случае, если при сборке электронной схемы была допущена ошибка, вы могли исправить её ручной корректировкой соединения элементов подобно исправлению ошибки, допущенной при сборке модели Lego.
|
||||
С улучшением технологических процессов произошла миниатюризация базовых элементов, из которых состоят электронные схемы, что привело к появлению интегральных схем — электронных схем, выполненных на полупроводниковой подложке и заключенных в неразборный корпус.
|
||||
В большинстве случаев, исправить ошибку, допущенную при разработке и изготовлении интегральной схемы становится невозможным. С учетом того, что изготовление прототипа интегральной схемы является затратным мероприятием (от десятков тысяч до миллионов долларов в зависимости от тех процесса и площади изготавливаемого кристалла), возникла необходимость в способе проверки прототипа схемы до изготовления её прототипа. Так появились **программируемые логические интегральные схемы** (**ПЛИС**).
|
||||
ПЛИС содержит некое конечное множество базовых блоков (примитивов), программируемые блоки межсоединений примитивов и блоки ввода-вывода. Подав определенный набор воздействий на ПЛИС (**запрограммировав** её), можно настроить примитивы, их межсоединения между собой и блоками ввода-вывода, чтобы получить определенную цифровую схему. Удобство ПЛИС заключается в том, что в случае обнаружения ошибки на прототипе, исполненном в ПЛИС, вы можете исправить свою цифровую схему, и повторно запрограммировать ПЛИС.
|
||||
@@ -41,19 +41,19 @@
|
||||
|
||||
Существует множество логических вентилей, но чаще всего используется четыре из них: **И**, **ИЛИ**, **Исключающее ИЛИ**, **НЕ**. Каждый из этих элементов принимает на вход **цифровое значение** (см. [**цифровая схема**](#цифровые-схемы)), выполняет определенную **логическую функцию** над входами и подает на выход результат этой функции в виде **цифрового значения**.
|
||||
|
||||
Логический вентиль **И** принимает два входа и выдает на выход значение `1` только в том случае, если оба входа равны `1`. Если хотя бы один из входов `0`, то на выходе будет `0`. На схемах, логический вентиль **И** отображается следующим образом:
|
||||
Логический вентиль **И** принимает два входа и выдает на выход значение `1` только в том случае, если оба входа равны `1`. Если хотя бы один из входов `0`, то на выходе будет `0`. На схемах логический вентиль **И** отображается следующим образом:
|
||||
|
||||

|
||||
|
||||
_Рисунок 1. Обозначение логического вентиля **И**._
|
||||
|
||||
Логический вентиль **ИЛИ** принимает два входа и выдает на выход значение `1` в случае, если хотя бы один из входов равен `1`. Если оба входа равны `0`, то на выходе будет `0`. На схемах, логический вентиль **ИЛИ** отображается следующим образом:
|
||||
Логический вентиль **ИЛИ** принимает два входа и выдает на выход значение `1` в случае, если хотя бы один из входов равен `1`. Если оба входа равны `0`, то на выходе будет `0`. На схемах логический вентиль **ИЛИ** отображается следующим образом:
|
||||
|
||||

|
||||
|
||||
_Рисунок 2. Обозначение логического вентиля **ИЛИ**._
|
||||
|
||||
Логический вентиль **Исключающее ИЛИ** принимает два входа и выдает на выход значение `1` в случае, если значения входов не равны между собой (один из них равен `1`, а другой `0`). Если значения входов равны между собой (оба равны `0` или оба равны `1`), то на выходе будет `0`. На схемах, логический вентиль **Исключающее ИЛИ** отображается следующим образом:
|
||||
Логический вентиль **Исключающее ИЛИ** принимает два входа и выдает на выход значение `1` в случае, если значения входов не равны между собой (один из них равен `1`, а другой `0`). Если значения входов равны между собой (оба равны `0` или оба равны `1`), то на выходе будет `0`. На схемах логический вентиль **Исключающее ИЛИ** отображается следующим образом:
|
||||
|
||||

|
||||
|
||||
|
@@ -200,7 +200,7 @@ set_property -dict { PACKAGE_PIN C12 IOSTANDARD LVCMOS33 } [get_ports { resetn
|
||||
|
||||

|
||||
|
||||
Теперь, мы можем посмотреть на "внутренности" нашей ПЛИС `xc7a100tcsg324-1` и то, как через её примитивы будет реализована наша схема. Для этого, необходимо отрыть имплементированное устройство: `Implementation -> Open implemented design`. Откроется следующее окно:
|
||||
Теперь, мы можем посмотреть на "внутренности" нашей ПЛИС `xc7a100tcsg324-1` и то, как через её примитивы будет реализована наша схема. Для этого необходимо отрыть имплементированное устройство: `Implementation -> Open implemented design`. Откроется следующее окно:
|
||||
|
||||

|
||||
|
||||
|
@@ -10,6 +10,6 @@
|
||||
|
||||
И в довершение, вам предлагается прочитать документ "[Implementation Steps](./Implementation%20steps.md)". Этот документ дополнит ваше понимание о принципе работы ПЛИС и позволит посмотреть на некоторые её реальные элементы изнутри.
|
||||
|
||||
Обратите внимание, что во втором абзаце не было использовано слово "поймете". Часто это слово несет не тот смысл. Можно прочесть документ и **понять** каждое его слово, но не постигнуть смысла, который в этих слова лежал (**слышать**, но не **слушать**). В романе Роберта Хайнлайна "_Чужак в чужой стране_" вводится особое марсианское слово, непереводимое на земной язык: "**грокать**", которое имеет множество значений. В первом приближении можно подумать, что это слово переводится как "понять", однако это не так. Например, на Марсе очень мало воды и процесс её питья марсианами (по сюжету романа, разумеется) является целым ритуалом, и обозначается этим же словом "грокать". Грокать что-то — означает что это что-то стало частью твоего естества. В отношении информации это означает, это информация стала частью тебя, изменила то как ты думаешь. Грокать — это постичь что-то на самом глубинном уровне, это видеть девушку в красном сквозь завесу падающих зеленых символов. Даже этот абзац расписан для того, чтобы вы не просто поняли что эти документы важно понять — а грокнули то, что эти документы важно грокнуть.
|
||||
Обратите внимание, что во втором абзаце не было использовано слово "поймете". Часто это слово несет не тот смысл. Можно прочесть документ и **понять** каждое его слово, но не постигнуть смысла, который в этих слова лежал (**слышать**, но не **слушать**). В романе Роберта Хайнлайна "_Чужак в чужой стране_" вводится особое марсианское слово, непереводимое на земной язык: "**грокать**", которое имеет множество значений. В первом приближении можно подумать, что это слово переводится как "понять", однако это не так. Например, на Марсе очень мало воды и процесс её питья марсианами (по сюжету романа, разумеется) является целым ритуалом, и обозначается этим же словом "грокать". Грокать что-то — означает что это что-то стало частью твоего естества. В отношении информации это означает, это информация стала частью тебя, изменила то, как ты думаешь. Грокать — это постичь что-то на самом глубинном уровне, это видеть девушку в красном сквозь завесу падающих зеленых символов. Даже этот абзац расписан для того, чтобы вы не просто поняли, что эти документы важно понять — а грокнули то, что эти документы важно грокнуть.
|
||||
|
||||
На самом деле не важно, каким словом будет обозначен результат вашего прочтения. Важно то, что если после того как вы прочтете эти документы, на лабах вы будете употреблять словосочетания наподобие: "_объявляем переменную_", значит что-то пошло не так, и образ вашего мышления все еще заперт в парадигме "программирования". Это не то чтобы плохо, просто усложнит вам процесс изучения и выполнения лабораторных работ.
|
||||
|
@@ -28,7 +28,7 @@ _Рисунок 3. Структурная схема intel 4004[[2]](https://en.
|
||||
_Рисунок 4. Структурная схема блока аппаратного шифрования по алгоритму AES[[3]](https://iis-people.ee.ethz.ch/~kgf/acacia/acacia_thesis.pdf)._
|
||||
|
||||
Заметьте, что даже этот блок не является атомарным. Каждая операция Исключающего ИЛИ, умножения, мультиплексирования сигнала и таблицы подстановки — это отдельные блоки, функционал которых еще надо реализовать.
|
||||
В какой-то момент, инженеры поняли, что проще описать цифровую схему в текстовом представлении, нежели в графическом.
|
||||
В какой-то момент инженеры поняли, что проще описать цифровую схему в текстовом представлении, нежели в графическом.
|
||||
Как можно описать цифровую схему текстом? Рассмотрим цифровую схему полусумматора:
|
||||
|
||||

|
||||
|
@@ -160,9 +160,11 @@ _Рисунок 3. Цифровая схема модуля half_adder, сген
|
||||
|
||||
Схема похожа на _рис. 1_, но как проверить, что эта схема не содержит ошибок и делает именно то, что от нее ожидается?
|
||||
|
||||
Для этого необходимо провести моделирование этой схемы. Во время моделирования на вход схемы подаются входные воздействия. Каждое изменение входных сигналов схемы приводит к каскадному изменению состояния внутренних цепей, которые в итоге меняют выходные сигналы.
|
||||
Для этого необходимо провести моделирование этой схемы. Во время моделирования на вход схемы подаются входные воздействия. Каждое изменение входных сигналов схемы приводит к каскадному изменению состояний внутренних цепей, которые в итоге меняют выходные сигналы.
|
||||
|
||||
Подаваемые на схему входные воздействия формируются верификационным окружением. Верификационное окружение (или тестбенч) — это особый несинтезируемый модуль, который не имеет входных или выходных сигналов. Ему не нужны входные сигналы, поскольку он сам является генератором всех своих внутренних сигналов, и ему не нужны выходные сигналы, поскольку этот модуль ничего не вычисляет, только подает входные воздействия на проверяемый модуль. Внутри тестбенча можно использовать конструкции из несинтезируемого подмножества языка SystemVerilog, в частности программный блок `initial`, в котором команды выполняются последовательно, что делает этот блок чем-то отдаленно похожим на проверяющую программу. Поскольку изменение внутренних цепей происходит с некоторой задержкой относительно изменений входных сигналов, при моделировании есть возможность делать паузы между командами. Это делается с помощью специального символа #, за которым указывается количество отсчётов времени симуляции, которое нужно пропустить перед следующей командой.
|
||||
Подаваемые на схему входные воздействия формируются верификационным окружением. Верификационное окружение (или тестбенч) — это особый несинтезируемый модуль, который не имеет входных или выходных сигналов. Ему не нужны входные сигналы, поскольку он сам является генератором всех своих внутренних сигналов, и ему не нужны выходные сигналы, поскольку этот модуль ничего не вычисляет, только подает входные воздействия на проверяемый модуль.
|
||||
|
||||
Внутри тестбенча можно использовать конструкции из несинтезируемого подмножества языка SystemVerilog, в частности программный блок `initial`, в котором команды выполняются последовательно, что делает этот блок чем-то отдаленно похожим на проверяющую программу. Поскольку изменение внутренних цепей происходит с некоторой задержкой относительно изменений входных сигналов, при моделировании есть возможность делать паузы между командами. Это делается с помощью специального символа #, за которым указывается количество отсчётов времени симуляции, которое нужно пропустить перед следующей командой.
|
||||
|
||||
Перед тем как писать верификационное окружение, необходимо составить план того, как будет проводиться проверка устройства (составить верификационный план).
|
||||
|
||||
@@ -211,7 +213,7 @@ _Рисунок 4. Временная диаграмма, моделирующа
|
||||
|
||||
_Рисунок 5. Схема четырехбитного сумматора._
|
||||
|
||||
Фиолетовой линией на схеме показаны провода, соединяющие выходной бит переноса сумматора предыдущего разряда, с входным битом переноса сумматора следующего разряда.
|
||||
Фиолетовой линией на схеме показаны провода, соединяющие выходной бит переноса сумматора предыдущего разряда с входным битом переноса сумматора следующего разряда.
|
||||
|
||||
Как же реализовать модуль, состоящий из цепочки других модулей? Половину этой задачи мы уже сделали, когда писали тестбенч к однобитному полусумматору в _Листинге 2_ — мы создавали модуль внутри другого модуля и подключали к нему провода. Теперь надо сделать то же самое, только с чуть большим числом модулей.
|
||||
|
||||
@@ -271,7 +273,7 @@ module fulladder4(
|
||||
- если разрядность подключаемого сигнала превосходит разрядность порта модуля из массива в `N` раз (где `N` — количество модулей в массиве), к модулю подключается соответствующий диапазон бит подключаемого сигнала (диапазон младших бит будет подключен к модулю с меньшим индексом в массиве).
|
||||
- если разрядность подключаемого сигнала не подходит ни под один из описанных выше пунктов, происходит ошибка синтеза схемы, поскольку в этом случае САПР не способен понять каким образом подключать данный сигнал к каждому модулю из массива.
|
||||
|
||||
Далее идет пример того, как можно создать массив модулей
|
||||
Далее идет пример того, как можно создать массив модулей:
|
||||
|
||||
```SystemVerilog
|
||||
module example1(
|
||||
@@ -315,6 +317,9 @@ example1 instance_array[7:0]( // Создается массив из 8 моду
|
||||
endmodule
|
||||
```
|
||||
|
||||
_Листинг 3. Пример создания массива модулей._
|
||||
|
||||
|
||||
### Порядок выполнения задания
|
||||
|
||||
1. Создайте проект, согласно [руководству по созданию проекта в Vivado](../../Vivado%20Basics/Vivado%20trainer.md)
|
||||
|
@@ -218,7 +218,7 @@ endmodule
|
||||
|
||||
### 1. Память инструкций
|
||||
|
||||
У данной памяти будет два порта:
|
||||
У данного модуля будет два входных/выходных сигнала:
|
||||
|
||||
- 32-битный вход адреса
|
||||
- 32-битный выход данных (асинхронное чтение)
|
||||
@@ -240,7 +240,7 @@ mоdulе instr_mеm(
|
||||
|
||||
### 2. Память данных
|
||||
|
||||
У данной памяти будет 8 портов:
|
||||
У данного модуля будет шесть входных/выходных сигналов:
|
||||
|
||||
- вход тактового синхроимпульса
|
||||
- вход запроса на работу с памятью
|
||||
@@ -267,9 +267,12 @@ mоdulе data_mеm(
|
||||
|
||||
Если `mem_req_i == 1` и `write_enable_i == 1`, то происходит запрос на запись в память. В этом случае, необходимо записать значение `write_data_i` в ячейку по адресу `addr_i[13:2]`. Во всех других случаях (любой из сигналов `mem_req_i`, `write_enable_i` равен нулю), запись в память не производится.
|
||||
|
||||
Если `mem_req_i == 1` и `write_enable_i == 0`, то происходит запрос на чтение из памяти. В этом случае, необходимо записать в выходной регистр `read_data_o` значение из ячейки по адресу `addr_i[13:2]`. Во всех других случаях чтение из памяти не производится (`read_data_o` сохраняет предыдущее значение).
|
||||
|
||||
|
||||
### 3. Регистровый файл
|
||||
|
||||
У данного модуля будет 8 портов:
|
||||
У данного модуля будет восемь входных/выходных сигналов:
|
||||
|
||||
- вход тактового синхроимпульса
|
||||
- вход сигнала разрешения записи
|
||||
@@ -311,9 +314,10 @@ mоdulе rf_r𝚒sсv(
|
||||
1. В `Design Sources` проекта с предыдущих лаб, создайте `SystemVerilog`-файл `instr_mem.sv`.
|
||||
2. Опишите в нем модуль памяти инструкций с таким же именем и портами, как указано в задании.
|
||||
1. Сперва необходимо создать память (массив регистров). Как это сделать, сказано в разделе [описание памяти на языке SystemVerilog](#описание-памяти-на-языке-systemverilog). Разрядность ячеек памяти должна быть 32 бита, количество ячеек — 1024.
|
||||
2. Добавить в проект [`файл с содержимым памяти инструкций`](program.mem). Данный файл будет использоваться при вызове системной функции `$readmemh` в описании памяти инструкций.
|
||||
2. Добавить в `Design Sources` проекта [`файл с содержимым памяти инструкций`](program.mem). Данный файл будет использоваться при вызове системной функции `$readmemh` в описании памяти инструкций.
|
||||
3. К созданной памяти необходимо подключить выход модуля `read_data_o`. При подключении должен быть использован вход модуля `addr_i`, значение которого должно быть уменьшено в 4 раза (побайтовая адресация).
|
||||
4. При реализации выхода `read_data_o` помните, что обращаясь к ячейке памяти, вам необходимо использовать `[11:2]` биты адреса.
|
||||
5. Реализуемый порт на чтение памяти инструкций должен быть **асинхронным**.
|
||||
3. После описания памяти инструкций, её необходимо проверить с помощью тестового окружения.
|
||||
1. Тестовое окружение находится [`здесь`](tb_instr_mem.sv).
|
||||
2. Для запуска симуляции воспользуйтесь [`этой инструкцией`](../../Vivado%20Basics/Run%20Simulation.md).
|
||||
@@ -322,7 +326,7 @@ mоdulе rf_r𝚒sсv(
|
||||
3. Реализуйте память данных. Для этого:
|
||||
1. В `Design Sources` проекта создайте `SystemVerilog`-файл `data_mem.sv`.
|
||||
2. Опишите в нем модуль памяти данных с таким же именем и портами, как указано в задании.
|
||||
1. Описание модуля будет схожим с описанием модуля памяти инструкций, однако порт чтения в этот раз будет **синхронным** (запись в него будет происходить в блоке `always_ff`). Кроме того, необходимо будет описать логику записи данных в память.
|
||||
1. Описание модуля будет схожим с описанием модуля памяти инструкций, однако порт чтения в этот раз будет **синхронным** (запись в него будет происходить в блоке `always_ff`). Количество ячеек в памяти данных — 4096. Кроме того, необходимо будет описать логику записи данных в память.
|
||||
2. Запись в ячейки памяти описывается подобно записи данных в [регистры](../../Basic%20Verilog%20structures/Registers.md), только при этом, происходит доступ к конкретной ячейке памяти с помощью входа `addr_i` (как осуществляется доступ к ячейкам памяти сказано в разделе [описание памяти на языке SystemVerilog](#описание-памяти-на-языке-systemverilog)).
|
||||
3. Доступ к ячейкам (на запись и чтение) осуществляется по адресу `addr_i[13:2]`.
|
||||
4. Обратите внимание что работа с памятью должна осуществляться только когда сигнал `mem_req_i == 1`, в противном случае запись не должна производиться, а на шине `read_data_o` должен оставаться результат предыдущего чтения.
|
||||
|
@@ -74,6 +74,17 @@ module tb_rf_riscv();
|
||||
$display("invalid memory size");
|
||||
err_count = err_count + 1;
|
||||
end
|
||||
RA1 <= 'b0;
|
||||
RA2 <= 'b0;
|
||||
@(posedge CLK);
|
||||
if( RD1 !== 'b0 ) begin
|
||||
$display("time = %0t. invalid data when reading at address 0: RD1 = %h", $time, RD1);
|
||||
err_count = err_count + 1;
|
||||
end
|
||||
if( RD2 !== 'b0 ) begin
|
||||
$display("time = %0t. invalid data when reading at address 0: RD2 = %h", $time, RD2);
|
||||
err_count = err_count + 1;
|
||||
end
|
||||
@(posedge CLK);
|
||||
WD <= 32'd1;
|
||||
WA <= '0;
|
||||
|
@@ -258,7 +258,7 @@ _Рисунок 5. Реализация безусловного переход
|
||||
1. 10 вычислительных инструкций `0 0 01 alu_op RA1 RA2 xxxx xxxx WA`
|
||||
2. Инструкция загрузки константы `0 0 00 const WA`
|
||||
3. Инструкция загрузки из внешних устройств `0 0 10 xxx xxxx xxxx xxxx xxxx xxxx WA`
|
||||
4. Безусловный переход `1 0 xx xxx xxxx xxxx xxxx const xxxxx`
|
||||
4. Безусловный переход `1 x xx xxx xxxx xxxx xxxx const xxxxx`
|
||||
5. 6 инструкций условного перехода `0 1 xx alu_op RA1 RA2 const x xxxx`
|
||||
|
||||
При кодировании инструкций используются следующие поля:
|
||||
@@ -317,7 +317,7 @@ _Рисунок 5. Реализация безусловного переход
|
||||
|
||||
Разработать процессор `CYBERcobra` (см. [_рис. 5_](../../.pic/Labs/lab_04_cybercobra/ppd_5.drawio.svg)), объединив ранее разработанные модули:
|
||||
|
||||
- Память инструкций (проинициализированную в двоичном формате файлом [`example.mem`](example.mem))
|
||||
- Память инструкций (проинициализированную в двоичном формате файлом [`program.mem`](program.mem))
|
||||
- Регистровый файл
|
||||
- Арифметико-логическое устройство
|
||||
- 32-битный сумматор
|
||||
@@ -344,7 +344,7 @@ endmodule
|
||||
1. В `Design Sources` проекта с предыдущих лаб, создайте `SystemVerilog`-файл `cybercobra.sv`.
|
||||
2. Опишите в нем модуль процессора с таким же именем и портами, как указано в [задании](#задание-по-реализации-процессора) (обратите внимание на регистр имени модуля).
|
||||
1. В первую очередь, необходимо создать счетчик команд и все вспомогательные провода. При создании, **следите за разрядностью**.
|
||||
2. Затем, необходимо создать экземпляры модулей: памяти инструкции, АЛУ, регистрового файла и сумматора. При подключении сигналов сумматора, надо **обязательно** надо подать нулевое значение на входной бит переноса. Выходной бит переноса подключать не обязательно.
|
||||
2. Затем, необходимо создать экземпляры модулей: памяти инструкции, АЛУ, регистрового файла и сумматора. При подключении сигналов сумматора, надо **обязательно** надо подать нулевое значение на входной бит переноса. Выходной бит переноса подключать не обязательно. Объекту памяти инструкций нужно дать имя `imem`.
|
||||
3. После этого, необходимо описать оставшуюся логику:
|
||||
1. Программного счетчика
|
||||
2. Сигнала управления мультиплексором, выбирающим слагаемое для программного счетчика
|
||||
@@ -353,7 +353,7 @@ endmodule
|
||||
5. Мультиплексор, выбирающий источник записи в регистровый файл.
|
||||
3. После описания модуля, его необходимо проверить с помощью [`тестового окружения`](../../Basic%20Verilog%20structures/Testbench.md).
|
||||
1. Тестовое окружение находится [`здесь`](tb_cybercobra.sv).
|
||||
2. Программа, которой необходимо проинициализировать память инструкций находится в файле [example.mem](example.mem). Алгоритм работы программы приведен в разделе [`Финальный обзор`](#финальный-обзор).
|
||||
2. Программа, которой необходимо проинициализировать память инструкций находится в файле [program.mem](program.mem). Алгоритм работы программы приведен в разделе [`Финальный обзор`](#финальный-обзор).
|
||||
3. Для запуска симуляции воспользуйтесь [`этой инструкцией`](../../Vivado%20Basics/Run%20Simulation.md).
|
||||
4. Перед запуском симуляции убедитесь, что выбран правильный модуль верхнего уровня.
|
||||
5. **Во время симуляции, вы должны прожать "Run All" и убедиться, что в логе есть сообщение о завершении теста!**
|
||||
|
@@ -1,11 +1,67 @@
|
||||
# Проверка работы CYBERcobra на ПЛИС
|
||||
|
||||
Если вы не понимаете, что лежит в этой папке, или если надо вспомнить, как прошить ПЛИС, можно воспользоваться [`этой инструкцией`](../../../Vivado%20Basics/Program%20nexys%20a7.md)
|
||||
После того, как вы проверили на моделировании дизайн, вам необходимо проверить его работу на прототипе в ПЛИС.
|
||||
|
||||
Файл [`nexys_cybercobra_demo.sv`](nexys_cybercobra_demo.sv), который нужно запускать с [`демонстрационным файлом инструкций`](demo.mem), является демонстрацией возможностей кобры, реализующий лишь декодирование выходных значений в формат для отображения на семисегментных индикаторах, а вся логика работы реализована инструкциями в текстовом файле.
|
||||
Инструкция по реализации прототипа описана [здесь](../../../Vivado%20Basics/How%20to%20program%20an%20fpga%20board.md).
|
||||
|
||||
Сначала выводится приветствие `≡ALOHA≡`, меняя положение восьми правых переключателей, последовательно нажимая на кнопку `BTND` (на рисунке выделена синим цветом), можно включать или выключать `один` из выбранных сегментов. Кнопка `CPU RESET` (на рисунке выделена красным цветом) возвращает все исходное состояние. Попробуйте погасить все слово, а потом снова его зажечь.
|
||||
На _рис. 1_ представлена схема прототипа в ПЛИС.
|
||||
|
||||
Файл [`nexys_cybercobra.sv`](nexys_cybercobra.sv), который нужно запускать с `вашим файлом инструкций`, так же реализует лишь декодирование выходных значений в формат для отображения на семисегментных индикаторах, но кнопка `BTND` задает тактирующий сигнал, следовательно, нажимая на нее, вы можете пошагово переходить по инструкциям, контролируя правильность работы устройства, для удобства можете в тестовом окружении выставить такое же входное значение, как переключатели sw[15:0] на плате.
|
||||

|
||||
|
||||

|
||||
_Рисунок 1. Структурная схема модуля `nexys_CYBERcobra`._
|
||||
|
||||
Прототип позволяет потактово исполнять программу, прошитую в память инструкций. Также прототип отображает операцию исполняемую в данный момент.
|
||||
|
||||
> [!NOTE]
|
||||
> Объект модуля `instr_mem` в модуле `CYBERcobra` **должен** называться `imem`. Т.е. строка создания сущности модуля должна выглядеть следующим образом: `instr_mem imem(...)`.
|
||||
|
||||
## Описание используемой периферии
|
||||
|
||||
- ### Переключатели.
|
||||
|
||||
Значение с переключателей `SW[15:0]` подаются напрямую на порт `sw_i` модуля дизайна.
|
||||
|
||||
- ### Кнопки
|
||||
|
||||
- `BTND` — при нажатии создает тактовый импульс, поступающий на порт тактирования `clk_i` модуля дизайна.
|
||||
- `CPU_RESET` — соединен со входом `rst_i` модуля дизайна. Поскольку в модуле `CYBERcobra` используется синхронный сброс (то есть сигнал сброса учитывается только во время восходящего фронта тактового сигнала), то для сброса модуля `CYBERcobra` и вложенных в него модулей необходимо при зажатой кнопке сброса еще нажать кнопку тактирования.
|
||||
|
||||
- ### Светодиоды
|
||||
|
||||
Светодиоды `LED[15:0]` отображают младшие 16 бит значения, выставленного в данный момент на порте `out_o` модуля дизайна.
|
||||
|
||||
- ### Семисегментные индикаторы
|
||||
|
||||
Семисегментные индикаторы разбиты на 3 блока (см. _рис. 1_):
|
||||
|
||||
- `out` — отображают младшие 8 бит значения, выставленного в данный момент на порте `out_o` модуля дизайна, в виде шестнадцатеричного числа.
|
||||
- `PC` — отображают в виде шестнадцатеричного числа младшие 8 бит программного счетчика, который подается на вход `addr_i` модуля памяти инструкций.
|
||||
- `operation` — отображают [операцию](#операции-отображаемые-прототипом), исполняемую процессором на текущем такте.
|
||||
|
||||
## Операции, отображаемые прототипом
|
||||
|
||||
Соответствие типа инструкции отображаемой операции:
|
||||
|
||||
1. Вычислительные — соответствует опкодам вычислительных операций АЛУ.
|
||||
1. Инструкция загрузки константы — `LI` (от **l**oad **i**mmediate).
|
||||
1. Инструкция загрузки из внешних устройств — `IN` (от **in**put).
|
||||
1. Безусловный переход — `JUMP`.
|
||||
1. Инструкций условного перехода — соответствует опкодам операций сравнения АЛУ.
|
||||
|
||||
Во время исполнения вычислительных инструкций и инструкций условного перехода могут встретиться нелегальные операции (отображается как `ILL`, от **ill**egal). Операция считается нелегальной в следующих случаях:
|
||||
|
||||
- Если в поле инструкции, отвечающем за операция АЛУ, указана битовая последовательность, не входящая в диапазон допустимых значений.
|
||||
- Если инструкция является вычислительной, но в поле инструкции, отвечающем за операция АЛУ, указана битовая последовательность, соответствующая операции, вычисляющей флаг. И обратный случай.
|
||||
|
||||
Инструкция `0 0 11 xxxxxxxxxxxxxxxxxxxxxxxxxxxx` отображается как `NOP` (от **n**o **op**eration).
|
||||
|
||||
Соответствие операции ее отображению на семисегментных индикаторах представлено на _рис. 2_:
|
||||
|
||||

|
||||
|
||||
_Рисунок 2. Соответствие операции ее отображению на семисегментных индикаторах._
|
||||
|
||||
|
||||
## Демонстрационная программа
|
||||
|
||||
В качестве демонстрационной программы, предлагается использовать [example.mem](../example.mem). Описание ее работы можно прочитать в разделе [#финальный обзор](../README.md#финальный-обзор).
|
||||
|
@@ -1,95 +0,0 @@
|
||||
00074221
|
||||
00000202
|
||||
10844001
|
||||
00119463
|
||||
10046001
|
||||
0006000c
|
||||
0001400d
|
||||
0000020e
|
||||
0000002f
|
||||
10b0400c
|
||||
10b4400d
|
||||
10b8400e
|
||||
10bc400f
|
||||
00100010
|
||||
00018011
|
||||
00001412
|
||||
00000073
|
||||
00000022
|
||||
00000043
|
||||
00000084
|
||||
00000105
|
||||
00000206
|
||||
00000407
|
||||
00000808
|
||||
00001009
|
||||
00001fea
|
||||
2004000b
|
||||
30040000
|
||||
30040000
|
||||
30040000
|
||||
30040000
|
||||
30040000
|
||||
30040000
|
||||
30040000
|
||||
30040000
|
||||
30040000
|
||||
7ea97ec0
|
||||
13ad400b
|
||||
7c2c4520
|
||||
7c2c6540
|
||||
7c2c8560
|
||||
7c2ca580
|
||||
7c2cc5a0
|
||||
7c2ce5c0
|
||||
7c2d05e0
|
||||
7c2d2600
|
||||
13866014
|
||||
7c500200
|
||||
13864014
|
||||
7c500200
|
||||
13862014
|
||||
7c500200
|
||||
13860014
|
||||
7c500200
|
||||
1385e014
|
||||
7c500200
|
||||
1385c014
|
||||
7c500200
|
||||
1385a014
|
||||
7c500200
|
||||
13858014
|
||||
7c500200
|
||||
bc040400
|
||||
13066001
|
||||
bc0403c0
|
||||
13064001
|
||||
bc040380
|
||||
13062001
|
||||
bc040340
|
||||
13060001
|
||||
bc040300
|
||||
1305e001
|
||||
bc0402c0
|
||||
1305c001
|
||||
bc040280
|
||||
1305a001
|
||||
bc040240
|
||||
13058001
|
||||
bc040200
|
||||
12066001
|
||||
bc0401c0
|
||||
12064001
|
||||
bc040180
|
||||
12062001
|
||||
bc040140
|
||||
12060001
|
||||
bc040100
|
||||
1205e001
|
||||
bc0400c0
|
||||
1205c001
|
||||
bc040080
|
||||
1205a001
|
||||
bc040040
|
||||
12058001
|
||||
bc041760
|
@@ -4,47 +4,47 @@
|
||||
## - 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
|
||||
## RGB LEDs
|
||||
#set_property -dict { PACKAGE_PIN R12 IOSTANDARD LVCMOS33 } [get_ports { LED16_B }]; #IO_L5P_T0_D06_14 Sch=led16_b
|
||||
#set_property -dict { PACKAGE_PIN M16 IOSTANDARD LVCMOS33 } [get_ports { LED16_G }]; #IO_L10P_T1_D14_14 Sch=led16_g
|
||||
#set_property -dict { PACKAGE_PIN N15 IOSTANDARD LVCMOS33 } [get_ports { LED16_R }]; #IO_L11P_T1_SRCC_14 Sch=led16_r
|
||||
@@ -53,30 +53,30 @@ set_property -dict { PACKAGE_PIN V10 IOSTANDARD LVCMOS33 } [get_ports { SW[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
|
||||
|
@@ -2,91 +2,443 @@
|
||||
* Project Name : Architectures of Processor Systems (APS) lab work
|
||||
* Organization : National Research University of Electronic Technology (MIET)
|
||||
* Department : Institute of Microdevices and Control Systems
|
||||
* Author(s) : Nikita Bulavin
|
||||
* Email(s) : nekkit6@edu.miet.ru
|
||||
* Author(s) : Alexander Kharlamov
|
||||
* Email(s) : sasha_xarlamov@org.miet.ru
|
||||
|
||||
See https://github.com/MPSU/APS/blob/master/LICENSE file for licensing details.
|
||||
* ------------------------------------------------------------------------------
|
||||
*/
|
||||
module nexys_CYBERcobra_dz(
|
||||
input CLK100,
|
||||
input resetn,
|
||||
input BTND,
|
||||
input [15:0] SW,
|
||||
output CA, CB, CC, CD, CE, CF, CG,
|
||||
output [7:0] AN
|
||||
typedef enum {
|
||||
INSTR_ALU , // branch and computational
|
||||
INSTR_LI , // const load
|
||||
INSTR_IN , // periphery load
|
||||
INSTR_JUMP ,
|
||||
INSTR_NOP // ws == 3
|
||||
} Instruction_type;
|
||||
|
||||
typedef enum {
|
||||
CH_0 = 0,
|
||||
CH_1,
|
||||
CH_2,
|
||||
CH_3,
|
||||
CH_4,
|
||||
CH_5,
|
||||
CH_6,
|
||||
CH_7,
|
||||
CH_8,
|
||||
CH_9,
|
||||
CH_A,
|
||||
CH_b,
|
||||
CH_c,
|
||||
CH_d,
|
||||
CH_E,
|
||||
CH_F,
|
||||
CH_G,
|
||||
CH_L,
|
||||
CH_n,
|
||||
CH_o,
|
||||
CH_r,
|
||||
CH_S,
|
||||
CH_t,
|
||||
CH_u,
|
||||
CH_X,
|
||||
CH_P,
|
||||
CH_J,
|
||||
CH_q,
|
||||
CH_i,
|
||||
CH_m,
|
||||
|
||||
CH_SPACE
|
||||
} Char;
|
||||
|
||||
typedef struct {
|
||||
logic ca;
|
||||
logic cb;
|
||||
logic cc;
|
||||
logic cd;
|
||||
logic ce;
|
||||
logic cf;
|
||||
logic cg;
|
||||
logic dp;
|
||||
} Semseg;
|
||||
|
||||
module nexys_CYBERcobra(
|
||||
input logic clk_i,
|
||||
input logic arstn_i,
|
||||
input logic [15:0] sw_i,
|
||||
input logic btnd_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 [31:0] cobra_out;
|
||||
|
||||
logic btnd_sync;
|
||||
sync sync (
|
||||
.clk_i ,
|
||||
.data_i (btnd_i ),
|
||||
.data_o (btnd_sync)
|
||||
);
|
||||
logic btnd_debounce;
|
||||
debounce debounce (
|
||||
.clk_i ,
|
||||
.arstn_i (1'b1 ),
|
||||
.data_i (btnd_sync ),
|
||||
.data_o (btnd_debounce)
|
||||
);
|
||||
logic bufg_clk;
|
||||
BUFG dut_bufg(
|
||||
.I (btnd_debounce),
|
||||
.O (bufg_clk )
|
||||
);
|
||||
|
||||
CYBERcobra dut(
|
||||
.clk_i(btn),
|
||||
.rst_i(!resetn),
|
||||
.sw_i(SW[15:0]),
|
||||
.out_o(out)
|
||||
CYBERcobra dut (
|
||||
.clk_i (bufg_clk ),
|
||||
.rst_i (!arstn_i ),
|
||||
.sw_i (sw_i ),
|
||||
.out_o (cobra_out )
|
||||
);
|
||||
|
||||
localparam pwm = 1000;
|
||||
reg [9:0] counter;
|
||||
reg [3:0] semseg;
|
||||
reg [7:0] ANreg;
|
||||
reg CAr, CBr, CCr, CDr, CEr, CFr, CGr;
|
||||
reg btn;
|
||||
wire [31:0] out;
|
||||
logic [31:0] instr_addr;
|
||||
logic [31:0] instr;
|
||||
assign instr_addr = dut.imem.addr_i;
|
||||
assign instr = dut.imem.read_data_o;
|
||||
|
||||
assign AN[7:0] = ANreg[7:0];
|
||||
assign {CA, CB, CC, CD, CE, CF, CG} = {CAr, CBr, CCr, CDr, CEr, CFr, CGr};
|
||||
import alu_opcodes_pkg::*;
|
||||
|
||||
Instruction_type instr_type;
|
||||
logic [ALU_OP_WIDTH-1:0] alu_op;
|
||||
logic illegal_instr;
|
||||
nexys_CYBERcobra_decoder nexys_CYBERcobra_decoder (
|
||||
.instr_i (instr ),
|
||||
.instr_type_o (instr_type ),
|
||||
.alu_op_o (alu_op ),
|
||||
.illegal_instr_o (illegal_instr)
|
||||
);
|
||||
|
||||
always @(posedge CLK100) begin
|
||||
if (!resetn) begin
|
||||
counter <= 'b0;
|
||||
ANreg[7:0] <= 8'b11111111;
|
||||
{CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b1111111;
|
||||
btn <= BTND;
|
||||
end
|
||||
else begin
|
||||
btn <= BTND;
|
||||
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] <= !(ANreg[6:0] == 7'b1111111);
|
||||
end
|
||||
case (1'b0)
|
||||
ANreg[0]: semseg <= out[3 : 0];
|
||||
ANreg[1]: semseg <= out[7 : 4];
|
||||
ANreg[2]: semseg <= out[11: 8];
|
||||
ANreg[3]: semseg <= out[15:12];
|
||||
ANreg[4]: semseg <= out[19:16];
|
||||
ANreg[5]: semseg <= out[23:20];
|
||||
ANreg[6]: semseg <= out[27:24];
|
||||
ANreg[7]: semseg <= out[31:28];
|
||||
Char op_chars[0:3];
|
||||
always_comb begin
|
||||
op_chars = '{4{CH_SPACE}};
|
||||
|
||||
case (instr_type)
|
||||
INSTR_ALU:
|
||||
case (alu_op)
|
||||
ALU_ADD : op_chars[0:2] = '{CH_A, CH_d, CH_d};
|
||||
ALU_SUB : op_chars[0:2] = '{CH_S, CH_u, CH_b};
|
||||
ALU_XOR : op_chars[0:2] = '{CH_X, CH_o, CH_r};
|
||||
ALU_OR : op_chars[0:1] = '{CH_o, CH_r};
|
||||
ALU_AND : op_chars[0:2] = '{CH_A, CH_n, CH_d};
|
||||
ALU_SRA : op_chars[0:2] = '{CH_S, CH_r, CH_A};
|
||||
ALU_SRL : op_chars[0:2] = '{CH_S, CH_r, CH_L};
|
||||
ALU_SLL : op_chars[0:2] = '{CH_S, CH_L, CH_L};
|
||||
ALU_LTS : op_chars[0:2] = '{CH_L, CH_t, CH_S};
|
||||
ALU_LTU : op_chars[0:2] = '{CH_L, CH_t, CH_u};
|
||||
ALU_GES : op_chars[0:2] = '{CH_G, CH_E, CH_S};
|
||||
ALU_GEU : op_chars[0:2] = '{CH_G, CH_E, CH_u};
|
||||
ALU_EQ : op_chars[0:1] = '{CH_E, CH_q};
|
||||
ALU_NE : op_chars[0:1] = '{CH_n, CH_E};
|
||||
ALU_SLTS: op_chars = '{CH_S, CH_L, CH_t, CH_S};
|
||||
ALU_SLTU: op_chars = '{CH_S, CH_L, CH_t, CH_u};
|
||||
|
||||
default : ;
|
||||
endcase
|
||||
case (semseg)
|
||||
4'h0: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b0000001;
|
||||
4'h1: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b1001111;
|
||||
4'h2: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b0010010;
|
||||
4'h3: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b0000110;
|
||||
4'h4: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b1001100;
|
||||
4'h5: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b0100100;
|
||||
4'h6: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b0100000;
|
||||
4'h7: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b0001111;
|
||||
4'h8: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b0000000;
|
||||
4'h9: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b0000100;
|
||||
4'hA: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b0001000;
|
||||
4'hB: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b1100000;
|
||||
4'hC: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b0110001;
|
||||
4'hD: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b1000010;
|
||||
4'hE: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b0110000;
|
||||
4'hF: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b0111000;
|
||||
default: {CAr,CBr,CCr,CDr, CEr, CFr, CGr} <= 7'b0111111;
|
||||
INSTR_LI : op_chars[0:1] = '{CH_L, CH_i};
|
||||
INSTR_JUMP: op_chars = '{CH_J, CH_u, CH_m, CH_P};
|
||||
INSTR_NOP : op_chars[0:2] = '{CH_n, CH_o, CH_P};
|
||||
INSTR_IN : op_chars[0:1] = '{CH_i, CH_n};
|
||||
endcase
|
||||
end
|
||||
|
||||
Char all_chars[0:7];
|
||||
assign all_chars[0:3] = {
|
||||
Char'(led_o[7:4]) ,
|
||||
Char'(led_o[3:0]) ,
|
||||
Char'(instr_addr[7:4]),
|
||||
Char'(instr_addr[3:0])
|
||||
};
|
||||
localparam Char ILL_INSTR_MSG[0:3] = '{CH_i, CH_L, CH_L, CH_SPACE};
|
||||
assign all_chars[4:7] = illegal_instr ? ILL_INSTR_MSG : op_chars;
|
||||
|
||||
Semseg all_semsegs[0:7];
|
||||
for (genvar semseg_num = 0; semseg_num < 8; ++semseg_num) begin : CHAR2SEMSEG_GEN
|
||||
char2semseg char2semseg (
|
||||
.char_i (all_chars [semseg_num]),
|
||||
.semseg_o (all_semsegs[semseg_num])
|
||||
);
|
||||
end
|
||||
|
||||
|
||||
Semseg all_semsegs_dotted[0:7];
|
||||
assign all_semsegs_dotted[0] = all_semsegs[0];
|
||||
assign all_semsegs_dotted[2:7] = all_semsegs[2:7];
|
||||
assign all_semsegs_dotted[1].ca = all_semsegs[1].ca;
|
||||
assign all_semsegs_dotted[1].cb = all_semsegs[1].cb;
|
||||
assign all_semsegs_dotted[1].cc = all_semsegs[1].cc;
|
||||
assign all_semsegs_dotted[1].cd = all_semsegs[1].cd;
|
||||
assign all_semsegs_dotted[1].ce = all_semsegs[1].ce;
|
||||
assign all_semsegs_dotted[1].cf = all_semsegs[1].cf;
|
||||
assign all_semsegs_dotted[1].cg = all_semsegs[1].cg;
|
||||
assign all_semsegs_dotted[1].dp = 1'b0;
|
||||
|
||||
Semseg current_semseg;
|
||||
logic [7:0] an;
|
||||
semseg_one2many semseg_one2many (
|
||||
.clk100m_i (clk_i ),
|
||||
.arstn_i (arstn_i ),
|
||||
.all_semsegs_i (all_semsegs_dotted),
|
||||
.current_semseg_o (current_semseg ),
|
||||
.an_o (an )
|
||||
);
|
||||
|
||||
assign ca_o = current_semseg.ca;
|
||||
assign cb_o = current_semseg.cb;
|
||||
assign cc_o = current_semseg.cc;
|
||||
assign cd_o = current_semseg.cd;
|
||||
assign ce_o = current_semseg.ce;
|
||||
assign cf_o = current_semseg.cf;
|
||||
assign cg_o = current_semseg.cg;
|
||||
assign dp_o = current_semseg.dp;
|
||||
|
||||
assign an_o = an;
|
||||
|
||||
assign led_o = cobra_out[15:0];
|
||||
|
||||
endmodule
|
||||
|
||||
module nexys_CYBERcobra_decoder
|
||||
import alu_opcodes_pkg::*;
|
||||
(
|
||||
input logic [31:0] instr_i,
|
||||
output Instruction_type instr_type_o,
|
||||
output logic [ALU_OP_WIDTH-1:0] alu_op_o,
|
||||
output logic illegal_instr_o
|
||||
);
|
||||
|
||||
logic j;
|
||||
logic b;
|
||||
logic [1:0] ws;
|
||||
|
||||
assign j = instr_i[31];
|
||||
assign b = instr_i[30];
|
||||
assign ws = instr_i[29:28];
|
||||
|
||||
logic is_branch_instr;
|
||||
assign is_branch_instr = b;
|
||||
|
||||
always_comb begin
|
||||
instr_type_o = INSTR_NOP;
|
||||
|
||||
if (j) begin
|
||||
instr_type_o = INSTR_JUMP;
|
||||
end else if (b) begin
|
||||
instr_type_o = INSTR_ALU;
|
||||
end else begin
|
||||
case (ws)
|
||||
2'd0: instr_type_o = INSTR_LI;
|
||||
2'd1: instr_type_o = INSTR_ALU;
|
||||
2'd2: instr_type_o = INSTR_IN;
|
||||
2'd3: instr_type_o = INSTR_NOP;
|
||||
endcase
|
||||
end
|
||||
end
|
||||
|
||||
assign alu_op_o = instr_i[27:23];
|
||||
|
||||
import alu_opcodes_pkg::*;
|
||||
|
||||
typedef enum {
|
||||
ALU_OP_BRANCH,
|
||||
ALU_OP_COMPUTATIONAL,
|
||||
ALU_OP_ILLEGAL
|
||||
} Alu_op_type;
|
||||
Alu_op_type alu_op_type;
|
||||
always_comb begin
|
||||
alu_op_type = ALU_OP_ILLEGAL;
|
||||
|
||||
case (alu_op_o) inside
|
||||
ALU_LTS,
|
||||
ALU_LTU,
|
||||
ALU_GES,
|
||||
ALU_GEU,
|
||||
ALU_EQ ,
|
||||
ALU_NE : alu_op_type = ALU_OP_BRANCH;
|
||||
|
||||
ALU_ADD ,
|
||||
ALU_SUB ,
|
||||
ALU_XOR ,
|
||||
ALU_OR ,
|
||||
ALU_AND ,
|
||||
ALU_SRA ,
|
||||
ALU_SRL ,
|
||||
ALU_SLL ,
|
||||
ALU_SLTS,
|
||||
ALU_SLTU: alu_op_type = ALU_OP_COMPUTATIONAL;
|
||||
|
||||
default : alu_op_type = ALU_OP_ILLEGAL;
|
||||
endcase
|
||||
end
|
||||
|
||||
assign illegal_instr_o = (instr_type_o == INSTR_ALU) && ((alu_op_type == ALU_OP_ILLEGAL) ||
|
||||
((alu_op_type == ALU_OP_BRANCH) ^ is_branch_instr));
|
||||
endmodule
|
||||
|
||||
module char2semseg #(
|
||||
parameter bit HEX_ONLY = 1'b0
|
||||
) (
|
||||
input Char char_i,
|
||||
output Semseg semseg_o
|
||||
);
|
||||
|
||||
localparam bit [6:0] BLANK = '1;
|
||||
|
||||
logic [6:0] semseg;
|
||||
always_comb begin
|
||||
case (char_i)
|
||||
CH_0 : semseg = ~7'h3F;
|
||||
CH_1 : semseg = ~7'h06;
|
||||
CH_2 : semseg = ~7'h5B;
|
||||
CH_3 : semseg = ~7'h4F;
|
||||
CH_4 : semseg = ~7'h66;
|
||||
CH_5 : semseg = ~7'h6D;
|
||||
CH_6 : semseg = ~7'h7D;
|
||||
CH_7 : semseg = ~7'h07;
|
||||
CH_8 : semseg = ~7'h7F;
|
||||
CH_9 : semseg = ~7'h6F;
|
||||
CH_A : semseg = ~7'h5F;
|
||||
CH_b : semseg = ~7'h7C;
|
||||
CH_c : semseg = ~7'h58;
|
||||
CH_d : semseg = ~7'h5E;
|
||||
CH_E : semseg = ~7'h79;
|
||||
CH_F : semseg = ~7'h71;
|
||||
CH_G : semseg = ~7'h3D;
|
||||
CH_L : semseg = ~7'h38;
|
||||
CH_n : semseg = ~7'h54;
|
||||
CH_o : semseg = ~7'h5C;
|
||||
CH_r : semseg = ~7'h50;
|
||||
CH_S : semseg = ~7'h64;
|
||||
CH_t : semseg = ~7'h78;
|
||||
CH_u : semseg = ~7'h1C;
|
||||
CH_X : semseg = ~7'h76;
|
||||
CH_P : semseg = ~7'h73;
|
||||
CH_J : semseg = ~7'h1E;
|
||||
CH_q : semseg = ~7'h67;
|
||||
CH_i : semseg = ~7'h30;
|
||||
CH_m : semseg = ~7'h77;
|
||||
default : semseg = BLANK;
|
||||
endcase
|
||||
end
|
||||
|
||||
assign semseg_o.ca = semseg[0];
|
||||
assign semseg_o.cb = semseg[1];
|
||||
assign semseg_o.cc = semseg[2];
|
||||
assign semseg_o.cd = semseg[3];
|
||||
assign semseg_o.ce = semseg[4];
|
||||
assign semseg_o.cf = semseg[5];
|
||||
assign semseg_o.cg = semseg[6];
|
||||
assign semseg_o.dp = 1'b1;
|
||||
|
||||
endmodule
|
||||
|
||||
module semseg_one2many #(
|
||||
parameter int unsigned SEMSEGS_NUM = 8
|
||||
) (
|
||||
input Semseg all_semsegs_i[0:SEMSEGS_NUM-1],
|
||||
input logic clk100m_i,
|
||||
input logic arstn_i,
|
||||
output Semseg current_semseg_o,
|
||||
output logic [7:0] an_o
|
||||
);
|
||||
logic clk_i;
|
||||
assign clk_i = clk100m_i;
|
||||
|
||||
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
|
||||
|
||||
Semseg current_semseg;
|
||||
always_comb begin
|
||||
unique case (1'b0)
|
||||
an_ff[0]: current_semseg = all_semsegs_i[7];
|
||||
an_ff[1]: current_semseg = all_semsegs_i[6];
|
||||
an_ff[2]: current_semseg = all_semsegs_i[5];
|
||||
an_ff[3]: current_semseg = all_semsegs_i[4];
|
||||
an_ff[4]: current_semseg = all_semsegs_i[3];
|
||||
an_ff[5]: current_semseg = all_semsegs_i[2];
|
||||
an_ff[6]: current_semseg = all_semsegs_i[1];
|
||||
an_ff[7]: current_semseg = all_semsegs_i[0];
|
||||
endcase
|
||||
end
|
||||
|
||||
assign current_semseg_o = current_semseg;
|
||||
|
||||
assign an_o = an_ff;
|
||||
|
||||
endmodule
|
||||
|
||||
module debounce #(
|
||||
parameter int unsigned MAX_COUNT = 10000
|
||||
) (
|
||||
input logic clk_i,
|
||||
input logic arstn_i,
|
||||
input logic data_i,
|
||||
output logic data_o
|
||||
);
|
||||
|
||||
localparam int COUNTER_WIDTH = $clog2(MAX_COUNT);
|
||||
logic [COUNTER_WIDTH-1:0] counter_next;
|
||||
logic [COUNTER_WIDTH-1:0] counter_ff;
|
||||
assign counter_next = (data_o != data_i) ? counter_ff - COUNTER_WIDTH'('b1) :
|
||||
COUNTER_WIDTH'(MAX_COUNT);
|
||||
always_ff @(posedge clk_i or negedge arstn_i) begin
|
||||
if (!arstn_i) counter_ff <= COUNTER_WIDTH'(MAX_COUNT);
|
||||
else counter_ff <= counter_next;
|
||||
end
|
||||
|
||||
always_ff @(posedge clk_i or negedge arstn_i) begin
|
||||
if (!arstn_i) data_o <= '0;
|
||||
else if (~|counter_ff) data_o <= data_i;
|
||||
end
|
||||
|
||||
endmodule
|
||||
|
||||
module sync #(
|
||||
parameter int unsigned SYNC_STAGES = 3
|
||||
) (
|
||||
input logic clk_i,
|
||||
input logic data_i,
|
||||
output logic data_o
|
||||
);
|
||||
|
||||
logic [SYNC_STAGES-1:0] sync_buffer_ff;
|
||||
logic [SYNC_STAGES-1:0] sync_buffer_next;
|
||||
assign sync_buffer_next = {sync_buffer_ff[$left(sync_buffer_ff)-1:0], data_i};
|
||||
always_ff @(posedge clk_i) begin
|
||||
sync_buffer_ff <= sync_buffer_next;
|
||||
end
|
||||
|
||||
assign data_o = sync_buffer_ff[$left(sync_buffer_ff)];
|
||||
|
||||
endmodule
|
||||
|
@@ -1,85 +0,0 @@
|
||||
/* -----------------------------------------------------------------------------
|
||||
* Project Name : Architectures of Processor Systems (APS) lab work
|
||||
* Organization : National Research University of Electronic Technology (MIET)
|
||||
* Department : Institute of Microdevices and Control Systems
|
||||
* Author(s) : Nikita Bulavin
|
||||
* Email(s) : nekkit6@edu.miet.ru
|
||||
|
||||
See https://github.com/MPSU/APS/blob/master/LICENSE file for licensing details.
|
||||
* ------------------------------------------------------------------------------
|
||||
*/
|
||||
module nexys_CYBERcobra(
|
||||
input CLK100,
|
||||
input resetn,
|
||||
input BTND,
|
||||
input [15:0] SW,
|
||||
output CA, CB, CC, CD, CE, CF, CG,
|
||||
output [7:0] AN
|
||||
);
|
||||
|
||||
CYBERcobra dut(
|
||||
.clk_i(CLK100),
|
||||
.rst_i(!resetn),
|
||||
.sw_i({7'b0,splash,SW[7:0]}),
|
||||
.out_o(out)
|
||||
);
|
||||
|
||||
localparam pwm = 1000;
|
||||
reg [9:0] counter;
|
||||
reg [3:0] semseg;
|
||||
reg [7:0] ANreg;
|
||||
reg CAr, CBr, CCr, CDr, CEr, CFr, CGr;
|
||||
reg [3:0] btn;
|
||||
reg [10:0] btn_reg;
|
||||
wire splash;
|
||||
wire [31:0] out;
|
||||
|
||||
assign AN[7:0] = ANreg[7:0];
|
||||
assign {CA, CB, CC, CD, CE, CF, CG} = {CAr, CBr, CCr, CDr, CEr, CFr, CGr};
|
||||
assign splash = ((btn == 4'b1111) ^ btn_reg[10]) && (btn == 4'b1111);
|
||||
|
||||
always @(posedge CLK100) begin
|
||||
if (!resetn) begin
|
||||
counter <= 'b0;
|
||||
ANreg[7:0] <= 8'b11111111;
|
||||
{CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b1111111;
|
||||
btn <= 4'b0;
|
||||
btn_reg <= 0;
|
||||
end
|
||||
else begin
|
||||
btn <= (btn << 1'b1) + BTND;
|
||||
btn_reg <= (btn_reg << 1'b1) + (btn == 4'b1111);
|
||||
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] <= !(ANreg[6:0] == 7'b1111111);
|
||||
end
|
||||
case (1'b0)
|
||||
ANreg[0]: semseg <= out[3 : 0];
|
||||
ANreg[1]: semseg <= out[7 : 4];
|
||||
ANreg[2]: semseg <= out[11: 8];
|
||||
ANreg[3]: semseg <= out[15:12];
|
||||
ANreg[4]: semseg <= out[19:16];
|
||||
ANreg[5]: semseg <= out[23:20];
|
||||
ANreg[6]: semseg <= out[27:24];
|
||||
ANreg[7]: semseg <= out[31:28];
|
||||
endcase
|
||||
case (semseg)
|
||||
4'h1: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b1110001; //L
|
||||
4'h3: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b0110110; //?
|
||||
4'h8: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b0000001; //O
|
||||
4'hA: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b0001000; //A
|
||||
4'hC: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b1001000; //H
|
||||
default: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b1111111; //
|
||||
endcase
|
||||
end
|
||||
end
|
||||
|
||||
endmodule
|
@@ -59,7 +59,7 @@ SYSTEM-инструкции используются для доступа к с
|
||||
|
||||
Для будущей поддержки прерываний, нам потребуется декодировать инструкции обоих классов.
|
||||
|
||||
Обращение к регистрам статуса и контроля осуществляется шестью инструкциями стандартного расширения `Zicsr`. Каждая из этих инструкций (если у нее легальные поля) осуществляет запись в CS-регистры и регистровый файл.
|
||||
Обращение к регистрам статуса и контроля осуществляется шестью инструкциями стандартного расширения `Zicsr`. Каждая из этих инструкций (если у нее легальные поля) осуществляет запись в CS-регистры и регистровый файл (блоки `Control Status Registers` и `Register File` на _рис. 1_ соответственно).
|
||||
|
||||
Кроме того, для возврата управления основному потоку инструкций, нужна дополнительная `SYSTEM`-инструкция привилегированного набора команд `MRET`.
|
||||
|
||||
@@ -77,7 +77,9 @@ SYSTEM-инструкции используются для доступа к с
|
||||
|
||||
_Таблица 3. Инструкции набора RV32I с приведением их типов, функционального описания и примеров использования._
|
||||
|
||||
Обратите внимание на операции `slli`, `srli` и `srai` (операции сдвига на константную величину). У этих инструкций немного измененный формат кодирования **I\***. Формат кодирования **I** предоставляет 12-битную константу. Сдвиг 32-битного числа более, чем на 31 не имеет смысла. Для кодирования числа 31 требуется всего 5 бит. Выходит, что из 12 бит константы используется только 5 бит для операции сдвига, а оставшиеся 7 бит – не используются. А, главное (какое совпадение!), эти 7 бит находятся ровно в том же месте, где у других инструкций находится поле `func7`. Поэтому, чтобы у инструкций `slli`, `srli` и `srai` использующих формат **I** не пропадала эта часть поля, к ней относятся как к полю `func7`.
|
||||
Обратите внимание на операции `slli`, `srli` и `srai` (операции сдвига на константную величину). У этих инструкций немного измененный формат кодирования **I\***. Формат кодирования **I** предоставляет 12-битную константу. Сдвиг 32-битного числа более, чем на 31 не имеет смысла. Для кодирования числа 31 требуется всего 5 бит. Выходит, что из 12 бит константы используется только 5 бит для операции сдвига (в виде поля `shamt`, сокращение от **sh**ift **am**oun**t** — "сколько раз сдвигать"), а оставшиеся 7 бит – не используются. А, главное (какое совпадение!), эти 7 бит находятся ровно в том же месте, где у других инструкций находится поле `func7`. Поэтому, чтобы у инструкций `slli`, `srli` и `srai` использующих формат **I** не пропадала эта часть поля, к ней относятся как к полю `func7`.
|
||||
|
||||
Также обратите внимание на инструкции `ecall`, `ebreak` и `mret`. Все эти инструкции I-типа имеют поле func3, равное нулю. С точки зрения декодирования инструкции I-типа, это одна и та же инструкция с разными полями. Однако конкретно в данном случае (SYSTEM_OPCODE и `func3 == 0`) эти инструкции должны рассматриваться как совокупность всех 32-бит сразу (см. _Таблицу 1_).
|
||||
|
||||
### Предлагаемая микроархитектура процессора RISC-V
|
||||
|
||||
@@ -146,24 +148,24 @@ _Таблица 4. Значения сигнала `mem_size_o` при пере
|
||||
|
||||
Управляющие сигналы на выходе декодера зависят от трех полей инструкции: `opcode`, `func3` и `func7`. Обратите внимание, что расположение этих полей одинаково для всех типов инструкций. Это сделано для удобства декодирования. При этом для некоторых инструкций поля `func3` и `func7` могут отсутствовать.
|
||||
|
||||
|Название сигнала| Пояснение |
|
||||
|----------------|------------------------------------------------------------------------------------------------|
|
||||
|fetched_instr_i |Инструкция для декодирования, считанная из памяти инструкций |
|
||||
|a_sel_o |Управляющий сигнал мультиплексора для выбора первого операнда АЛУ |
|
||||
|b_sel_o |Управляющий сигнал мультиплексора для выбора второго операнда АЛУ |
|
||||
|alu_op_o |Операция АЛУ |
|
||||
|csr_op_o |Операция модуля CSR |
|
||||
|csr_we_o |Разрешение на запись в CSR |
|
||||
|mem_req_o |Запрос на доступ к памяти (часть интерфейса памяти) |
|
||||
|mem_we_o |Сигнал разрешения записи в память, «write enable» (при равенстве нулю происходит чтение) |
|
||||
|mem_size_o |Управляющий сигнал для выбора размера слова при чтении-записи в память (часть интерфейса памяти)|
|
||||
|gpr_we_o |Сигнал разрешения записи в регистровый файл |
|
||||
|wb_sel_o |Управляющий сигнал мультиплексора для выбора данных, записываемых в регистровый файл |
|
||||
|illegal_instr_o |Сигнал о некорректной инструкции (на схеме не отмечен) |
|
||||
|branch_o |Сигнал об инструкции условного перехода |
|
||||
|jal_o |Сигнал об инструкции безусловного перехода jal |
|
||||
|jalr_o |Сигнал об инструкции безусловного перехода jalr |
|
||||
|mret_o |Сигнал об инструкции возврата из прерывания/исключения mret |
|
||||
|Название сигнала| Пояснение | На каких опкодах может принять ненулевое значение (см. таблицу 6)|
|
||||
|----------------|------------------------------------------------------------------------------------------------|--------------------------------------------------|
|
||||
|fetched_instr_i |Инструкция для декодирования, считанная из памяти инструкций | — |
|
||||
|a_sel_o |Управляющий сигнал мультиплексора для выбора первого операнда АЛУ | На всех кроме `MISC_MEM` и `SYSTEM` |
|
||||
|b_sel_o |Управляющий сигнал мультиплексора для выбора второго операнда АЛУ | На всех кроме `MISC_MEM` и `SYSTEM` |
|
||||
|alu_op_o |Операция АЛУ | На всех кроме `MISC_MEM` и `SYSTEM` |
|
||||
|csr_op_o |Операция модуля CSR | Только на `SYSTEM` |
|
||||
|csr_we_o |Разрешение на запись в CSR | Только на `SYSTEM` |
|
||||
|mem_req_o |Запрос на доступ к памяти (часть интерфейса памяти) | На `LOAD` и `STORE` |
|
||||
|mem_we_o |Сигнал разрешения записи в память, «write enable» (при равенстве нулю происходит чтение) | Только на `STORE` |
|
||||
|mem_size_o |Управляющий сигнал для выбора размера слова при чтении-записи в память (часть интерфейса памяти)| На `LOAD` и `STORE` |
|
||||
|gpr_we_o |Сигнал разрешения записи в регистровый файл | На всех кроме `MISC_MEM` |
|
||||
|wb_sel_o |Управляющий сигнал мультиплексора для выбора данных, записываемых в регистровый файл | На всех кроме `MISC_MEM` |
|
||||
|illegal_instr_o |Сигнал о некорректной инструкции (на схеме не отмечен) | На всех кроме `JAL`, `LUI`, `AUIPC` |
|
||||
|branch_o |Сигнал об инструкции условного перехода | Только на `BRANCH` |
|
||||
|jal_o |Сигнал об инструкции безусловного перехода jal | Только на `JAL` |
|
||||
|jalr_o |Сигнал об инструкции безусловного перехода jalr | Только на `JALR` |
|
||||
|mret_o |Сигнал об инструкции возврата из прерывания/исключения mret | Только на `SYSTEM` |
|
||||
|
||||
_Таблица 5. Описание портов основного дешифратора._
|
||||
|
||||
@@ -192,6 +194,8 @@ _Таблица 5. Описание портов основного дешифр
|
||||
|MISC-MEM|00011 |Не производить операцию | `-` |
|
||||
|SYSTEM |11100 |Записать в `rd` значение `csr`. Обновить значение `csr` с помощью `rs1`. (либо `mret`/`ecall`/`ebreak`)|`csr = csr_op(rs1); rd = csr` |
|
||||
|
||||
_Таблица 6. Описание кодов операций_
|
||||
|
||||
## Инструменты
|
||||
|
||||
В первую очередь язык описания аппаратуры **SystemVerilog** – это язык. С помощью этого языка человек объясняет либо синтезатору какое он хочет получить устройство, либо симулятору – как он хочет это устройство проверить. Синтезатор – это программа, которая создает из логических элементов цифровое устройство по описанию, предоставляемому человеком. Синтезатору внутри **Vivado** нужно объяснить, что ты от него хочешь. Например, чтобы спросить дорогу у испанца, придется делать это на испанском языке, иначе он ничем не сможет помочь. Если ты знаешь испанский, то это можно сделать еще и разными способами. В **SystemVerilog** точно также – одно и то же устройство можно описать разным кодом, но результат синтеза будет одним и тем же. Однако, часто два разных кода одинаковые по смыслу могут синтезироваться в разную аппаратуру, хотя функционально они будут идентичны, но могут отличаться, например, скоростью работы. Или одни и те же специальные языковые конструкции могут применяться для синтезирования разных цифровых элементов.
|
||||
@@ -258,7 +262,7 @@ module decoder_riscv (
|
||||
output logic mem_we_o,
|
||||
output logic [2:0] mem_size_o,
|
||||
output logic gpr_we_o,
|
||||
output logic [1:0] wb_sel_o, //write back selector
|
||||
output logic [1:0] wb_sel_o,
|
||||
output logic illegal_instr_o,
|
||||
output logic branch_o,
|
||||
output logic jal_o,
|
||||
|
@@ -139,33 +139,33 @@ _Рисунок 2. Микроархитектура процессора._
|
||||
Теперь в соответствии с кодировкой инструкций переведем программу в машинные коды:
|
||||
|
||||
```text
|
||||
00: 011101011100 00000 000 00001 0010011
|
||||
04: 100010100111 00000 000 00010 0010011
|
||||
08: 0000000 00010 00001 000 00011 0110011
|
||||
0C: 0000000 00010 00001 111 00100 0110011
|
||||
10: 0100000 00011 00100 000 00101 0110011
|
||||
14: 0000001 00100 00011 000 00110 0110011
|
||||
18: 00000101000000000000 01111 1101111
|
||||
1C: 000000000000 00110 000 01111 1100111
|
||||
20: 0000000 11111 00101 001 00111 0010011
|
||||
24: 0100000 00001 00111 101 01000 0010011
|
||||
28: 0000000 11101 01000 101 01001 0010011
|
||||
2C: 11011110101011011100 01010 0110111
|
||||
30: 111010101111 01010 000 01010 0010011
|
||||
34: 0000000 01010 00100 010 00000 0100011
|
||||
38: 0000000 01010 00100 001 00110 0100011
|
||||
3C: 0000000 01010 00100 000 01011 0100011
|
||||
40: 000000000000 00100 010 01011 0000011
|
||||
44: 000000000000 00100 001 01100 0000011
|
||||
48: 000000000000 00100 000 01101 0000011
|
||||
4C: 000000000000 00100 101 01110 0000011
|
||||
50: 000000000000 00100 100 11101 0000011
|
||||
54: 00000000000000000100 10000 0010111
|
||||
58: 0000000 00011 00100 001 01000 1100011
|
||||
5C: 00000000 00000000 00000000 00000000
|
||||
60: 00000000010000000000 10001 1101111
|
||||
64: 000000000000 10001 000 01110 1100111
|
||||
68: 000000000100 01111 000 10010 1100111
|
||||
00: 011101011100 00000 000 00001 0010011 (0x75C00093)
|
||||
04: 100010100111 00000 000 00010 0010011 (0x8A700113)
|
||||
08: 0000000 00010 00001 000 00011 0110011 (0x002081B3)
|
||||
0C: 0000000 00010 00001 111 00100 0110011 (0x0020F233)
|
||||
10: 0100000 00011 00100 000 00101 0110011 (0x403202B3)
|
||||
14: 0000001 00100 00011 000 00110 0110011 (0x02418333)
|
||||
18: 00000101000000000000 01111 1101111 (0x050007EF)
|
||||
1C: 000000000000 00110 000 01111 1100111 (0x000307E7)
|
||||
20: 0000000 11111 00101 001 00111 0010011 (0x01F29393)
|
||||
24: 0100000 00001 00111 101 01000 0010011 (0x4013D413)
|
||||
28: 0000000 11101 01000 101 01001 0010011 (0x01D45493)
|
||||
2C: 11111010110111101100 01010 0110111 (0xFADEC537)
|
||||
30: 101010111110 01010 000 01010 0010011 (0xABE50513)
|
||||
34: 0000000 01010 00100 010 00000 0100011 (0x00A22023)
|
||||
38: 0000000 01010 00100 001 00110 0100011 (0x00A21323)
|
||||
3C: 0000000 01010 00100 000 01011 0100011 (0x00A205A3)
|
||||
40: 000000000000 00100 010 01011 0000011 (0x00022583)
|
||||
44: 000000000000 00100 001 01100 0000011 (0x00021603)
|
||||
48: 000000000000 00100 000 01101 0000011 (0x00020683)
|
||||
4C: 000000000000 00100 101 01110 0000011 (0x00025703)
|
||||
50: 000000000000 00100 100 01111 0000011 (0x00024783)
|
||||
54: 00000000000000000100 10000 0010111 (0x00004817)
|
||||
58: 0000000 00011 00100 001 01000 1100011 (0x00321463)
|
||||
5C: 00000000 00000000 00000000 00000000 (0x00000000)
|
||||
60: 00000000010000000000 10001 1101111 (0x004008EF)
|
||||
64: 000000000000 10001 000 01110 1100111 (0x00088767)
|
||||
68: 000000000100 01111 000 10010 1100111 (0x00478967)
|
||||
```
|
||||
|
||||
Данная программа, представленная в шестнадцатеричном формате находится в файле [program.mem](program.mem).
|
||||
|
@@ -1,5 +1,46 @@
|
||||
# Проверка работы riscv_unit на ПЛИС
|
||||
|
||||
Если вы не понимаете, что лежит в этой папке, или если надо вспомнить, как прошить ПЛИС, можно воспользоваться [`этой инструкцией`](../../../Vivado%20Basics/Program%20nexys%20a7.md)
|
||||
После того, как вы проверили на моделировании дизайн, вам необходимо проверить его работу на прототипе в ПЛИС.
|
||||
|
||||
Файл [`nexys_riscv_unit.sv`](nexys_riscv_unit.sv), который нужно запускать с [`демонстрационным файлом инструкций`](../program.mem), является демонстрацией работы вашего ядра, каждое нажатие на BTND формирует тактовый импульс, впоследствии пошагово переходя по инструкциям, которые в свою очередь отображаются на семисегментных индикаторах.
|
||||
Инструкция по реализации прототипа описана [здесь](../../../Vivado%20Basics/How%20to%20program%20an%20fpga%20board.md).
|
||||
|
||||
На _рис. 1_ представлена схема прототипа в ПЛИС.
|
||||
|
||||

|
||||
|
||||
_Рисунок 1. Структурная схема модуля `nexys_riscv_unit`._
|
||||
|
||||
Прототип позволяет потактово исполнять программу, прошитую в память инструкций. Также прототип отображает операцию исполняемую в данный момент.
|
||||
|
||||
> [!NOTE]
|
||||
> Объект модуля `riscv_core` в модуле `riscv_unit` **должен** называться `core`. Т.е. строка создания сущности модуля должна выглядеть следующим образом: `riscv_core core(...)`.
|
||||
|
||||
## Описание используемой периферии
|
||||
|
||||
- ### Кнопки
|
||||
|
||||
- `BTND` — при нажатии создает тактовый импульс, поступающий на порт тактирования `clk_i` модуля дизайна. Стоит помнить то, что инструкции, работающие с внешней памятью, требуют несколько тактов для своего выполнения.
|
||||
- `CPU_RESET` — соединен со входом `rst_i` модуля дизайна. Поскольку в модуле `riscv_unit` используется синхронный сброс (то есть сигнал сброса учитывается только во время восходящего фронта тактового сигнала), то для сброса модуля `riscv_unit` и вложенных в него модулей необходимо при зажатой кнопке сброса еще нажать кнопку тактирования.
|
||||
|
||||
- ### Семисегментные индикаторы
|
||||
|
||||
Семисегментные индикаторы разбиты на 2 блока (см. _рис. 1_):
|
||||
|
||||
- `PC` — отображают в виде шестнадцатеричного числа младшие 16 бит программного счетчика, которые вычисляются на основе выхода `instr_addr_o` модуля процессорного ядра.
|
||||
- `operation` — отображают [операцию](#операции-отображаемые-прототипом), исполняемую процессором на текущем такте.
|
||||
|
||||
## Операции, отображаемые прототипом
|
||||
|
||||
Прототип определяет тип операции по младшим 7 битам инструкции.
|
||||
|
||||
Если тип операции является легальным в рамках процессорного устройства, реализуемого на лабораторных работах, то отображается соответствующий опкод. Опкоды описаны в [riscv_pkg.sv](../../05.%20Main%20decoder/riscv_pkg.sv). Если определенный прототипом тип операции является нелегальным, то на семисегментных индикаторах отображается `ILL` (от **ill**egal).
|
||||
|
||||
Соответствие операции ее отображению на семисегментных индикаторах представлено на _рис. 2_:
|
||||
|
||||

|
||||
|
||||
_Рисунок 2. Соответствие операции ее отображению на семисегментных индикаторах._
|
||||
|
||||
## Демонстрационная программа
|
||||
|
||||
В качестве демонстрационной программы, предлагается использовать [program.mem](../program.mem). Описание ее работы можно прочитать в разделе [#задание](../README.md#задание).
|
||||
|
@@ -4,8 +4,8 @@
|
||||
## - 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
|
||||
@@ -53,30 +53,30 @@ create_clock -add -name sys_clk_pin -period 10.00 -waveform {0 5} [get_ports {CL
|
||||
#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 P18 IOSTANDARD LVCMOS33 } [get_ports { btnd_i }]; #IO_L9N_T1_DQS_D13_14 Sch=btnd
|
||||
|
||||
|
||||
##Pmod Headers
|
||||
|
@@ -2,155 +2,333 @@
|
||||
* Project Name : Architectures of Processor Systems (APS) lab work
|
||||
* Organization : National Research University of Electronic Technology (MIET)
|
||||
* Department : Institute of Microdevices and Control Systems
|
||||
* Author(s) : Nikita Bulavin
|
||||
* Email(s) : nekkit6@edu.miet.ru
|
||||
* Author(s) : Alexander Kharlamov
|
||||
* Email(s) : sasha_xarlamov@org.miet.ru
|
||||
|
||||
See https://github.com/MPSU/APS/blob/master/LICENSE file for licensing details.
|
||||
* ------------------------------------------------------------------------------
|
||||
*/
|
||||
typedef enum {
|
||||
INSTR_ALU , // branch and computational
|
||||
INSTR_LI , // const load
|
||||
INSTR_IN , // periphery load
|
||||
INSTR_JUMP ,
|
||||
INSTR_NOP // ws == 3
|
||||
} Instruction_type;
|
||||
|
||||
typedef enum {
|
||||
CH_0 = 0,
|
||||
CH_1,
|
||||
CH_2,
|
||||
CH_3,
|
||||
CH_4,
|
||||
CH_5,
|
||||
CH_6,
|
||||
CH_7,
|
||||
CH_8,
|
||||
CH_9,
|
||||
CH_A,
|
||||
CH_b,
|
||||
CH_c,
|
||||
CH_d,
|
||||
CH_E,
|
||||
CH_F,
|
||||
CH_G,
|
||||
CH_L,
|
||||
CH_n,
|
||||
CH_o,
|
||||
CH_r,
|
||||
CH_S,
|
||||
CH_t,
|
||||
CH_u,
|
||||
CH_X,
|
||||
CH_P,
|
||||
CH_J,
|
||||
CH_q,
|
||||
CH_i,
|
||||
CH_m,
|
||||
CH_y,
|
||||
CH_h,
|
||||
|
||||
CH_SPACE
|
||||
} Char;
|
||||
|
||||
typedef struct {
|
||||
logic ca;
|
||||
logic cb;
|
||||
logic cc;
|
||||
logic cd;
|
||||
logic ce;
|
||||
logic cf;
|
||||
logic cg;
|
||||
logic dp;
|
||||
} Semseg;
|
||||
|
||||
module nexys_riscv_unit(
|
||||
input CLK100,
|
||||
input resetn,
|
||||
input BTND,
|
||||
output CA, CB, CC, CD, CE, CF, CG,
|
||||
output [7:0] AN
|
||||
input logic clk_i,
|
||||
input logic arstn_i,
|
||||
input logic btnd_i,
|
||||
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 btnd_sync;
|
||||
sync sync (
|
||||
.clk_i ,
|
||||
.data_i (btnd_i ),
|
||||
.data_o (btnd_sync)
|
||||
);
|
||||
logic btnd_debounce;
|
||||
debounce debounce (
|
||||
.clk_i ,
|
||||
.arstn_i (1'b1 ),
|
||||
.data_i (btnd_sync ),
|
||||
.data_o (btnd_debounce)
|
||||
);
|
||||
logic bufg_clk;
|
||||
BUFG dut_bufg(
|
||||
.I (btnd_debounce),
|
||||
.O (bufg_clk )
|
||||
);
|
||||
|
||||
riscv_unit unit(
|
||||
.clk_i(btn),
|
||||
.rst_i(!resetn)
|
||||
.clk_i (bufg_clk),
|
||||
.rst_i (!arstn_i)
|
||||
);
|
||||
|
||||
wire [31:0] instr_addr;
|
||||
wire [31:0] instr;
|
||||
reg btn;
|
||||
|
||||
logic [31:0] instr_addr;
|
||||
logic [31:0] instr;
|
||||
assign instr_addr = unit.core.instr_addr_o;
|
||||
assign instr = unit.core.instr_i;
|
||||
|
||||
localparam pwm = 1000;
|
||||
reg [9:0] counter;
|
||||
reg [7:0] semseg;
|
||||
reg [7:0] ANreg;
|
||||
reg CAr, CBr, CCr, CDr, CEr, CFr, CGr;
|
||||
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 illegal_instr;
|
||||
|
||||
logic [6:0] opcode;
|
||||
assign opcode = instr[6:0];
|
||||
|
||||
always @(posedge CLK100) begin
|
||||
if (!resetn) begin
|
||||
counter <= 'b0;
|
||||
ANreg[7:0] <= 8'b11111111;
|
||||
{CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b1111111;
|
||||
btn <= BTND;
|
||||
end
|
||||
else begin
|
||||
btn <= BTND;
|
||||
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] <= !(ANreg[6:0] == 7'b1111111);
|
||||
end
|
||||
if(|(~ANreg[5:4])) begin
|
||||
case (1'b0)
|
||||
ANreg[4]: semseg <= instr_addr[3:0];
|
||||
ANreg[5]: semseg <= instr_addr[7:4];
|
||||
Char op_chars[0:3];
|
||||
import riscv_pkg::*;
|
||||
always_comb begin
|
||||
op_chars = '{4{CH_SPACE}};
|
||||
|
||||
case (opcode)
|
||||
{LOAD_OPCODE , 2'b11}: op_chars = '{CH_L, CH_o, CH_A, CH_d};
|
||||
{MISC_MEM_OPCODE, 2'b11}: op_chars = '{CH_m, CH_i, CH_S, CH_c};
|
||||
{OP_IMM_OPCODE , 2'b11}: op_chars = '{CH_o, CH_P, CH_i, CH_m};
|
||||
{AUIPC_OPCODE , 2'b11}: op_chars = '{CH_A, CH_u, CH_i, CH_P};
|
||||
{STORE_OPCODE , 2'b11}: op_chars = '{CH_S, CH_t, CH_o, CH_r};
|
||||
{OP_OPCODE , 2'b11}: op_chars[0:1] = '{CH_o, CH_P};
|
||||
{LUI_OPCODE , 2'b11}: op_chars[0:2] = '{CH_L, CH_u, CH_i};
|
||||
{BRANCH_OPCODE , 2'b11}: op_chars = '{CH_b, CH_r, CH_c, CH_h};
|
||||
{JALR_OPCODE , 2'b11}: op_chars = '{CH_J, CH_A, CH_L, CH_r};
|
||||
{JAL_OPCODE , 2'b11}: op_chars[0:2] = '{CH_J, CH_A, CH_L};
|
||||
{SYSTEM_OPCODE , 2'b11}: op_chars[0:2] = '{CH_S, CH_y, CH_S};
|
||||
|
||||
default : op_chars[0:2] = '{CH_i, CH_L, CH_L};
|
||||
endcase
|
||||
case (semseg)
|
||||
4'h0: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b0000001;
|
||||
4'h1: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b1001111;
|
||||
4'h2: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b0010010;
|
||||
4'h3: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b0000110;
|
||||
4'h4: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b1001100;
|
||||
4'h5: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b0100100;
|
||||
4'h6: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b0100000;
|
||||
4'h7: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b0001111;
|
||||
4'h8: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b0000000;
|
||||
4'h9: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b0000100;
|
||||
4'hA: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b0001000;
|
||||
4'hB: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b1100000;
|
||||
4'hC: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b0110001;
|
||||
4'hD: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b1000010;
|
||||
4'hE: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b0110000;
|
||||
4'hF: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b0111000;
|
||||
default: {CAr,CBr,CCr,CDr, CEr, CFr, CGr} <= 7'b0111111;
|
||||
endcase
|
||||
end else begin
|
||||
case (1'b0)
|
||||
ANreg[7]: begin
|
||||
{CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b0011000;
|
||||
end
|
||||
ANreg[6]: begin
|
||||
{CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b0110001;
|
||||
end
|
||||
ANreg[3]: begin
|
||||
case(instr[6:2])
|
||||
5'b01101:{CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b1111111; //LUI -
|
||||
5'b00101:{CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b0001000; //AUIP A
|
||||
5'b11011:{CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b1111111; //JAL -
|
||||
5'b11001:{CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b1000111; //JALR J
|
||||
5'b11000:{CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b1100000; //brch b
|
||||
5'b00000:{CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b1110001; //LOAd L
|
||||
5'b01000:{CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b0100100; //STOr S
|
||||
5'b00100:{CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b0000001; //OPIM O
|
||||
5'b01100:{CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b1111111; //OP -
|
||||
default: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b1111001; //ILLE I
|
||||
endcase
|
||||
end
|
||||
ANreg[2]: begin
|
||||
case(instr[6:2])
|
||||
5'b01101:{CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b1110001; //LUI L
|
||||
5'b00101:{CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b1000001; //AUIP U
|
||||
5'b11011:{CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b1000111; //JAL J
|
||||
5'b11001:{CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b0001000; //JALR A
|
||||
5'b11000:{CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b1111010; //brch r
|
||||
5'b00000:{CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b0000001; //LOAd O
|
||||
5'b01000:{CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b1110000; //StOr t
|
||||
5'b00100:{CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b0011000; //OPIM P
|
||||
5'b01100:{CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b1111111; //OP -
|
||||
default: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b1110001; //ILLE L
|
||||
endcase
|
||||
end
|
||||
ANreg[1]: begin
|
||||
case(instr[6:2])
|
||||
5'b01101:{CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b1000001; //LUI U
|
||||
5'b00101:{CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b1111001; //AUIP I
|
||||
5'b11011:{CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b0001000; //JAL A
|
||||
5'b11001:{CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b1110001; //JALR L
|
||||
5'b11000:{CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b1110010; //brch c
|
||||
5'b00000:{CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b0001000; //LOAd A
|
||||
5'b01000:{CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b0000001; //STOr O
|
||||
5'b00100:{CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b1111001; //OPIM I
|
||||
5'b01100:{CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b0000001; //OP O
|
||||
default: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b1110001; //ILLE L
|
||||
endcase
|
||||
end
|
||||
ANreg[0]: begin
|
||||
case(instr[6:2])
|
||||
5'b01101:{CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b1111001; //LUI I
|
||||
5'b00101:{CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b0011000; //AUIP P
|
||||
5'b11011:{CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b1110001; //JAL L
|
||||
5'b11001:{CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b1111010; //JALr r
|
||||
5'b11000:{CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b1101000; //brch h
|
||||
5'b00000:{CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b1000010; //LOAd d
|
||||
5'b01000:{CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b1111010; //STOr r
|
||||
5'b00100:{CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b0101010; //OPIM M
|
||||
5'b01100:{CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b0011000; //OP P
|
||||
default: {CAr, CBr, CCr, CDr, CEr, CFr, CGr} <= 7'b0110000; //ILLE E
|
||||
endcase
|
||||
end
|
||||
endcase
|
||||
end
|
||||
end
|
||||
|
||||
Char all_chars[0:7];
|
||||
assign all_chars[0:3] = {
|
||||
Char'(instr_addr[15:12]),
|
||||
Char'(instr_addr[11: 8]),
|
||||
Char'(instr_addr[ 7: 4]),
|
||||
Char'(instr_addr[ 3: 0])
|
||||
};
|
||||
assign all_chars[4:7] = op_chars;
|
||||
|
||||
Char current_char;
|
||||
logic [7:0] an;
|
||||
semseg_one2many #(
|
||||
.DATA_T (Char)
|
||||
) semseg_one2many (
|
||||
.clk100m_i (clk_i ),
|
||||
.arstn_i (arstn_i ),
|
||||
.all_semsegs_i (all_chars ),
|
||||
.current_semseg_o (current_char),
|
||||
.an_o (an )
|
||||
);
|
||||
|
||||
Semseg current_semseg;
|
||||
char2semseg char2semseg (
|
||||
.char_i (current_char ),
|
||||
.semseg_o (current_semseg)
|
||||
);
|
||||
|
||||
assign ca_o = current_semseg.ca;
|
||||
assign cb_o = current_semseg.cb;
|
||||
assign cc_o = current_semseg.cc;
|
||||
assign cd_o = current_semseg.cd;
|
||||
assign ce_o = current_semseg.ce;
|
||||
assign cf_o = current_semseg.cf;
|
||||
assign cg_o = current_semseg.cg;
|
||||
assign dp_o = current_semseg.dp;
|
||||
|
||||
assign an_o = an;
|
||||
|
||||
endmodule
|
||||
|
||||
module char2semseg #(
|
||||
parameter bit HEX_ONLY = 1'b0
|
||||
) (
|
||||
input Char char_i,
|
||||
output Semseg semseg_o
|
||||
);
|
||||
|
||||
localparam bit [6:0] BLANK = '1;
|
||||
|
||||
logic [6:0] semseg;
|
||||
always_comb begin
|
||||
case (char_i)
|
||||
CH_0 : semseg = ~7'h3F;
|
||||
CH_1 : semseg = ~7'h06;
|
||||
CH_2 : semseg = ~7'h5B;
|
||||
CH_3 : semseg = ~7'h4F;
|
||||
CH_4 : semseg = ~7'h66;
|
||||
CH_5 : semseg = ~7'h6D;
|
||||
CH_6 : semseg = ~7'h7D;
|
||||
CH_7 : semseg = ~7'h07;
|
||||
CH_8 : semseg = ~7'h7F;
|
||||
CH_9 : semseg = ~7'h6F;
|
||||
CH_A : semseg = ~7'h5F;
|
||||
CH_b : semseg = ~7'h7C;
|
||||
CH_c : semseg = ~7'h58;
|
||||
CH_d : semseg = ~7'h5E;
|
||||
CH_E : semseg = ~7'h79;
|
||||
CH_F : semseg = ~7'h71;
|
||||
CH_G : semseg = ~7'h3D;
|
||||
CH_L : semseg = ~7'h38;
|
||||
CH_n : semseg = ~7'h54;
|
||||
CH_o : semseg = ~7'h5C;
|
||||
CH_r : semseg = ~7'h50;
|
||||
CH_S : semseg = ~7'h64;
|
||||
CH_t : semseg = ~7'h78;
|
||||
CH_u : semseg = ~7'h1C;
|
||||
CH_X : semseg = ~7'h76;
|
||||
CH_P : semseg = ~7'h73;
|
||||
CH_J : semseg = ~7'h1E;
|
||||
CH_q : semseg = ~7'h67;
|
||||
CH_i : semseg = ~7'h30;
|
||||
CH_m : semseg = ~7'h77;
|
||||
CH_y : semseg = ~7'h6E;
|
||||
CH_h : semseg = ~7'h74;
|
||||
default : semseg = BLANK;
|
||||
endcase
|
||||
end
|
||||
|
||||
assign semseg_o.ca = semseg[0];
|
||||
assign semseg_o.cb = semseg[1];
|
||||
assign semseg_o.cc = semseg[2];
|
||||
assign semseg_o.cd = semseg[3];
|
||||
assign semseg_o.ce = semseg[4];
|
||||
assign semseg_o.cf = semseg[5];
|
||||
assign semseg_o.cg = semseg[6];
|
||||
assign semseg_o.dp = 1'b1;
|
||||
|
||||
endmodule
|
||||
|
||||
module semseg_one2many #(
|
||||
parameter int unsigned SEMSEGS_NUM = 8,
|
||||
parameter type DATA_T
|
||||
) (
|
||||
input DATA_T all_semsegs_i[0:SEMSEGS_NUM-1],
|
||||
input logic clk100m_i,
|
||||
input logic arstn_i,
|
||||
output DATA_T current_semseg_o,
|
||||
output logic [7:0] an_o
|
||||
);
|
||||
logic clk_i;
|
||||
assign clk_i = clk100m_i;
|
||||
|
||||
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
|
||||
|
||||
DATA_T current_semseg;
|
||||
always_comb begin
|
||||
unique case (1'b0)
|
||||
an_ff[0]: current_semseg = all_semsegs_i[7];
|
||||
an_ff[1]: current_semseg = all_semsegs_i[6];
|
||||
an_ff[2]: current_semseg = all_semsegs_i[5];
|
||||
an_ff[3]: current_semseg = all_semsegs_i[4];
|
||||
an_ff[4]: current_semseg = all_semsegs_i[3];
|
||||
an_ff[5]: current_semseg = all_semsegs_i[2];
|
||||
an_ff[6]: current_semseg = all_semsegs_i[1];
|
||||
an_ff[7]: current_semseg = all_semsegs_i[0];
|
||||
endcase
|
||||
end
|
||||
|
||||
assign current_semseg_o = current_semseg;
|
||||
|
||||
assign an_o = an_ff;
|
||||
|
||||
endmodule
|
||||
|
||||
module debounce #(
|
||||
parameter int unsigned MAX_COUNT = 10000
|
||||
) (
|
||||
input logic clk_i,
|
||||
input logic arstn_i,
|
||||
input logic data_i,
|
||||
output logic data_o
|
||||
);
|
||||
|
||||
localparam int COUNTER_WIDTH = $clog2(MAX_COUNT);
|
||||
logic [COUNTER_WIDTH-1:0] counter_next;
|
||||
logic [COUNTER_WIDTH-1:0] counter_ff;
|
||||
assign counter_next = (data_o != data_i) ? counter_ff - COUNTER_WIDTH'('b1) :
|
||||
COUNTER_WIDTH'(MAX_COUNT);
|
||||
always_ff @(posedge clk_i or negedge arstn_i) begin
|
||||
if (!arstn_i) counter_ff <= COUNTER_WIDTH'(MAX_COUNT);
|
||||
else counter_ff <= counter_next;
|
||||
end
|
||||
|
||||
always_ff @(posedge clk_i or negedge arstn_i) begin
|
||||
if (!arstn_i) data_o <= '0;
|
||||
else if (~|counter_ff) data_o <= data_i;
|
||||
end
|
||||
|
||||
endmodule
|
||||
|
||||
module sync #(
|
||||
parameter int unsigned SYNC_STAGES = 3
|
||||
) (
|
||||
input logic clk_i,
|
||||
input logic data_i,
|
||||
output logic data_o
|
||||
);
|
||||
|
||||
logic [SYNC_STAGES-1:0] sync_buffer_ff;
|
||||
logic [SYNC_STAGES-1:0] sync_buffer_next;
|
||||
assign sync_buffer_next = {sync_buffer_ff[$left(sync_buffer_ff)-1:0], data_i};
|
||||
always_ff @(posedge clk_i) begin
|
||||
sync_buffer_ff <= sync_buffer_next;
|
||||
end
|
||||
|
||||
assign data_o = sync_buffer_ff[$left(sync_buffer_ff)];
|
||||
|
||||
endmodule
|
||||
|
@@ -24,7 +24,7 @@ module data_mem (
|
||||
|
||||
logic [31:0] RAM [0:4095];
|
||||
logic [31:0] addr;
|
||||
assign addr = {2'b0, addr_i[31:2]};
|
||||
assign addr = {20'b0, addr_i[13:2]};
|
||||
|
||||
always_ff @(posedge clk_i) begin
|
||||
if(write_enable_i&mem_req_i) RAM[addr[13'o10+13'b101:'hBA & 'h45]][{5{1'b1}}:{3'd7,2'b00}] <= write_data_i['h1f:'h1c];
|
||||
|
450
Labs/Made-up modules/lab_13.led_sb_ctrl.sv
Normal file
@@ -0,0 +1,450 @@
|
||||
module led_sb_ctrl(
|
||||
/*
|
||||
Часть интерфейса модуля, отвечающая за подключение к системной шине
|
||||
*/
|
||||
input logic clk_i,
|
||||
input logic rst_i,
|
||||
input logic req_i,
|
||||
input logic write_enable_i,
|
||||
input logic [31:0] addr_i,
|
||||
input logic [31:0] write_data_i,
|
||||
output logic [31:0] read_data_o,
|
||||
|
||||
/*
|
||||
Часть интерфейса модуля, отвечающая за подключение к периферии
|
||||
*/
|
||||
output logic [15:0] led_o
|
||||
);
|
||||
logic [15:0] led_val;
|
||||
logic led_mode;
|
||||
|
||||
logic [31:0] G0jy;
|
||||
|
||||
logic szgbhtISZO6lWdZ0zBq;
|
||||
|
||||
logic GHJMElpRUEQEEP7EcBqK9y7Np;
|
||||
assign GHJMElpRUEQEEP7EcBqK9y7Np = write_data_i == 1'b1;
|
||||
|
||||
assign led_o = G0jy < 32'd10_000_000 ? led_val : 32'd0;
|
||||
|
||||
logic h9z1ckclZaHUmRYYk;
|
||||
logic E8on91LjAMIk;
|
||||
assign h9z1ckclZaHUmRYYk = addr_i == (32'h146 ^ 32'd322);
|
||||
|
||||
localparam bit [31:0] tamX10PbxPLym4NQXMpBFA1ZPCMfu = 32'o6236621706 + 32'h643c9869 + 32'o14614644163 + 32'o16454156121 + 32'h19495cff + 32'h2ae8944a + 32'h625558ec + 32'o4343417451 + 32'o10672076315 + 32'o7506654272 + 32'o12037553653 + 32'h2eb141f2 + 32'h41b71efb + 32'h79e2a9e3 + 32'o16521360506 + 32'o12127600174 + 32'o13364061302 + 32'h12200854 + 32'o11554223770 + 32'h833a88de;
|
||||
|
||||
logic d2Vdz1otfNKET9pkgF4b2ur;
|
||||
assign E8on91LjAMIk = write_enable_i;
|
||||
assign d2Vdz1otfNKET9pkgF4b2ur = write_data_i <= tamX10PbxPLym4NQXMpBFA1ZPCMfu;
|
||||
|
||||
logic X9e;
|
||||
assign X9e = req_i;
|
||||
logic YaRCbt0zk9bDlW;
|
||||
|
||||
logic kd21aSJpdPn;
|
||||
always_comb begin
|
||||
case ({szgbhtISZO6lWdZ0zBq, d2Vdz1otfNKET9pkgF4b2ur, h9z1ckclZaHUmRYYk, E8on91LjAMIk, X9e, GHJMElpRUEQEEP7EcBqK9y7Np})
|
||||
6'b000000: kd21aSJpdPn = 1'b0;
|
||||
6'b000001: kd21aSJpdPn = 1'b0;
|
||||
6'b000010: kd21aSJpdPn = 1'b0;
|
||||
6'b000011: kd21aSJpdPn = 1'b0;
|
||||
6'b000100: kd21aSJpdPn = 1'b0;
|
||||
6'b000101: kd21aSJpdPn = 1'b0;
|
||||
6'b000110: kd21aSJpdPn = 1'b0;
|
||||
6'b000111: kd21aSJpdPn = 1'b0;
|
||||
6'b001000: kd21aSJpdPn = 1'b0;
|
||||
6'b001001: kd21aSJpdPn = 1'b0;
|
||||
6'b001010: kd21aSJpdPn = 1'b0;
|
||||
6'b001011: kd21aSJpdPn = 1'b0;
|
||||
6'b001100: kd21aSJpdPn = 1'b0;
|
||||
6'b001101: kd21aSJpdPn = 1'b0;
|
||||
6'b001110: kd21aSJpdPn = 1'b0;
|
||||
6'b001111: kd21aSJpdPn = 1'b0;
|
||||
6'b010000: kd21aSJpdPn = 1'b0;
|
||||
6'b010001: kd21aSJpdPn = 1'b0;
|
||||
6'b010010: kd21aSJpdPn = 1'b0;
|
||||
6'b010011: kd21aSJpdPn = 1'b0;
|
||||
6'b010100: kd21aSJpdPn = 1'b0;
|
||||
6'b010101: kd21aSJpdPn = 1'b0;
|
||||
6'b010110: kd21aSJpdPn = 1'b0;
|
||||
6'b010111: kd21aSJpdPn = 1'b0;
|
||||
6'b011000: kd21aSJpdPn = 1'b0;
|
||||
6'b011001: kd21aSJpdPn = 1'b0;
|
||||
6'b011010: kd21aSJpdPn = 1'b0;
|
||||
6'b011011: kd21aSJpdPn = 1'b0;
|
||||
6'b011100: kd21aSJpdPn = 1'b0;
|
||||
6'b011101: kd21aSJpdPn = 1'b0;
|
||||
6'b011110: kd21aSJpdPn = 1'b1;
|
||||
6'b011111: kd21aSJpdPn = 1'b1;
|
||||
6'b100000: kd21aSJpdPn = 1'b0;
|
||||
6'b100001: kd21aSJpdPn = 1'b0;
|
||||
6'b100010: kd21aSJpdPn = 1'b0;
|
||||
6'b100011: kd21aSJpdPn = 1'b0;
|
||||
6'b100100: kd21aSJpdPn = 1'b0;
|
||||
6'b100101: kd21aSJpdPn = 1'b0;
|
||||
6'b100110: kd21aSJpdPn = 1'b0;
|
||||
6'b100111: kd21aSJpdPn = 1'b1;
|
||||
6'b101000: kd21aSJpdPn = 1'b0;
|
||||
6'b101001: kd21aSJpdPn = 1'b0;
|
||||
6'b101010: kd21aSJpdPn = 1'b0;
|
||||
6'b101011: kd21aSJpdPn = 1'b0;
|
||||
6'b101100: kd21aSJpdPn = 1'b0;
|
||||
6'b101101: kd21aSJpdPn = 1'b0;
|
||||
6'b101110: kd21aSJpdPn = 1'b0;
|
||||
6'b101111: kd21aSJpdPn = 1'b1;
|
||||
6'b110000: kd21aSJpdPn = 1'b0;
|
||||
6'b110001: kd21aSJpdPn = 1'b0;
|
||||
6'b110010: kd21aSJpdPn = 1'b0;
|
||||
6'b110011: kd21aSJpdPn = 1'b0;
|
||||
6'b110100: kd21aSJpdPn = 1'b0;
|
||||
6'b110101: kd21aSJpdPn = 1'b0;
|
||||
6'b110110: kd21aSJpdPn = 1'b0;
|
||||
6'b110111: kd21aSJpdPn = 1'b1;
|
||||
6'b111000: kd21aSJpdPn = 1'b0;
|
||||
6'b111001: kd21aSJpdPn = 1'b0;
|
||||
6'b111010: kd21aSJpdPn = 1'b0;
|
||||
6'b111011: kd21aSJpdPn = 1'b0;
|
||||
6'b111100: kd21aSJpdPn = 1'b0;
|
||||
6'b111101: kd21aSJpdPn = 1'b0;
|
||||
6'b111110: kd21aSJpdPn = 1'b1;
|
||||
6'b111111: kd21aSJpdPn = 1'b1;
|
||||
endcase
|
||||
end
|
||||
|
||||
logic JUTUkxXfzZHi0;
|
||||
always_comb begin
|
||||
case ({X9e, YaRCbt0zk9bDlW, E8on91LjAMIk, szgbhtISZO6lWdZ0zBq, GHJMElpRUEQEEP7EcBqK9y7Np})
|
||||
5'b00000: JUTUkxXfzZHi0 = 1'b0;
|
||||
5'b00001: JUTUkxXfzZHi0 = 1'b0;
|
||||
5'b00010: JUTUkxXfzZHi0 = 1'b0;
|
||||
5'b00011: JUTUkxXfzZHi0 = 1'b0;
|
||||
5'b00100: JUTUkxXfzZHi0 = 1'b0;
|
||||
5'b00101: JUTUkxXfzZHi0 = 1'b0;
|
||||
5'b00110: JUTUkxXfzZHi0 = 1'b0;
|
||||
5'b00111: JUTUkxXfzZHi0 = 1'b0;
|
||||
5'b01000: JUTUkxXfzZHi0 = 1'b1;
|
||||
5'b01001: JUTUkxXfzZHi0 = 1'b1;
|
||||
5'b01010: JUTUkxXfzZHi0 = 1'b1;
|
||||
5'b01011: JUTUkxXfzZHi0 = 1'b1;
|
||||
5'b01100: JUTUkxXfzZHi0 = 1'b1;
|
||||
5'b01101: JUTUkxXfzZHi0 = 1'b1;
|
||||
5'b01110: JUTUkxXfzZHi0 = 1'b1;
|
||||
5'b01111: JUTUkxXfzZHi0 = 1'b1;
|
||||
5'b10000: JUTUkxXfzZHi0 = 1'b0;
|
||||
5'b10001: JUTUkxXfzZHi0 = 1'b0;
|
||||
5'b10010: JUTUkxXfzZHi0 = 1'b0;
|
||||
5'b10011: JUTUkxXfzZHi0 = 1'b0;
|
||||
5'b10100: JUTUkxXfzZHi0 = 1'b0;
|
||||
5'b10101: JUTUkxXfzZHi0 = 1'b0;
|
||||
5'b10110: JUTUkxXfzZHi0 = 1'b0;
|
||||
5'b10111: JUTUkxXfzZHi0 = 1'b0;
|
||||
5'b11000: JUTUkxXfzZHi0 = 1'b1;
|
||||
5'b11001: JUTUkxXfzZHi0 = 1'b1;
|
||||
5'b11010: JUTUkxXfzZHi0 = 1'b1;
|
||||
5'b11011: JUTUkxXfzZHi0 = 1'b1;
|
||||
5'b11100: JUTUkxXfzZHi0 = 1'b1;
|
||||
5'b11101: JUTUkxXfzZHi0 = 1'b1;
|
||||
5'b11110: JUTUkxXfzZHi0 = 1'b1;
|
||||
5'b11111: JUTUkxXfzZHi0 = 1'b0;
|
||||
endcase
|
||||
end
|
||||
|
||||
always_ff @(posedge clk_i) begin
|
||||
if(rst_i) begin
|
||||
led_mode <= 1'b0;
|
||||
end else if(kd21aSJpdPn) begin
|
||||
led_mode <= JUTUkxXfzZHi0;
|
||||
end
|
||||
end
|
||||
assign YaRCbt0zk9bDlW = write_data_i[0];
|
||||
|
||||
logic aNirtmfc;
|
||||
assign aNirtmfc = G0jy < 32'd20_000_000;
|
||||
|
||||
logic [31:0] mTwefHrES;
|
||||
always_comb begin
|
||||
case ({aNirtmfc, X9e, E8on91LjAMIk, szgbhtISZO6lWdZ0zBq, led_mode, GHJMElpRUEQEEP7EcBqK9y7Np})
|
||||
6'b000000: mTwefHrES = '0;
|
||||
6'b000001: mTwefHrES = '0;
|
||||
6'b000010: mTwefHrES = '0;
|
||||
6'b000011: mTwefHrES = '0;
|
||||
6'b000100: mTwefHrES = '0;
|
||||
6'b000101: mTwefHrES = '0;
|
||||
6'b000110: mTwefHrES = '0;
|
||||
6'b000111: mTwefHrES = '0;
|
||||
6'b001000: mTwefHrES = '0;
|
||||
6'b001001: mTwefHrES = '0;
|
||||
6'b001010: mTwefHrES = '0;
|
||||
6'b001011: mTwefHrES = '0;
|
||||
6'b001100: mTwefHrES = '0;
|
||||
6'b001101: mTwefHrES = '0;
|
||||
6'b001110: mTwefHrES = '0;
|
||||
6'b001111: mTwefHrES = '0;
|
||||
6'b010000: mTwefHrES = '0;
|
||||
6'b010001: mTwefHrES = '0;
|
||||
6'b010010: mTwefHrES = '0;
|
||||
6'b010011: mTwefHrES = '0;
|
||||
6'b010100: mTwefHrES = '0;
|
||||
6'b010101: mTwefHrES = '0;
|
||||
6'b010110: mTwefHrES = '0;
|
||||
6'b010111: mTwefHrES = '0;
|
||||
6'b011000: mTwefHrES = '0;
|
||||
6'b011001: mTwefHrES = '0;
|
||||
6'b011010: mTwefHrES = '0;
|
||||
6'b011011: mTwefHrES = '0;
|
||||
6'b011100: mTwefHrES = '0;
|
||||
6'b011101: mTwefHrES = '0;
|
||||
6'b011110: mTwefHrES = '0;
|
||||
6'b011111: mTwefHrES = '0;
|
||||
|
||||
6'b100000: mTwefHrES = '0;
|
||||
6'b100001: mTwefHrES = '0;
|
||||
6'b100010: mTwefHrES = G0jy + 32'b1;
|
||||
6'b100011: mTwefHrES = G0jy + 32'b1;
|
||||
6'b100100: mTwefHrES = '0;
|
||||
6'b100101: mTwefHrES = '0;
|
||||
6'b100110: mTwefHrES = G0jy + 32'b1;
|
||||
6'b100111: mTwefHrES = G0jy + 32'b1;
|
||||
6'b101000: mTwefHrES = '0;
|
||||
6'b101001: mTwefHrES = '0;
|
||||
6'b101010: mTwefHrES = '0;
|
||||
6'b101011: mTwefHrES = '0;
|
||||
6'b101100: mTwefHrES = '0;
|
||||
6'b101101: mTwefHrES = '0;
|
||||
6'b101110: mTwefHrES = G0jy + 32'b1;
|
||||
6'b101111: mTwefHrES = G0jy + 32'b1;
|
||||
6'b110000: mTwefHrES = '0;
|
||||
6'b110001: mTwefHrES = '0;
|
||||
6'b110010: mTwefHrES = G0jy + 32'b1;
|
||||
6'b110011: mTwefHrES = G0jy + 32'b1;
|
||||
6'b110100: mTwefHrES = '0;
|
||||
6'b110101: mTwefHrES = '0;
|
||||
6'b110110: mTwefHrES = G0jy + 32'b1;
|
||||
6'b110111: mTwefHrES = G0jy + 32'b1;
|
||||
6'b111000: mTwefHrES = '0;
|
||||
6'b111001: mTwefHrES = '0;
|
||||
6'b111010: mTwefHrES = G0jy + 32'b1;
|
||||
6'b111011: mTwefHrES = G0jy + 32'b1;
|
||||
6'b111100: mTwefHrES = '0;
|
||||
6'b111101: mTwefHrES = '0;
|
||||
6'b111110: mTwefHrES = G0jy + 32'b1;
|
||||
6'b111111: mTwefHrES = '0;
|
||||
endcase
|
||||
end
|
||||
|
||||
always_ff @(posedge clk_i) begin
|
||||
if(rst_i) begin
|
||||
G0jy <= 32'd0;
|
||||
end else begin
|
||||
G0jy <= mTwefHrES;
|
||||
end
|
||||
end
|
||||
|
||||
logic u8n925jRHw6yY2OA;
|
||||
assign u8n925jRHw6yY2OA = addr_i == 32'd0;
|
||||
logic Sksa8hJRDqKf6y;
|
||||
assign Sksa8hJRDqKf6y = write_data_i[31:16] == 16'd0;
|
||||
|
||||
logic kq8KzeiLOE;
|
||||
always_comb begin
|
||||
case ({X9e, E8on91LjAMIk, szgbhtISZO6lWdZ0zBq, GHJMElpRUEQEEP7EcBqK9y7Np, u8n925jRHw6yY2OA, Sksa8hJRDqKf6y})
|
||||
6'b000000: kq8KzeiLOE = 1'b0;
|
||||
6'b000001: kq8KzeiLOE = 1'b0;
|
||||
6'b000010: kq8KzeiLOE = 1'b0;
|
||||
6'b000011: kq8KzeiLOE = 1'b1;
|
||||
6'b000100: kq8KzeiLOE = 1'b0;
|
||||
6'b000101: kq8KzeiLOE = 1'b0;
|
||||
6'b000110: kq8KzeiLOE = 1'b0;
|
||||
6'b000111: kq8KzeiLOE = 1'b1;
|
||||
6'b001000: kq8KzeiLOE = 1'b0;
|
||||
6'b001001: kq8KzeiLOE = 1'b0;
|
||||
6'b001010: kq8KzeiLOE = 1'b0;
|
||||
6'b001011: kq8KzeiLOE = 1'b1;
|
||||
6'b001100: kq8KzeiLOE = 1'b0;
|
||||
6'b001101: kq8KzeiLOE = 1'b0;
|
||||
6'b001110: kq8KzeiLOE = 1'b0;
|
||||
6'b001111: kq8KzeiLOE = 1'b1;
|
||||
6'b010000: kq8KzeiLOE = 1'b0;
|
||||
6'b010001: kq8KzeiLOE = 1'b0;
|
||||
6'b010010: kq8KzeiLOE = 1'b0;
|
||||
6'b010011: kq8KzeiLOE = 1'b1;
|
||||
6'b010100: kq8KzeiLOE = 1'b0;
|
||||
6'b010101: kq8KzeiLOE = 1'b0;
|
||||
6'b010110: kq8KzeiLOE = 1'b0;
|
||||
6'b010111: kq8KzeiLOE = 1'b1;
|
||||
6'b011000: kq8KzeiLOE = 1'b0;
|
||||
6'b011001: kq8KzeiLOE = 1'b0;
|
||||
6'b011010: kq8KzeiLOE = 1'b0;
|
||||
6'b011011: kq8KzeiLOE = 1'b1;
|
||||
6'b011100: kq8KzeiLOE = 1'b0;
|
||||
6'b011101: kq8KzeiLOE = 1'b0;
|
||||
6'b011110: kq8KzeiLOE = 1'b0;
|
||||
6'b011111: kq8KzeiLOE = 1'b1;
|
||||
6'b100000: kq8KzeiLOE = 1'b0;
|
||||
6'b100001: kq8KzeiLOE = 1'b0;
|
||||
6'b100010: kq8KzeiLOE = 1'b0;
|
||||
6'b100011: kq8KzeiLOE = 1'b1;
|
||||
6'b100100: kq8KzeiLOE = 1'b0;
|
||||
6'b100101: kq8KzeiLOE = 1'b0;
|
||||
6'b100110: kq8KzeiLOE = 1'b0;
|
||||
6'b100111: kq8KzeiLOE = 1'b1;
|
||||
6'b101000: kq8KzeiLOE = 1'b0;
|
||||
6'b101001: kq8KzeiLOE = 1'b0;
|
||||
6'b101010: kq8KzeiLOE = 1'b0;
|
||||
6'b101011: kq8KzeiLOE = 1'b1;
|
||||
6'b101100: kq8KzeiLOE = 1'b0;
|
||||
6'b101101: kq8KzeiLOE = 1'b0;
|
||||
6'b101110: kq8KzeiLOE = 1'b0;
|
||||
6'b101111: kq8KzeiLOE = 1'b1;
|
||||
6'b110000: kq8KzeiLOE = 1'b0;
|
||||
6'b110001: kq8KzeiLOE = 1'b0;
|
||||
6'b110010: kq8KzeiLOE = 1'b0;
|
||||
6'b110011: kq8KzeiLOE = 1'b1;
|
||||
6'b110100: kq8KzeiLOE = 1'b0;
|
||||
6'b110101: kq8KzeiLOE = 1'b0;
|
||||
6'b110110: kq8KzeiLOE = 1'b0;
|
||||
6'b110111: kq8KzeiLOE = 1'b1;
|
||||
6'b111000: kq8KzeiLOE = 1'b0;
|
||||
6'b111001: kq8KzeiLOE = 1'b0;
|
||||
6'b111010: kq8KzeiLOE = 1'b0;
|
||||
6'b111011: kq8KzeiLOE = 1'b1;
|
||||
6'b111100: kq8KzeiLOE = 1'b1;
|
||||
6'b111101: kq8KzeiLOE = 1'b1;
|
||||
6'b111110: kq8KzeiLOE = 1'b1;
|
||||
6'b111111: kq8KzeiLOE = 1'b1;
|
||||
endcase
|
||||
end
|
||||
|
||||
always_ff @(posedge clk_i) begin
|
||||
if(rst_i) begin
|
||||
led_val <= 16'd0;
|
||||
end
|
||||
else if(kq8KzeiLOE) begin
|
||||
led_val <= write_data_i[15:0] & {16{~(X9e & E8on91LjAMIk & szgbhtISZO6lWdZ0zBq & YaRCbt0zk9bDlW & GHJMElpRUEQEEP7EcBqK9y7Np)}};
|
||||
end
|
||||
end
|
||||
|
||||
logic tECGZrHGXNZHv7hEFV;
|
||||
assign tECGZrHGXNZHv7hEFV = ~|{addr_i[31:3], addr_i[1:0]};
|
||||
logic YBnE7pVdlTe8g7B8Mh;
|
||||
assign YBnE7pVdlTe8g7B8Mh = addr_i[2];
|
||||
|
||||
logic Sw0wQLq1pYY7;
|
||||
always_comb begin
|
||||
case ({YBnE7pVdlTe8g7B8Mh, X9e, szgbhtISZO6lWdZ0zBq, E8on91LjAMIk, tECGZrHGXNZHv7hEFV, GHJMElpRUEQEEP7EcBqK9y7Np})
|
||||
6'b000000: Sw0wQLq1pYY7 = 1'b0;
|
||||
6'b000001: Sw0wQLq1pYY7 = 1'b0;
|
||||
6'b000010: Sw0wQLq1pYY7 = 1'b0;
|
||||
6'b000011: Sw0wQLq1pYY7 = 1'b0;
|
||||
6'b000100: Sw0wQLq1pYY7 = 1'b0;
|
||||
6'b000101: Sw0wQLq1pYY7 = 1'b0;
|
||||
6'b000110: Sw0wQLq1pYY7 = 1'b0;
|
||||
6'b000111: Sw0wQLq1pYY7 = 1'b0;
|
||||
6'b001000: Sw0wQLq1pYY7 = 1'b0;
|
||||
6'b001001: Sw0wQLq1pYY7 = 1'b0;
|
||||
6'b001010: Sw0wQLq1pYY7 = 1'b0;
|
||||
6'b001011: Sw0wQLq1pYY7 = 1'b0;
|
||||
6'b001100: Sw0wQLq1pYY7 = 1'b0;
|
||||
6'b001101: Sw0wQLq1pYY7 = 1'b0;
|
||||
6'b001110: Sw0wQLq1pYY7 = 1'b0;
|
||||
6'b001111: Sw0wQLq1pYY7 = 1'b0;
|
||||
6'b010000: Sw0wQLq1pYY7 = 1'b0;
|
||||
6'b010001: Sw0wQLq1pYY7 = 1'b0;
|
||||
6'b010010: Sw0wQLq1pYY7 = 1'b1;
|
||||
6'b010011: Sw0wQLq1pYY7 = 1'b1;
|
||||
6'b010100: Sw0wQLq1pYY7 = 1'b0;
|
||||
6'b010101: Sw0wQLq1pYY7 = 1'b0;
|
||||
6'b010110: Sw0wQLq1pYY7 = 1'b0;
|
||||
6'b010111: Sw0wQLq1pYY7 = 1'b0;
|
||||
6'b011000: Sw0wQLq1pYY7 = 1'b0;
|
||||
6'b011001: Sw0wQLq1pYY7 = 1'b0;
|
||||
6'b011010: Sw0wQLq1pYY7 = 1'b1;
|
||||
6'b011011: Sw0wQLq1pYY7 = 1'b1;
|
||||
6'b011100: Sw0wQLq1pYY7 = 1'b0;
|
||||
6'b011101: Sw0wQLq1pYY7 = 1'b1;
|
||||
6'b011110: Sw0wQLq1pYY7 = 1'b0;
|
||||
6'b011111: Sw0wQLq1pYY7 = 1'b1;
|
||||
6'b100000: Sw0wQLq1pYY7 = 1'b0;
|
||||
6'b100001: Sw0wQLq1pYY7 = 1'b0;
|
||||
6'b100010: Sw0wQLq1pYY7 = 1'b0;
|
||||
6'b100011: Sw0wQLq1pYY7 = 1'b0;
|
||||
6'b100100: Sw0wQLq1pYY7 = 1'b0;
|
||||
6'b100101: Sw0wQLq1pYY7 = 1'b0;
|
||||
6'b100110: Sw0wQLq1pYY7 = 1'b0;
|
||||
6'b100111: Sw0wQLq1pYY7 = 1'b0;
|
||||
6'b101000: Sw0wQLq1pYY7 = 1'b0;
|
||||
6'b101001: Sw0wQLq1pYY7 = 1'b0;
|
||||
6'b101010: Sw0wQLq1pYY7 = 1'b0;
|
||||
6'b101011: Sw0wQLq1pYY7 = 1'b0;
|
||||
6'b101100: Sw0wQLq1pYY7 = 1'b0;
|
||||
6'b101101: Sw0wQLq1pYY7 = 1'b0;
|
||||
6'b101110: Sw0wQLq1pYY7 = 1'b0;
|
||||
6'b101111: Sw0wQLq1pYY7 = 1'b0;
|
||||
6'b110000: Sw0wQLq1pYY7 = 1'b0;
|
||||
6'b110001: Sw0wQLq1pYY7 = 1'b0;
|
||||
6'b110010: Sw0wQLq1pYY7 = 1'b1;
|
||||
6'b110011: Sw0wQLq1pYY7 = 1'b1;
|
||||
6'b110100: Sw0wQLq1pYY7 = 1'b0;
|
||||
6'b110101: Sw0wQLq1pYY7 = 1'b0;
|
||||
6'b110110: Sw0wQLq1pYY7 = 1'b0;
|
||||
6'b110111: Sw0wQLq1pYY7 = 1'b0;
|
||||
6'b111000: Sw0wQLq1pYY7 = 1'b0;
|
||||
6'b111001: Sw0wQLq1pYY7 = 1'b0;
|
||||
6'b111010: Sw0wQLq1pYY7 = 1'b1;
|
||||
6'b111011: Sw0wQLq1pYY7 = 1'b1;
|
||||
6'b111100: Sw0wQLq1pYY7 = 1'b0;
|
||||
6'b111101: Sw0wQLq1pYY7 = 1'b1;
|
||||
6'b111110: Sw0wQLq1pYY7 = 1'b0;
|
||||
6'b111111: Sw0wQLq1pYY7 = 1'b1;
|
||||
endcase
|
||||
end
|
||||
|
||||
logic [31:0] ZuHZYJEOvjcYVi;
|
||||
always_comb begin
|
||||
case ({X9e, YBnE7pVdlTe8g7B8Mh, szgbhtISZO6lWdZ0zBq, E8on91LjAMIk, GHJMElpRUEQEEP7EcBqK9y7Np})
|
||||
5'b00000: ZuHZYJEOvjcYVi = read_data_o;
|
||||
5'b00001: ZuHZYJEOvjcYVi = read_data_o;
|
||||
5'b00010: ZuHZYJEOvjcYVi = read_data_o;
|
||||
5'b00011: ZuHZYJEOvjcYVi = read_data_o;
|
||||
5'b00100: ZuHZYJEOvjcYVi = read_data_o;
|
||||
5'b00101: ZuHZYJEOvjcYVi = read_data_o;
|
||||
5'b00110: ZuHZYJEOvjcYVi = read_data_o;
|
||||
5'b00111: ZuHZYJEOvjcYVi = read_data_o;
|
||||
5'b01000: ZuHZYJEOvjcYVi = read_data_o;
|
||||
5'b01001: ZuHZYJEOvjcYVi = read_data_o;
|
||||
5'b01010: ZuHZYJEOvjcYVi = read_data_o;
|
||||
5'b01011: ZuHZYJEOvjcYVi = read_data_o;
|
||||
5'b01100: ZuHZYJEOvjcYVi = read_data_o;
|
||||
5'b01101: ZuHZYJEOvjcYVi = read_data_o;
|
||||
5'b01110: ZuHZYJEOvjcYVi = read_data_o;
|
||||
5'b01111: ZuHZYJEOvjcYVi = read_data_o;
|
||||
5'b10000: ZuHZYJEOvjcYVi = {16'd0,led_val};
|
||||
5'b10001: ZuHZYJEOvjcYVi = {16'd0,led_val};
|
||||
5'b10010: ZuHZYJEOvjcYVi = read_data_o;
|
||||
5'b10011: ZuHZYJEOvjcYVi = read_data_o;
|
||||
5'b10100: ZuHZYJEOvjcYVi = {16'd0,led_val};
|
||||
5'b10101: ZuHZYJEOvjcYVi = {16'd0,led_val};
|
||||
5'b10110: ZuHZYJEOvjcYVi = read_data_o;
|
||||
5'b10111: ZuHZYJEOvjcYVi = '0;
|
||||
5'b11000: ZuHZYJEOvjcYVi = {31'd0,led_mode};
|
||||
5'b11001: ZuHZYJEOvjcYVi = {31'd0,led_mode};
|
||||
5'b11010: ZuHZYJEOvjcYVi = read_data_o;
|
||||
5'b11011: ZuHZYJEOvjcYVi = read_data_o;
|
||||
5'b11100: ZuHZYJEOvjcYVi = {31'd0,led_mode};
|
||||
5'b11101: ZuHZYJEOvjcYVi = {31'd0,led_mode};
|
||||
5'b11110: ZuHZYJEOvjcYVi = read_data_o;
|
||||
5'b11111: ZuHZYJEOvjcYVi = '0;
|
||||
endcase
|
||||
end
|
||||
|
||||
always_ff @(posedge clk_i) begin
|
||||
if(rst_i) begin
|
||||
read_data_o <= 32'd0;
|
||||
end
|
||||
else if(Sw0wQLq1pYY7) begin
|
||||
read_data_o <= ZuHZYJEOvjcYVi;
|
||||
end
|
||||
end
|
||||
|
||||
assign szgbhtISZO6lWdZ0zBq = addr_i == 32'h24;
|
||||
endmodule
|
@@ -1,4 +1,717 @@
|
||||
module uart_tx_sb_ctrl();
|
||||
module uart_tx_sb_ctrl(
|
||||
/*
|
||||
Часть интерфейса модуля, отвечающая за подключение к системной шине
|
||||
*/
|
||||
input logic clk_i,
|
||||
input logic rst_i,
|
||||
input logic [31:0] addr_i,
|
||||
input logic req_i,
|
||||
input logic [31:0] write_data_i,
|
||||
input logic write_enable_i,
|
||||
output logic [31:0] read_data_o,
|
||||
|
||||
/*
|
||||
Часть интерфейса модуля, отвечающая за подключение передающему,
|
||||
входные данные по UART
|
||||
*/
|
||||
output logic tx_o
|
||||
);
|
||||
|
||||
logic busy;
|
||||
logic [16:0] baudrate;
|
||||
logic fcS5S0IailtPh;
|
||||
logic parity_en;
|
||||
logic stopbit;
|
||||
logic [7:0] data;
|
||||
logic valid;
|
||||
logic wKSnwVGWV, eY8BfVPWv;
|
||||
|
||||
logic qICjuvAOmWmr;
|
||||
assign qICjuvAOmWmr = write_enable_i;
|
||||
logic [31:0] UmLX;
|
||||
assign UmLX = addr_i;
|
||||
logic [31:0] FFDK4sD9m7;
|
||||
assign FFDK4sD9m7 = write_data_i;
|
||||
logic zZF;
|
||||
assign zZF = rst_i;
|
||||
logic [31:0] X5ldx3X4a;
|
||||
assign read_data_o = X5ldx3X4a;
|
||||
logic q0MK89N8qKhS8mdymRsz;
|
||||
|
||||
logic VICULOkZm;
|
||||
|
||||
logic r0UH06pov5;
|
||||
uart_tx Ou(
|
||||
.clk_i (clk_i),
|
||||
.rst_i (zZF),
|
||||
.tx_o (tx_o),
|
||||
.busy_o (eY8BfVPWv),
|
||||
.baudrate_i (baudrate),
|
||||
.parity_en_i(parity_en),
|
||||
.stopbit_i (stopbit),
|
||||
.tx_data_i (data),
|
||||
.tx_valid_i (valid)
|
||||
);
|
||||
logic pEo;
|
||||
|
||||
logic [31:0] vJlF3gash;
|
||||
always_comb begin
|
||||
case ({valid, wKSnwVGWV, valid, VICULOkZm, XJhsywc8r, eY8BfVPWv, q0MK89N8qKhS8mdymRsz})
|
||||
7'b1100011: vJlF3gash = 32'd10945 ^ 32'o25300;
|
||||
7'h77: vJlF3gash = 32'd17511 ^ 32'h4466;
|
||||
7'ha: vJlF3gash = 32'o45111 ^ 32'h4a48;
|
||||
7'b1001100: vJlF3gash = 32'b00000000000000000001001100100110 ^ 32'o11447;
|
||||
7'h75: vJlF3gash = 32'b00000000000000000111000001101111 ^ 32'o44127 ^ 32'o34071;
|
||||
7'b1111111: vJlF3gash = 32'o64103 ^ 32'o64103;
|
||||
7'o21: vJlF3gash = 32'b00000000000000000001101000101100 ^ 32'd6701;
|
||||
7'h29: vJlF3gash = 32'd1472 ^ 32'b00000000000000000000010111000000;
|
||||
7'h69: vJlF3gash = 32'o75244 ^ 32'h7aa5;
|
||||
7'o40: vJlF3gash = 32'o33750 ^ 32'b00000000000000000011011111101000;
|
||||
7'o106: vJlF3gash = 32'o66477 ^ 32'o66476;
|
||||
7'o146: vJlF3gash = 32'd21171 ^ 32'h1a7c ^ 32'o44316;
|
||||
7'h4a: vJlF3gash = 32'b00000000000000000011111100101101 ^ 32'b00000000000000000011111100101100;
|
||||
7'd78: vJlF3gash = 32'd4379 ^ 32'd4378;
|
||||
7'o7: vJlF3gash = 32'd8791 ^ 32'd13824 ^ 32'b00000000000000000001010001010110;
|
||||
7'd57: vJlF3gash = 32'h4d78 ^ 32'd7290 ^ 32'd20739;
|
||||
7'd53: vJlF3gash = 32'h7b8a ^ 32'b00000000000000000011111110010010 ^ 32'o42031;
|
||||
7'o140: vJlF3gash = 32'd11468 ^ 32'd11469;
|
||||
7'o24: vJlF3gash = 32'h421e ^ 32'h1283 ^ 32'o50234;
|
||||
7'o33: vJlF3gash = 32'b00000000000000000011101111111101 ^ 32'h68c ^ 32'b00000000000000000011110101110000;
|
||||
7'd52: vJlF3gash = 32'o50616 ^ 32'o50617;
|
||||
7'h33: vJlF3gash = 32'o23622 ^ 32'o23623;
|
||||
7'o104: vJlF3gash = 32'o67512 ^ 32'd28491;
|
||||
7'd48: vJlF3gash = 32'h7fa0 ^ 32'b00000000000000000001110011100001 ^ 32'o61500;
|
||||
7'd65: vJlF3gash = 32'h7155 ^ 32'b00000000000000000111000101010100;
|
||||
7'h70: vJlF3gash = 32'b00000000000000000111010010000100 ^ 32'b00000000000000000010010110100110 ^ 32'o50443;
|
||||
7'd2: vJlF3gash = 32'd9837 ^ 32'h134f ^ 32'o32443;
|
||||
7'd24: vJlF3gash = 32'o12014 ^ 32'o67553 ^ 32'd31590;
|
||||
7'b0001100: vJlF3gash = 32'o17102 ^ 32'd7746;
|
||||
7'b0010110: vJlF3gash = 32'b00000000000000000100000000010011 ^ 32'h63db ^ 32'b00000000000000000010001111001001;
|
||||
7'd0: vJlF3gash = 32'h5274 ^ 32'd1982 ^ 32'h55ca;
|
||||
7'd49: vJlF3gash = 32'd10652 ^ 32'o61251 ^ 32'h4b34;
|
||||
7'o121: vJlF3gash = 32'd3856 ^ 32'o7421;
|
||||
7'b0010010: vJlF3gash = 32'o67045 ^ 32'd1778 ^ 32'h68d6;
|
||||
7'd69: vJlF3gash = 32'o41503 ^ 32'b00000000000000000100001101000010;
|
||||
7'd91: vJlF3gash = 32'b00000000000000000011000011100010 ^ 32'h30e3;
|
||||
7'h6: vJlF3gash = 32'h785b ^ 32'h785a;
|
||||
7'b1001000: vJlF3gash = 32'b00000000000000000100000100111000 ^ 32'h4139;
|
||||
7'b1011101: vJlF3gash = 32'b00000000000000000000010011011010 ^ 32'h1ae2 ^ 32'd7737;
|
||||
7'b0001001: vJlF3gash = 32'o20114 ^ 32'd1880 ^ 32'b00000000000000000010011100010100;
|
||||
7'd77: vJlF3gash = 32'd15650 ^ 32'h3d23;
|
||||
7'h37: vJlF3gash = 32'b00000000000000000100111110000011 ^ 32'b00000000000000000100111110000010;
|
||||
7'o52: vJlF3gash = 32'o54671 ^ 32'h3467 ^ 32'b00000000000000000110110111011111;
|
||||
7'o44: vJlF3gash = 32'b00000000000000000000100111010110 ^ 32'b00000000000000000000100111010110;
|
||||
7'o145: vJlF3gash = 32'h28b6 ^ 32'd10423;
|
||||
7'h49: vJlF3gash = 32'd27444 ^ 32'h4a56 ^ 32'd8547;
|
||||
7'o154: vJlF3gash = 32'o21226 ^ 32'o44275 ^ 32'd27178;
|
||||
7'b0000011: vJlF3gash = 32'b00000000000000000101000001101001 ^ 32'b00000000000000000101100100010111 ^ 32'h97f;
|
||||
7'd5: vJlF3gash = 32'd20062 ^ 32'h4e5e;
|
||||
7'd106: vJlF3gash = 32'd9377 ^ 32'o73545 ^ 32'd21445;
|
||||
7'b0001000: vJlF3gash = 32'h4c54 ^ 32'b00000000000000000100110001010100;
|
||||
7'd38: vJlF3gash = 32'd1995 ^ 32'h7ca;
|
||||
7'h28: vJlF3gash = 32'd23492 ^ 32'o61417 ^ 32'b00000000000000000011100011001011;
|
||||
7'b1010100: vJlF3gash = 32'b00000000000000000011011100000010 ^ 32'h1b48 ^ 32'o26113;
|
||||
7'd103: vJlF3gash = 32'o23254 ^ 32'b00000000000000000010011000001100 ^ 32'd161;
|
||||
7'b0110010: vJlF3gash = 32'o51631 ^ 32'd21400;
|
||||
7'b0101011: vJlF3gash = 32'h3b6 ^ 32'h3b7;
|
||||
7'd26: vJlF3gash = 32'b00000000000000000001001000000001 ^ 32'o40304 ^ 32'd21188;
|
||||
7'h1f: vJlF3gash = 32'b00000000000000000000110111101011 ^ 32'h6375 ^ 32'h6e9f;
|
||||
7'h3e: vJlF3gash = 32'h4963 ^ 32'b00000000000000000011111100101011 ^ 32'd30281;
|
||||
7'd98: vJlF3gash = 32'b00000000000000000000000011000101 ^ 32'd15763 ^ 32'd15703;
|
||||
7'o132: vJlF3gash = 32'o56351 ^ 32'o56350;
|
||||
7'h21: vJlF3gash = 32'o60744 ^ 32'b00000000000000000110111100000101 ^ 32'o7341;
|
||||
7'h1: vJlF3gash = 32'd31856 ^ 32'h7c70;
|
||||
7'h50: vJlF3gash = 32'o62424 ^ 32'd15967 ^ 32'd23370;
|
||||
7'o56: vJlF3gash = 32'h1ab ^ 32'b00000000000000000000000110101010;
|
||||
7'd56: vJlF3gash = 32'b00000000000000000010001101111100 ^ 32'o21575;
|
||||
7'o107: vJlF3gash = 32'o13473 ^ 32'd16069 ^ 32'o24777;
|
||||
7'h1e: vJlF3gash = 32'o61757 ^ 32'd25582;
|
||||
7'd58: vJlF3gash = 32'h7775 ^ 32'o61103 ^ 32'b00000000000000000001010100110111;
|
||||
7'h19: vJlF3gash = 32'h6805 ^ 32'd26628;
|
||||
7'o176: vJlF3gash = 32'b00000000000000000011111001000111 ^ 32'b00000000000000000100011111110001 ^ 32'd31159;
|
||||
7'b0101111: vJlF3gash = 32'h55a4 ^ 32'o52644;
|
||||
7'h43: vJlF3gash = 32'h454d ^ 32'b00000000000000000110000111011101 ^ 32'h2491;
|
||||
7'd121: vJlF3gash = 32'b00000000000000000100001001011101 ^ 32'b00000000000000000010010101000000 ^ 32'd26396;
|
||||
7'd23: vJlF3gash = 32'd27151 ^ 32'o65016;
|
||||
7'hf: vJlF3gash = 32'b00000000000000000100011000110011 ^ 32'h4632;
|
||||
7'b1110100: vJlF3gash = 32'd7286 ^ 32'd7287;
|
||||
7'h58: vJlF3gash = 32'b00000000000000000000100011110000 ^ 32'o74061 ^ 32'd28864;
|
||||
7'h7b: vJlF3gash = 32'h1655 ^ 32'o13124;
|
||||
7'o55: vJlF3gash = 32'h57ae ^ 32'd22446;
|
||||
7'o127: vJlF3gash = 32'o57363 ^ 32'd24306;
|
||||
7'o13: vJlF3gash = 32'h7445 ^ 32'h12e9 ^ 32'd26285;
|
||||
7'd60: vJlF3gash = 32'd30058 ^ 32'b00000000000000000111010101101011;
|
||||
7'd104: vJlF3gash = 32'o50250 ^ 32'h6bd4 ^ 32'o35575;
|
||||
7'h73: vJlF3gash = 32'h7279 ^ 32'b00000000000000000111011011111111 ^ 32'o2207;
|
||||
7'd107: vJlF3gash = 32'd20125 ^ 32'h3d2d ^ 32'o71661;
|
||||
7'b1001111: vJlF3gash = 32'd15127 ^ 32'b00000000000000000011101100010110;
|
||||
7'h1d: vJlF3gash = 32'hff6 ^ 32'o11034 ^ 32'd7659;
|
||||
7'b1010011: vJlF3gash = 32'hd05 ^ 32'b00000000000000000000110100000100;
|
||||
7'o122: vJlF3gash = 32'd25353 ^ 32'd4024 ^ 32'h6cb0;
|
||||
7'd39: vJlF3gash = 32'h31c8 ^ 32'b00000000000000000001110101000111 ^ 32'd11406;
|
||||
7'h36: vJlF3gash = 32'b00000000000000000010010110000111 ^ 32'd9606;
|
||||
7'h1c: vJlF3gash = 32'h65fa ^ 32'o62773;
|
||||
7'o170: vJlF3gash = 32'h6e64 ^ 32'o14660 ^ 32'o73725;
|
||||
7'd63: vJlF3gash = 32'h735f ^ 32'h735f;
|
||||
7'o125: vJlF3gash = 32'h60fe ^ 32'o60377;
|
||||
7'd19: vJlF3gash = 32'b00000000000000000001100000100001 ^ 32'o14040;
|
||||
7'd125: vJlF3gash = 32'o65116 ^ 32'd27214;
|
||||
7'b1101111: vJlF3gash = 32'd8331 ^ 32'o15026 ^ 32'd15005;
|
||||
7'o25: vJlF3gash = 32'd5655 ^ 32'd5654;
|
||||
7'o16: vJlF3gash = 32'o16067 ^ 32'o16066;
|
||||
7'h6d: vJlF3gash = 32'o46222 ^ 32'h4c92;
|
||||
7'o161: vJlF3gash = 32'o17201 ^ 32'h6b6e ^ 32'd30190;
|
||||
7'b0010000: vJlF3gash = 32'd28720 ^ 32'd13722 ^ 32'h45ab;
|
||||
7'b1001011: vJlF3gash = 32'o64451 ^ 32'd7086 ^ 32'd29318;
|
||||
7'h22: vJlF3gash = 32'b00000000000000000011010111011101 ^ 32'h35dc;
|
||||
7'b1101110: vJlF3gash = 32'b00000000000000000111011010001111 ^ 32'h768e;
|
||||
7'o141: vJlF3gash = 32'd22216 ^ 32'o73713 ^ 32'o20402;
|
||||
7'o102: vJlF3gash = 32'o15521 ^ 32'd7188 ^ 32'o3504;
|
||||
7'o54: vJlF3gash = 32'd11698 ^ 32'b00000000000000000011111111111000 ^ 32'd4682;
|
||||
7'd100: vJlF3gash = 32'h7eba ^ 32'h7ebb;
|
||||
7'd94: vJlF3gash = 32'b00000000000000000010111011010111 ^ 32'b00000000000000000010111011010110;
|
||||
7'd37: vJlF3gash = 32'b00000000000000000011001111010010 ^ 32'b00000000000000000011001111010010;
|
||||
7'b0111101: vJlF3gash = 32'd8038 ^ 32'o17546;
|
||||
7'b1110010: vJlF3gash = 32'b00000000000000000100100001111101 ^ 32'h487c;
|
||||
7'b0111011: vJlF3gash = 32'd8561 ^ 32'd8560;
|
||||
7'd92: vJlF3gash = 32'b00000000000000000101101011011110 ^ 32'd23263;
|
||||
7'd4: vJlF3gash = 32'o22142 ^ 32'd25767 ^ 32'b00000000000000000100000011000101;
|
||||
7'd89: vJlF3gash = 32'b00000000000000000011001011101100 ^ 32'd15865 ^ 32'o7424;
|
||||
7'b1110110: vJlF3gash = 32'd6763 ^ 32'o15152;
|
||||
7'b1000000: vJlF3gash = 32'd7516 ^ 32'd19132 ^ 32'o53741;
|
||||
7'b1010110: vJlF3gash = 32'hafb ^ 32'hafa;
|
||||
7'hd: vJlF3gash = 32'o71073 ^ 32'h6441 ^ 32'h167a;
|
||||
7'h5f: vJlF3gash = 32'b00000000000000000101100011010011 ^ 32'o54322;
|
||||
7'b1111100: vJlF3gash = 32'h4052 ^ 32'b00000000000000000111011010011001 ^ 32'd14026;
|
||||
7'd35: vJlF3gash = 32'd24537 ^ 32'o40136 ^ 32'o17606;
|
||||
7'd122: vJlF3gash = 32'b00000000000000000110110001011001 ^ 32'o65410 ^ 32'o3520;
|
||||
endcase
|
||||
end
|
||||
|
||||
logic [31:0] qaz6wx1C86;
|
||||
|
||||
always_ff @(posedge clk_i) begin
|
||||
if(zZF) begin
|
||||
busy <= '0;
|
||||
end else begin
|
||||
busy <= vJlF3gash[32'b00000000000000000110010010101011 ^ 32'd21989 ^ 32'o30516];
|
||||
end
|
||||
end
|
||||
|
||||
logic [31:0] q5Upj3TRGS8nkfV;
|
||||
always_comb begin
|
||||
case ({wKSnwVGWV, VICULOkZm, valid, eY8BfVPWv, XJhsywc8r, r0UH06pov5})
|
||||
6'd57: qaz6wx1C86 = 32'b00000000000000000100110110100011 ^ 32'd5756 ^ 32'b00000000000000000101101111011110;
|
||||
6'o32: qaz6wx1C86 = 32'h122b ^ 32'o35305 ^ 32'd10478;
|
||||
6'o70: qaz6wx1C86 = 32'h23a6 ^ 32'd9126;
|
||||
6'h17: qaz6wx1C86 = 32'b00000000000000000001010000110110 ^ 32'o64555 ^ 32'b00000000000000000111110101011011;
|
||||
6'd48: qaz6wx1C86 = 32'b00000000000000000111111111001010 ^ 32'b00000000000000000001011011100010 ^ 32'h6928;
|
||||
6'b100010: qaz6wx1C86 = 32'b00000000000000000011011000000111 ^ 32'd29847 ^ 32'b00000000000000000100001010010000;
|
||||
6'b101000: qaz6wx1C86 = 32'h5eb ^ 32'h5eb;
|
||||
6'o34: qaz6wx1C86 = 32'b00000000000000000001000000100001 ^ 32'o6036 ^ 32'd7231;
|
||||
6'd17: qaz6wx1C86 = 32'h4453 ^ 32'o35453 ^ 32'o77570;
|
||||
6'h3b: qaz6wx1C86 = 32'h4b98 ^ 32'b00000000000000000110011111010100 ^ 32'b00000000000000000010110001001100;
|
||||
6'o25: qaz6wx1C86 = 32'h1641 ^ 32'o14024 ^ 32'b00000000000000000000111001010101;
|
||||
6'o44: qaz6wx1C86 = 32'd13309 ^ 32'b00000000000000000100010111110000 ^ 32'b00000000000000000111011000001101;
|
||||
6'h27: qaz6wx1C86 = 32'o30762 ^ 32'b00000000000000000001011101001000 ^ 32'b00000000000000000010011010111011;
|
||||
6'o41: qaz6wx1C86 = 32'd3083 ^ 32'b00000000000000000000110000001010;
|
||||
6'o23: qaz6wx1C86 = 32'b00000000000000000100001001001000 ^ 32'hc84 ^ 32'o47314;
|
||||
6'd29: qaz6wx1C86 = 32'b00000000000000000011101000011101 ^ 32'b00000000000000000011101000011101;
|
||||
6'd32: qaz6wx1C86 = 32'd25103 ^ 32'o64407 ^ 32'hb08;
|
||||
6'o74: qaz6wx1C86 = 32'o72624 ^ 32'h7594;
|
||||
6'b101001: qaz6wx1C86 = 32'd12263 ^ 32'b00000000000000000110100010100001 ^ 32'b00000000000000000100011101000111;
|
||||
6'o17: qaz6wx1C86 = 32'd28762 ^ 32'o70132;
|
||||
6'd53: qaz6wx1C86 = 32'b00000000000000000111101110110101 ^ 32'b00000000000000000011100110010011 ^ 32'o41047;
|
||||
6'h10: qaz6wx1C86 = 32'd6743 ^ 32'o15127;
|
||||
6'b000100: qaz6wx1C86 = 32'd9356 ^ 32'd24233 ^ 32'o75045;
|
||||
6'b010100: qaz6wx1C86 = 32'h6c45 ^ 32'o66105;
|
||||
6'b111111: qaz6wx1C86 = 32'o16606 ^ 32'd17597 ^ 32'h593b;
|
||||
6'd42: qaz6wx1C86 = 32'o54744 ^ 32'd23012;
|
||||
6'b011000: qaz6wx1C86 = 32'o37063 ^ 32'b00000000000000000011111000110011;
|
||||
6'b101111: qaz6wx1C86 = 32'b00000000000000000101010111001110 ^ 32'd21967;
|
||||
6'b111110: qaz6wx1C86 = 32'b00000000000000000100100110001101 ^ 32'b00000000000000000011100100101101 ^ 32'd28832;
|
||||
6'o62: qaz6wx1C86 = 32'h7dc0 ^ 32'b00000000000000000110100000111010 ^ 32'h15fa;
|
||||
6'o53: qaz6wx1C86 = 32'b00000000000000000000001111100000 ^ 32'd29745 ^ 32'h77d0;
|
||||
6'o16: qaz6wx1C86 = 32'd7265 ^ 32'd7265;
|
||||
6'b011111: qaz6wx1C86 = 32'd14354 ^ 32'h3812;
|
||||
6'h9: qaz6wx1C86 = 32'b00000000000000000010000001110111 ^ 32'd8311;
|
||||
6'b100101: qaz6wx1C86 = 32'd24057 ^ 32'o5670 ^ 32'o53100;
|
||||
6'h1: qaz6wx1C86 = 32'h7c9b ^ 32'b00000000000000000111110010011011;
|
||||
6'h12: qaz6wx1C86 = 32'h6e4f ^ 32'd28239;
|
||||
6'o66: qaz6wx1C86 = 32'h4fae ^ 32'd17699 ^ 32'b00000000000000000000101010001101;
|
||||
6'o2: qaz6wx1C86 = 32'h5094 ^ 32'h5094;
|
||||
6'h8: qaz6wx1C86 = 32'd30330 ^ 32'h3b92 ^ 32'b00000000000000000100110111101000;
|
||||
6'd51: qaz6wx1C86 = 32'd10172 ^ 32'd10172;
|
||||
6'b101100: qaz6wx1C86 = 32'o26734 ^ 32'b00000000000000000011100111111001 ^ 32'd5157;
|
||||
6'h34: qaz6wx1C86 = 32'b00000000000000000101000110111000 ^ 32'd29643 ^ 32'b00000000000000000010001001110011;
|
||||
6'd55: qaz6wx1C86 = 32'h79aa ^ 32'h79aa;
|
||||
6'b010110: qaz6wx1C86 = 32'h403d ^ 32'h403d;
|
||||
6'b111101: qaz6wx1C86 = 32'd8081 ^ 32'h7365 ^ 32'h6cf5;
|
||||
6'd27: qaz6wx1C86 = 32'd26148 ^ 32'b00000000000000000100011001010110 ^ 32'h2072;
|
||||
6'h7: qaz6wx1C86 = 32'o46176 ^ 32'h4c7e;
|
||||
6'h2e: qaz6wx1C86 = 32'b00000000000000000010101111010010 ^ 32'd11218;
|
||||
6'o5: qaz6wx1C86 = 32'o47211 ^ 32'b00000000000000000100111010001001;
|
||||
6'o55: qaz6wx1C86 = 32'h1d5 ^ 32'd17801 ^ 32'h445d;
|
||||
6'b000110: qaz6wx1C86 = 32'b00000000000000000111100010000101 ^ 32'o65071 ^ 32'b00000000000000000001001010111100;
|
||||
6'd25: qaz6wx1C86 = 32'o64057 ^ 32'o64057;
|
||||
6'd11: qaz6wx1C86 = 32'b00000000000000000001111001101100 ^ 32'o17154;
|
||||
6'o72: qaz6wx1C86 = 32'o20634 ^ 32'h220c ^ 32'h390;
|
||||
6'd35: qaz6wx1C86 = 32'o60004 ^ 32'o35137 ^ 32'o55132;
|
||||
6'h3: qaz6wx1C86 = 32'h7a90 ^ 32'o14341 ^ 32'b00000000000000000110001001110001;
|
||||
6'h0: qaz6wx1C86 = 32'h529e ^ 32'b00000000000000000101001010011110;
|
||||
6'o14: qaz6wx1C86 = 32'h4869 ^ 32'o14172 ^ 32'h5013;
|
||||
6'd49: qaz6wx1C86 = 32'b00000000000000000101001111000011 ^ 32'h53c2;
|
||||
6'o12: qaz6wx1C86 = 32'b00000000000000000100101001110011 ^ 32'b00000000000000000100101001110011;
|
||||
6'b100110: qaz6wx1C86 = 32'h7f6 ^ 32'b00000000000000000000011111110110;
|
||||
6'd13: qaz6wx1C86 = 32'd29285 ^ 32'h5e43 ^ 32'd11302;
|
||||
6'b011110: qaz6wx1C86 = 32'o62031 ^ 32'b00000000000000000001011110101110 ^ 32'h73b7;
|
||||
endcase
|
||||
end
|
||||
|
||||
assign r0UH06pov5 = UmLX == (32'o32572 ^ 32'h357a);
|
||||
|
||||
always_ff @(posedge clk_i) begin
|
||||
if(zZF) begin
|
||||
valid <= '0;
|
||||
end else begin
|
||||
valid <= qaz6wx1C86[32'o46742 ^ 32'o24471 ^ 32'h64db];
|
||||
end
|
||||
end
|
||||
|
||||
logic VVZKlkqbq;
|
||||
assign VVZKlkqbq = UmLX == (32'h73e2 ^ 32'b00000000000000000001101001001000 ^ 32'o64652);
|
||||
always_comb begin
|
||||
case ({wKSnwVGWV, VICULOkZm, VVZKlkqbq, XJhsywc8r})
|
||||
4'b1101: q5Upj3TRGS8nkfV = 32'h5ea0 ^ 32'hed25493;
|
||||
4'd3: q5Upj3TRGS8nkfV = 32'd15044 ^ 32'h3f17 ^ 32'b01011110010110011010111010001111;
|
||||
4'h6: q5Upj3TRGS8nkfV = 32'o34271 ^ 32'd4207 ^ 32'd832212430;
|
||||
4'o13: q5Upj3TRGS8nkfV = 32'o5247 ^ 32'h6d58 ^ 32'h6f961b2b;
|
||||
4'h0: q5Upj3TRGS8nkfV = 32'b00000000000000000001001011010010 ^ 32'o14336040213;
|
||||
4'd7: q5Upj3TRGS8nkfV = 32'd25270 ^ 32'h1bc519ae;
|
||||
4'o4: q5Upj3TRGS8nkfV = 32'd25792 ^ 32'b01010100100001001010111011011101;
|
||||
4'ha: q5Upj3TRGS8nkfV = 32'h60ab ^ 32'b00011110001100100000110100000110;
|
||||
4'hc: q5Upj3TRGS8nkfV = 32'h34a4 ^ 32'd13088 ^ 32'd102164953;
|
||||
4'o2: q5Upj3TRGS8nkfV = 32'b00000000000000000001000011001000 ^ 32'd1470131080;
|
||||
4'd5: q5Upj3TRGS8nkfV = 32'd3773 ^ 32'o14677436470;
|
||||
4'o17: q5Upj3TRGS8nkfV = 32'o31231 ^ 32'b01100100111110100100110000011011;
|
||||
4'b0001: q5Upj3TRGS8nkfV = 32'o36317 ^ 32'h6dbe ^ 32'b01010001100000101111011101101001;
|
||||
4'h8: q5Upj3TRGS8nkfV = 32'd3250 ^ 32'h1c00 ^ 32'h42d7eb62;
|
||||
4'b1110: q5Upj3TRGS8nkfV = 32'd2205 ^ 32'h3eb1 ^ 32'h74c58ad8;
|
||||
4'd9: q5Upj3TRGS8nkfV = 32'd13999 ^ 32'd25032 ^ 32'd1908358519;
|
||||
endcase
|
||||
end
|
||||
|
||||
logic [31:0] eBnHjxu3POlmkT7;
|
||||
assign XJhsywc8r = FFDK4sD9m7 == (32'o26420 ^ 32'b00000000000000000011010010011010 ^ 32'h198b);
|
||||
always_comb begin
|
||||
case ({wKSnwVGWV, VICULOkZm, VVZKlkqbq, XJhsywc8r})
|
||||
4'd13: eBnHjxu3POlmkT7 = 32'o62772 ^ 32'd25234 ^ 32'd619253058;
|
||||
4'h9: eBnHjxu3POlmkT7 = 32'o37011 ^ 32'h78b64f90;
|
||||
4'h5: eBnHjxu3POlmkT7 = 32'd5655 ^ 32'd13393 ^ 32'o14774560176;
|
||||
4'b0011: eBnHjxu3POlmkT7 = 32'h421e ^ 32'o24300 ^ 32'h33beeb7f;
|
||||
4'b1110: eBnHjxu3POlmkT7 = 32'hff7 ^ 32'b00000000000000000010100001011010 ^ 32'b01111101110010100011111011111010;
|
||||
4'h7: eBnHjxu3POlmkT7 = 32'o65020 ^ 32'o16034426322;
|
||||
4'b0100: eBnHjxu3POlmkT7 = 32'h6c1b ^ 32'd1616384739;
|
||||
4'd15: eBnHjxu3POlmkT7 = 32'b00000000000000000011100111110011 ^ 32'h6d8d37c6;
|
||||
4'h2: eBnHjxu3POlmkT7 = 32'o14042 ^ 32'd25336 ^ 32'o2654636133;
|
||||
4'b0110: eBnHjxu3POlmkT7 = 32'b00000000000000000100000000010100 ^ 32'o75031 ^ 32'h1a1b1874;
|
||||
4'b0001: eBnHjxu3POlmkT7 = 32'b00000000000000000100010000101001 ^ 32'b00000000000000000101011101101000 ^ 32'h2ef4b8b3;
|
||||
4'd8: eBnHjxu3POlmkT7 = 32'h140c ^ 32'b00000000000000000000010110101001 ^ 32'b01101100000110101011001000011111;
|
||||
4'hb: eBnHjxu3POlmkT7 = 32'b00000000000000000001001000000010 ^ 32'b00000000000000000101011100000010 ^ 32'b00101111110001001001110111011101;
|
||||
4'b1010: eBnHjxu3POlmkT7 = 32'o64005 ^ 32'd1843325073;
|
||||
4'h0: eBnHjxu3POlmkT7 = 32'h1a2d ^ 32'd734609828;
|
||||
4'd12: eBnHjxu3POlmkT7 = 32'b00000000000000000011101111111110 ^ 32'b01110001100110001001111110011100;
|
||||
endcase
|
||||
end
|
||||
|
||||
always_ff @(posedge clk_i) begin
|
||||
if(zZF) begin
|
||||
data <= '0;
|
||||
end else if (q5Upj3TRGS8nkfV[32'd23241 ^ 32'b00000000000000000101101011001000]) begin
|
||||
data <= '0;
|
||||
end else if(eBnHjxu3POlmkT7[32'o72553 ^ 32'b00000000000000000111010101101001]) begin
|
||||
data <= FFDK4sD9m7;
|
||||
end
|
||||
else begin
|
||||
data <= data;
|
||||
end
|
||||
end
|
||||
|
||||
assign fcS5S0IailtPh = UmLX == (32'o13330 ^ 32'o43045 ^ 32'd20721);
|
||||
logic [31:0] SuhrzWcGiwP2SmTaYCK;
|
||||
always_comb begin
|
||||
case ({wKSnwVGWV, fcS5S0IailtPh, VICULOkZm, XJhsywc8r})
|
||||
4'd5: SuhrzWcGiwP2SmTaYCK = 32'h664e ^ 32'o31120 ^ 32'h121a79bb;
|
||||
4'h4: SuhrzWcGiwP2SmTaYCK = 32'h3c52 ^ 32'o16325204045;
|
||||
4'h1: SuhrzWcGiwP2SmTaYCK = 32'd15965 ^ 32'd2111526847;
|
||||
4'd13: SuhrzWcGiwP2SmTaYCK = 32'd13874 ^ 32'b00000000000000000110000010010010 ^ 32'b01111110111010011111001101110001;
|
||||
4'd8: SuhrzWcGiwP2SmTaYCK = 32'b00000000000000000110010001000100 ^ 32'o1651 ^ 32'h39cc7d3b;
|
||||
4'hc: SuhrzWcGiwP2SmTaYCK = 32'o6065 ^ 32'd343741462;
|
||||
4'b1011: SuhrzWcGiwP2SmTaYCK = 32'h6239 ^ 32'h5501 ^ 32'o6775127066;
|
||||
4'd10: SuhrzWcGiwP2SmTaYCK = 32'o34075 ^ 32'o6174646137;
|
||||
4'd3: SuhrzWcGiwP2SmTaYCK = 32'b00000000000000000001001001010110 ^ 32'h26c0 ^ 32'd368251297;
|
||||
4'd2: SuhrzWcGiwP2SmTaYCK = 32'h6859 ^ 32'b00000110101101000010000000111010;
|
||||
4'o7: SuhrzWcGiwP2SmTaYCK = 32'h3a47 ^ 32'd1161903040;
|
||||
4'he: SuhrzWcGiwP2SmTaYCK = 32'b00000000000000000000101000101011 ^ 32'o17563345053;
|
||||
4'h9: SuhrzWcGiwP2SmTaYCK = 32'o7100 ^ 32'o15764422501;
|
||||
4'o6: SuhrzWcGiwP2SmTaYCK = 32'd4171 ^ 32'd30744 ^ 32'd6904852;
|
||||
4'd15: SuhrzWcGiwP2SmTaYCK = 32'o32047 ^ 32'o30752 ^ 32'b01110010010101100100010111100000;
|
||||
4'd0: SuhrzWcGiwP2SmTaYCK = 32'h1460 ^ 32'h5567 ^ 32'd882296647;
|
||||
endcase
|
||||
end
|
||||
|
||||
logic [31:0] FHGBch0qBHxqcbX8Dlb;
|
||||
always_comb begin
|
||||
case ({wKSnwVGWV, fcS5S0IailtPh, VICULOkZm, XJhsywc8r})
|
||||
4'd12: FHGBch0qBHxqcbX8Dlb = 32'b00000000000000000000110001001011 ^ 32'h331f09ba;
|
||||
4'd15: FHGBch0qBHxqcbX8Dlb = 32'd2624 ^ 32'b00111010001111100110100101010111;
|
||||
4'd0: FHGBch0qBHxqcbX8Dlb = 32'h6a79 ^ 32'o11016714577;
|
||||
4'h4: FHGBch0qBHxqcbX8Dlb = 32'o36147 ^ 32'b00000110001011010101001100101101;
|
||||
4'd14: FHGBch0qBHxqcbX8Dlb = 32'd24643 ^ 32'h635a ^ 32'h36813882;
|
||||
4'ha: FHGBch0qBHxqcbX8Dlb = 32'b00000000000000000011100001010010 ^ 32'b00000000000000000100110000111010 ^ 32'o2211317713;
|
||||
4'b1011: FHGBch0qBHxqcbX8Dlb = 32'o61116 ^ 32'h1202 ^ 32'h21745a02;
|
||||
4'o2: FHGBch0qBHxqcbX8Dlb = 32'd26734 ^ 32'o16770 ^ 32'h4fc6d1d5;
|
||||
4'b0101: FHGBch0qBHxqcbX8Dlb = 32'o63144 ^ 32'o67521 ^ 32'h714246f3;
|
||||
4'b0110: FHGBch0qBHxqcbX8Dlb = 32'o10140 ^ 32'h427bb924;
|
||||
4'h1: FHGBch0qBHxqcbX8Dlb = 32'o12166 ^ 32'h1268 ^ 32'b01101001010000011001010010110110;
|
||||
4'd13: FHGBch0qBHxqcbX8Dlb = 32'h3647 ^ 32'o16622 ^ 32'b01110110001010000111000100101100;
|
||||
4'h9: FHGBch0qBHxqcbX8Dlb = 32'b00000000000000000000111001010101 ^ 32'b01001011011110100011011100111100;
|
||||
4'h7: FHGBch0qBHxqcbX8Dlb = 32'o35134 ^ 32'h459eecf4;
|
||||
4'h8: FHGBch0qBHxqcbX8Dlb = 32'd25689 ^ 32'o40251 ^ 32'h3a6f4fd0;
|
||||
4'o3: FHGBch0qBHxqcbX8Dlb = 32'd4715 ^ 32'h63c1 ^ 32'b01001111110001011111010111000100;
|
||||
endcase
|
||||
end
|
||||
|
||||
always_ff @(posedge clk_i) begin
|
||||
if(zZF) begin
|
||||
baudrate <= '0;
|
||||
end else if (SuhrzWcGiwP2SmTaYCK[32'd3188 ^ 32'b00000000000000000000110001110111]) begin
|
||||
baudrate <= '0;
|
||||
end
|
||||
else if(FHGBch0qBHxqcbX8Dlb[32'b00000000000000000000110101101111 ^ 32'h787d ^ 32'o72426]) begin
|
||||
baudrate <= FFDK4sD9m7;
|
||||
end
|
||||
else begin
|
||||
baudrate <= baudrate;
|
||||
end
|
||||
end
|
||||
|
||||
logic [31:0] WLGbSSV5YzHmlpmqLI;
|
||||
|
||||
logic [31:0] b5l5UfftZRDTX1AD2;
|
||||
logic m4Js9aFV4Us;
|
||||
always_comb begin
|
||||
case ({wKSnwVGWV, m4Js9aFV4Us, VICULOkZm, XJhsywc8r})
|
||||
4'd14: b5l5UfftZRDTX1AD2 = 32'b00000000000000000110010110000000 ^ 32'd295811877;
|
||||
4'b0111: b5l5UfftZRDTX1AD2 = 32'h159d ^ 32'o12602005631;
|
||||
4'd6: b5l5UfftZRDTX1AD2 = 32'h6ba0 ^ 32'o11557450265;
|
||||
4'd2: b5l5UfftZRDTX1AD2 = 32'h43af ^ 32'd17152 ^ 32'h22f4f996;
|
||||
4'b1101: b5l5UfftZRDTX1AD2 = 32'b00000000000000000011101110000100 ^ 32'h1e89d3c;
|
||||
4'o13: b5l5UfftZRDTX1AD2 = 32'o63613 ^ 32'o15557237564;
|
||||
4'd1: b5l5UfftZRDTX1AD2 = 32'd6578 ^ 32'o2423507117;
|
||||
4'b1111: b5l5UfftZRDTX1AD2 = 32'b00000000000000000000111101111101 ^ 32'd5106 ^ 32'b00101010110111011010011011110000;
|
||||
4'h4: b5l5UfftZRDTX1AD2 = 32'h17a8 ^ 32'd1199459581;
|
||||
4'o5: b5l5UfftZRDTX1AD2 = 32'b00000000000000000100000110100100 ^ 32'b00000000000000000001010001011000 ^ 32'h2acd6c79;
|
||||
4'd3: b5l5UfftZRDTX1AD2 = 32'h6dab ^ 32'd2104322542;
|
||||
4'o10: b5l5UfftZRDTX1AD2 = 32'o64626 ^ 32'd407919674;
|
||||
4'b1100: b5l5UfftZRDTX1AD2 = 32'h1187 ^ 32'd17050 ^ 32'b00100101100100001010000100001000;
|
||||
4'h9: b5l5UfftZRDTX1AD2 = 32'd5010 ^ 32'd28993 ^ 32'b01000000000011010011100101100111;
|
||||
4'b0000: b5l5UfftZRDTX1AD2 = 32'o67666 ^ 32'o33557 ^ 32'd1228297272;
|
||||
4'o12: b5l5UfftZRDTX1AD2 = 32'b00000000000000000011110110001110 ^ 32'b00000000000000000011011100001001 ^ 32'o15300071342;
|
||||
endcase
|
||||
end
|
||||
|
||||
logic [31:0] fhHTYz8JNP73GgkZp;
|
||||
always_comb begin
|
||||
case ({wKSnwVGWV, m4Js9aFV4Us, VICULOkZm, XJhsywc8r})
|
||||
4'd6: fhHTYz8JNP73GgkZp = 32'o47241 ^ 32'o62175 ^ 32'd458013848;
|
||||
4'ha: fhHTYz8JNP73GgkZp = 32'b00000000000000000111011010010011 ^ 32'b00110011011111001110001010000110;
|
||||
4'o7: fhHTYz8JNP73GgkZp = 32'b00000000000000000111100010011110 ^ 32'h7dcc2c86;
|
||||
4'o10: fhHTYz8JNP73GgkZp = 32'h229a ^ 32'b00000000000000000111000000001110 ^ 32'h1202b248;
|
||||
4'o13: fhHTYz8JNP73GgkZp = 32'b00000000000000000010000010001111 ^ 32'b00000000000000000100000101100110 ^ 32'o13251517010;
|
||||
4'b0000: fhHTYz8JNP73GgkZp = 32'o51267 ^ 32'b00000000000000000100000111001100 ^ 32'd110940771;
|
||||
4'd1: fhHTYz8JNP73GgkZp = 32'o76263 ^ 32'h3675cebe;
|
||||
4'h4: fhHTYz8JNP73GgkZp = 32'o75250 ^ 32'b00011100000101100010111010111001;
|
||||
4'b1110: fhHTYz8JNP73GgkZp = 32'd18561 ^ 32'd1483794795;
|
||||
4'h9: fhHTYz8JNP73GgkZp = 32'd19606 ^ 32'o32726 ^ 32'd980015896;
|
||||
4'o3: fhHTYz8JNP73GgkZp = 32'd20652 ^ 32'b00000000000000000001001100100101 ^ 32'd868638757;
|
||||
4'h2: fhHTYz8JNP73GgkZp = 32'o23260 ^ 32'h19035575;
|
||||
4'hd: fhHTYz8JNP73GgkZp = 32'd7812 ^ 32'b00000000000000000001001010111111 ^ 32'o16052401775;
|
||||
4'b1100: fhHTYz8JNP73GgkZp = 32'b00000000000000000100101010001100 ^ 32'o13236356763;
|
||||
4'o5: fhHTYz8JNP73GgkZp = 32'o22245 ^ 32'b00000111001111101010111000101001;
|
||||
4'o17: fhHTYz8JNP73GgkZp = 32'b00000000000000000111001001111101 ^ 32'd7759 ^ 32'b00100111001011110111011100110001;
|
||||
endcase
|
||||
end
|
||||
assign m4Js9aFV4Us = UmLX == (32'd22117 ^ 32'd32555 ^ 32'd10590);
|
||||
|
||||
always_ff @(posedge clk_i) begin
|
||||
if(zZF) begin
|
||||
parity_en <= '0;
|
||||
end else if (b5l5UfftZRDTX1AD2[32'h7906 ^ 32'h12c0 ^ 32'h6bc7]) begin
|
||||
parity_en <= '0;
|
||||
end
|
||||
else if(fhHTYz8JNP73GgkZp[32'o1770 ^ 32'o1771]) begin
|
||||
parity_en <= FFDK4sD9m7;
|
||||
end
|
||||
else begin
|
||||
parity_en <= parity_en;
|
||||
end
|
||||
end
|
||||
|
||||
logic P0EEllcI4VCU;
|
||||
assign P0EEllcI4VCU = UmLX == (32'o62726 ^ 32'd26050);
|
||||
always_comb begin
|
||||
case ({m4Js9aFV4Us, P0EEllcI4VCU, VICULOkZm, XJhsywc8r, wKSnwVGWV, fcS5S0IailtPh})
|
||||
6'b010011: WLGbSSV5YzHmlpmqLI = 32'h7a7f ^ 32'o6421703407;
|
||||
6'h1a: WLGbSSV5YzHmlpmqLI = 32'b00000000000000000100101001100010 ^ 32'h62321c5f;
|
||||
6'h2f: WLGbSSV5YzHmlpmqLI = 32'o63023 ^ 32'h722d90fd;
|
||||
6'd28: WLGbSSV5YzHmlpmqLI = 32'b00000000000000000001111001011011 ^ 32'h3d02 ^ 32'd1738296917;
|
||||
6'he: WLGbSSV5YzHmlpmqLI = 32'd10385 ^ 32'h1e9099e6;
|
||||
6'b000110: WLGbSSV5YzHmlpmqLI = 32'b00000000000000000010111010110001 ^ 32'd100341241;
|
||||
6'h7: WLGbSSV5YzHmlpmqLI = 32'b00000000000000000101100010101101 ^ 32'o74006 ^ 32'h4af4ca7f;
|
||||
6'd53: WLGbSSV5YzHmlpmqLI = 32'h61fd ^ 32'd21334 ^ 32'b01101010110001001001010101000010;
|
||||
6'o61: WLGbSSV5YzHmlpmqLI = 32'b00000000000000000011101000001100 ^ 32'd1070093101;
|
||||
6'o76: WLGbSSV5YzHmlpmqLI = 32'h5d9 ^ 32'o4453034147;
|
||||
6'd36: WLGbSSV5YzHmlpmqLI = 32'o67076 ^ 32'o65503 ^ 32'o236115274;
|
||||
6'h29: WLGbSSV5YzHmlpmqLI = 32'o40054 ^ 32'b00000000000000000100100000101100 ^ 32'd438005057;
|
||||
6'b111011: WLGbSSV5YzHmlpmqLI = 32'h7e4 ^ 32'h5a9eb098;
|
||||
6'o21: WLGbSSV5YzHmlpmqLI = 32'b00000000000000000010011010000110 ^ 32'o73640 ^ 32'b00101111111101010100111111100010;
|
||||
6'd40: WLGbSSV5YzHmlpmqLI = 32'h1630 ^ 32'b01100011100010011101000101001101;
|
||||
6'h37: WLGbSSV5YzHmlpmqLI = 32'd13814 ^ 32'd1499541943;
|
||||
6'o17: WLGbSSV5YzHmlpmqLI = 32'h528d ^ 32'h6c10 ^ 32'o7462474716;
|
||||
6'd34: WLGbSSV5YzHmlpmqLI = 32'd6725 ^ 32'b01111010100000111001101011110101;
|
||||
6'd2: WLGbSSV5YzHmlpmqLI = 32'o3277 ^ 32'h1b1d ^ 32'd1165033499;
|
||||
6'h30: WLGbSSV5YzHmlpmqLI = 32'h100f ^ 32'b00000000000000000111011001101110 ^ 32'o6552062231;
|
||||
6'b010110: WLGbSSV5YzHmlpmqLI = 32'o74164 ^ 32'd1434393388;
|
||||
6'b111101: WLGbSSV5YzHmlpmqLI = 32'b00000000000000000101101111011101 ^ 32'b00000000000000000100011101100000 ^ 32'd909162724;
|
||||
6'd57: WLGbSSV5YzHmlpmqLI = 32'd2543 ^ 32'b00001000011000100101001011101011;
|
||||
6'b101011: WLGbSSV5YzHmlpmqLI = 32'd15905 ^ 32'o14605 ^ 32'd426889412;
|
||||
6'o72: WLGbSSV5YzHmlpmqLI = 32'd13291 ^ 32'o13620560216;
|
||||
6'b011111: WLGbSSV5YzHmlpmqLI = 32'd7248 ^ 32'h39d2009f;
|
||||
6'b101100: WLGbSSV5YzHmlpmqLI = 32'o64036 ^ 32'd2115225742;
|
||||
6'o46: WLGbSSV5YzHmlpmqLI = 32'd16951 ^ 32'b00000000000000000111011011010100 ^ 32'b01011100001111100101001100110011;
|
||||
6'b100011: WLGbSSV5YzHmlpmqLI = 32'o42102 ^ 32'b00000000000000000010010101111011 ^ 32'b01100001010001000101101011010101;
|
||||
6'o30: WLGbSSV5YzHmlpmqLI = 32'o46155 ^ 32'b00001111100010110010101101111001;
|
||||
6'h12: WLGbSSV5YzHmlpmqLI = 32'b00000000000000000101000010000010 ^ 32'h3d68 ^ 32'o5006130516;
|
||||
6'o52: WLGbSSV5YzHmlpmqLI = 32'h1425 ^ 32'd21437 ^ 32'h6c10c5c1;
|
||||
6'o35: WLGbSSV5YzHmlpmqLI = 32'b00000000000000000100100001010111 ^ 32'b00001111100001110110000101101011;
|
||||
6'd13: WLGbSSV5YzHmlpmqLI = 32'd32404 ^ 32'o5267624761;
|
||||
6'b111000: WLGbSSV5YzHmlpmqLI = 32'b00000000000000000101111111110011 ^ 32'd9391 ^ 32'b00000010001110111100111110000100;
|
||||
6'd63: WLGbSSV5YzHmlpmqLI = 32'o27726 ^ 32'd21232 ^ 32'h60c73c71;
|
||||
6'b100111: WLGbSSV5YzHmlpmqLI = 32'h6c33 ^ 32'd1348383130;
|
||||
6'h33: WLGbSSV5YzHmlpmqLI = 32'b00000000000000000000111000000101 ^ 32'b00000000000000000100011111000110 ^ 32'o1413653112;
|
||||
6'b110010: WLGbSSV5YzHmlpmqLI = 32'b00000000000000000110010000001000 ^ 32'b00101000100110011110100011100100;
|
||||
6'h8: WLGbSSV5YzHmlpmqLI = 32'b00000000000000000010110010100110 ^ 32'o11036124126;
|
||||
6'b100000: WLGbSSV5YzHmlpmqLI = 32'd17996 ^ 32'd55914332;
|
||||
6'o3: WLGbSSV5YzHmlpmqLI = 32'o30274 ^ 32'o4415063561;
|
||||
6'o11: WLGbSSV5YzHmlpmqLI = 32'h56a3 ^ 32'o44537 ^ 32'o7406347521;
|
||||
6'o13: WLGbSSV5YzHmlpmqLI = 32'd10907 ^ 32'd1539340531;
|
||||
6'h25: WLGbSSV5YzHmlpmqLI = 32'h183a ^ 32'h321abce3;
|
||||
6'b110110: WLGbSSV5YzHmlpmqLI = 32'hbfa ^ 32'b00000000000000000001100100011111 ^ 32'o13474325645;
|
||||
6'h17: WLGbSSV5YzHmlpmqLI = 32'b00000000000000000010001001110000 ^ 32'o15121 ^ 32'd1851010648;
|
||||
6'b001100: WLGbSSV5YzHmlpmqLI = 32'b00000000000000000101010010011000 ^ 32'h1ab7 ^ 32'o2022343312;
|
||||
6'o36: WLGbSSV5YzHmlpmqLI = 32'o71124 ^ 32'o44222 ^ 32'o7444464371;
|
||||
6'd46: WLGbSSV5YzHmlpmqLI = 32'o36027 ^ 32'o65335 ^ 32'd371448084;
|
||||
6'b010000: WLGbSSV5YzHmlpmqLI = 32'h7c89 ^ 32'd1941236341;
|
||||
6'b010100: WLGbSSV5YzHmlpmqLI = 32'h247b ^ 32'o44370 ^ 32'd1196722951;
|
||||
6'd27: WLGbSSV5YzHmlpmqLI = 32'd29790 ^ 32'o73472 ^ 32'h5602858c;
|
||||
6'b000101: WLGbSSV5YzHmlpmqLI = 32'd1205 ^ 32'h6c76 ^ 32'd1912730239;
|
||||
6'b011001: WLGbSSV5YzHmlpmqLI = 32'h2066 ^ 32'h6ba9 ^ 32'd942376155;
|
||||
6'o1: WLGbSSV5YzHmlpmqLI = 32'o56303 ^ 32'b00111110001100010100011111001011;
|
||||
6'o4: WLGbSSV5YzHmlpmqLI = 32'b00000000000000000101101010111000 ^ 32'h4fc2c804;
|
||||
6'h34: WLGbSSV5YzHmlpmqLI = 32'b00000000000000000011100000000001 ^ 32'o13201041555;
|
||||
6'd45: WLGbSSV5YzHmlpmqLI = 32'b00000000000000000001001000011010 ^ 32'b00000000000000000010010100010101 ^ 32'hb1fbcbe;
|
||||
6'b001010: WLGbSSV5YzHmlpmqLI = 32'd159 ^ 32'd1516813251;
|
||||
6'b010101: WLGbSSV5YzHmlpmqLI = 32'o47170 ^ 32'h693d2bc0;
|
||||
6'd60: WLGbSSV5YzHmlpmqLI = 32'h31e1 ^ 32'd1326516696;
|
||||
6'h21: WLGbSSV5YzHmlpmqLI = 32'd28745 ^ 32'o14753 ^ 32'o102622513;
|
||||
6'h0: WLGbSSV5YzHmlpmqLI = 32'd12999 ^ 32'd3981 ^ 32'o16012611657;
|
||||
endcase
|
||||
end
|
||||
|
||||
assign wKSnwVGWV = pEo & qICjuvAOmWmr;
|
||||
assign VICULOkZm = UmLX == (32'h148f ^ 32'o12253);
|
||||
|
||||
logic [31:0] vBjc8EzRDlz48WXa4k;
|
||||
always_comb begin
|
||||
case ({m4Js9aFV4Us, P0EEllcI4VCU, VICULOkZm, XJhsywc8r, wKSnwVGWV, fcS5S0IailtPh})
|
||||
6'd9: vBjc8EzRDlz48WXa4k = 32'b00000000000000000001110000100110 ^ 32'd1968865001;
|
||||
6'b110111: vBjc8EzRDlz48WXa4k = 32'b00000000000000000111101101111010 ^ 32'b00000000000000000100111000100110 ^ 32'o10303624447;
|
||||
6'h38: vBjc8EzRDlz48WXa4k = 32'o47563 ^ 32'd22966 ^ 32'b01011000111000010111000111010011;
|
||||
6'b001110: vBjc8EzRDlz48WXa4k = 32'd28180 ^ 32'd1770718541;
|
||||
6'd44: vBjc8EzRDlz48WXa4k = 32'o26641 ^ 32'o47214 ^ 32'd1269075633;
|
||||
6'b101101: vBjc8EzRDlz48WXa4k = 32'h579e ^ 32'o6642351503;
|
||||
6'o76: vBjc8EzRDlz48WXa4k = 32'h4b5d ^ 32'b00000000000000000111110001100111 ^ 32'd2002868800;
|
||||
6'o31: vBjc8EzRDlz48WXa4k = 32'd26089 ^ 32'b00000000000000000101101011101001 ^ 32'h25c93bcb;
|
||||
6'd30: vBjc8EzRDlz48WXa4k = 32'b00000000000000000011011111010111 ^ 32'h4bcd7ab8;
|
||||
6'h3f: vBjc8EzRDlz48WXa4k = 32'h755a ^ 32'h683eb3f6;
|
||||
6'd50: vBjc8EzRDlz48WXa4k = 32'o24614 ^ 32'o741700252;
|
||||
6'b110001: vBjc8EzRDlz48WXa4k = 32'b00000000000000000111111110001111 ^ 32'b00000000000000000010101101110101 ^ 32'h25a4e761;
|
||||
6'b101011: vBjc8EzRDlz48WXa4k = 32'b00000000000000000000001110100101 ^ 32'd2244 ^ 32'h68c578ae;
|
||||
6'h5: vBjc8EzRDlz48WXa4k = 32'b00000000000000000111010000110101 ^ 32'h217d ^ 32'd278675848;
|
||||
6'o60: vBjc8EzRDlz48WXa4k = 32'o52623 ^ 32'd1522064583;
|
||||
6'o17: vBjc8EzRDlz48WXa4k = 32'd6161 ^ 32'o55517 ^ 32'b01001001001111001110001011011010;
|
||||
6'o50: vBjc8EzRDlz48WXa4k = 32'd1456 ^ 32'h4076583a;
|
||||
6'o24: vBjc8EzRDlz48WXa4k = 32'h69ff ^ 32'd1647636143;
|
||||
6'o47: vBjc8EzRDlz48WXa4k = 32'd23475 ^ 32'o13355467573;
|
||||
6'o52: vBjc8EzRDlz48WXa4k = 32'h59a9 ^ 32'd269481827;
|
||||
6'o71: vBjc8EzRDlz48WXa4k = 32'd31087 ^ 32'h7630562;
|
||||
6'h18: vBjc8EzRDlz48WXa4k = 32'o35755 ^ 32'h6a83bd37;
|
||||
6'd29: vBjc8EzRDlz48WXa4k = 32'o6733 ^ 32'h4a379444;
|
||||
6'd7: vBjc8EzRDlz48WXa4k = 32'h482e ^ 32'o26415 ^ 32'h159216ab;
|
||||
6'd28: vBjc8EzRDlz48WXa4k = 32'o61737 ^ 32'o26101 ^ 32'h12fd684a;
|
||||
6'o22: vBjc8EzRDlz48WXa4k = 32'o13006 ^ 32'o26247 ^ 32'b01011001100101010111010000011010;
|
||||
6'o32: vBjc8EzRDlz48WXa4k = 32'd4070 ^ 32'h20b1 ^ 32'd1493582438;
|
||||
6'd8: vBjc8EzRDlz48WXa4k = 32'h722a ^ 32'd29398 ^ 32'd1335986429;
|
||||
6'd16: vBjc8EzRDlz48WXa4k = 32'b00000000000000000100001000001101 ^ 32'h2117 ^ 32'o7123071615;
|
||||
6'd0: vBjc8EzRDlz48WXa4k = 32'b00000000000000000111100001001010 ^ 32'h7ecc ^ 32'b00111101001001011100000000011001;
|
||||
6'd13: vBjc8EzRDlz48WXa4k = 32'h4418 ^ 32'h4fbe ^ 32'o10512704470;
|
||||
6'd46: vBjc8EzRDlz48WXa4k = 32'h19a ^ 32'b00000000000000000101101000011100 ^ 32'h50de6cc1;
|
||||
6'b100110: vBjc8EzRDlz48WXa4k = 32'd1979 ^ 32'b00101111001000100000011100100000;
|
||||
6'b101001: vBjc8EzRDlz48WXa4k = 32'h2fac ^ 32'o76464 ^ 32'd1859925953;
|
||||
6'h3: vBjc8EzRDlz48WXa4k = 32'o20074 ^ 32'd1241899107;
|
||||
6'o33: vBjc8EzRDlz48WXa4k = 32'o34742 ^ 32'b00001000000101001000010101000110;
|
||||
6'hc: vBjc8EzRDlz48WXa4k = 32'b00000000000000000001101000011100 ^ 32'o14507726611;
|
||||
6'd2: vBjc8EzRDlz48WXa4k = 32'h4c43 ^ 32'h5dfc9c0f;
|
||||
6'd51: vBjc8EzRDlz48WXa4k = 32'o51610 ^ 32'o2712712356;
|
||||
6'd61: vBjc8EzRDlz48WXa4k = 32'd8545 ^ 32'o5010064657;
|
||||
6'd52: vBjc8EzRDlz48WXa4k = 32'h7d85 ^ 32'b00000000000000000111110011001110 ^ 32'o2373371533;
|
||||
6'o23: vBjc8EzRDlz48WXa4k = 32'h4002 ^ 32'h7270 ^ 32'o13661424031;
|
||||
6'd47: vBjc8EzRDlz48WXa4k = 32'd11159 ^ 32'o17745 ^ 32'd1507346480;
|
||||
6'b001011: vBjc8EzRDlz48WXa4k = 32'b00000000000000000111000000011111 ^ 32'o16126427520;
|
||||
6'd34: vBjc8EzRDlz48WXa4k = 32'o57711 ^ 32'o47362 ^ 32'o6556706570;
|
||||
6'b010001: vBjc8EzRDlz48WXa4k = 32'd27658 ^ 32'o13440363525;
|
||||
6'd53: vBjc8EzRDlz48WXa4k = 32'b00000000000000000010011110000001 ^ 32'd923797700;
|
||||
6'h20: vBjc8EzRDlz48WXa4k = 32'b00000000000000000000101111010000 ^ 32'b00001111101110010101110100011011;
|
||||
6'o6: vBjc8EzRDlz48WXa4k = 32'o17061 ^ 32'o10271662043;
|
||||
6'o4: vBjc8EzRDlz48WXa4k = 32'o45070 ^ 32'b00010101110001010001001000101000;
|
||||
6'ha: vBjc8EzRDlz48WXa4k = 32'b00000000000000000100011000100011 ^ 32'o77146 ^ 32'o5725726402;
|
||||
6'h17: vBjc8EzRDlz48WXa4k = 32'o10761 ^ 32'o47530 ^ 32'd846604252;
|
||||
6'o37: vBjc8EzRDlz48WXa4k = 32'd25044 ^ 32'o76632 ^ 32'o12032654357;
|
||||
6'b111010: vBjc8EzRDlz48WXa4k = 32'd9068 ^ 32'd1215680840;
|
||||
6'o45: vBjc8EzRDlz48WXa4k = 32'd23998 ^ 32'o20113 ^ 32'o11606433661;
|
||||
6'o1: vBjc8EzRDlz48WXa4k = 32'o21107 ^ 32'd17556 ^ 32'o2065074715;
|
||||
6'b100100: vBjc8EzRDlz48WXa4k = 32'h33c2 ^ 32'b00000000000000000101101010000011 ^ 32'b00000110011010101111000010000000;
|
||||
6'o26: vBjc8EzRDlz48WXa4k = 32'h67f4 ^ 32'o14126711433;
|
||||
6'o25: vBjc8EzRDlz48WXa4k = 32'h3df8 ^ 32'b01011010011010110100011011110000;
|
||||
6'o43: vBjc8EzRDlz48WXa4k = 32'b00000000000000000000100111000101 ^ 32'h74b56408;
|
||||
6'o73: vBjc8EzRDlz48WXa4k = 32'b00000000000000000100110101101000 ^ 32'b00000000000000000010101100001111 ^ 32'b01110110100101111011001000011000;
|
||||
6'o66: vBjc8EzRDlz48WXa4k = 32'd20862 ^ 32'd2142 ^ 32'b01011110101000000011101011001001;
|
||||
6'd60: vBjc8EzRDlz48WXa4k = 32'd30564 ^ 32'b01100101011101001001000011101011;
|
||||
6'b100001: vBjc8EzRDlz48WXa4k = 32'b00000000000000000011010111001101 ^ 32'b00100101111010001111100000001000;
|
||||
endcase
|
||||
end
|
||||
|
||||
logic [31:0] jMTaMbqs055c0zWDyuyX;
|
||||
always_comb begin
|
||||
case ({VICULOkZm, XJhsywc8r, wKSnwVGWV, pEo, qICjuvAOmWmr})
|
||||
5'ha: jMTaMbqs055c0zWDyuyX = 32'o73053 ^ 32'd2060447563;
|
||||
5'd1: jMTaMbqs055c0zWDyuyX = 32'd21071 ^ 32'b00001110111001010101111011000110;
|
||||
5'o36: jMTaMbqs055c0zWDyuyX = 32'o63740 ^ 32'h70d4 ^ 32'b01010001001001000110011110010010;
|
||||
5'o3: jMTaMbqs055c0zWDyuyX = 32'd9800 ^ 32'o4546566315;
|
||||
5'd23: jMTaMbqs055c0zWDyuyX = 32'b00000000000000000001011111111100 ^ 32'h4293 ^ 32'h38506077;
|
||||
5'h18: jMTaMbqs055c0zWDyuyX = 32'd16889 ^ 32'b01111111000001000101110000010000;
|
||||
5'h1f: jMTaMbqs055c0zWDyuyX = 32'h11dc ^ 32'h6066bf0e;
|
||||
5'hc: jMTaMbqs055c0zWDyuyX = 32'b00000000000000000100101000100100 ^ 32'd17145 ^ 32'b01111001101001110100010101100100;
|
||||
5'b10110: jMTaMbqs055c0zWDyuyX = 32'd28160 ^ 32'd1424638173;
|
||||
5'd17: jMTaMbqs055c0zWDyuyX = 32'd7186 ^ 32'h1fe2 ^ 32'h3f956080;
|
||||
5'b11010: jMTaMbqs055c0zWDyuyX = 32'h15f2 ^ 32'd5099 ^ 32'h4913b6d4;
|
||||
5'h9: jMTaMbqs055c0zWDyuyX = 32'h4c2f ^ 32'h71a0 ^ 32'b00001100000001010001000000000011;
|
||||
5'd29: jMTaMbqs055c0zWDyuyX = 32'h3de3 ^ 32'b00101001010010010101111101110110;
|
||||
5'o16: jMTaMbqs055c0zWDyuyX = 32'o17035 ^ 32'h4e89 ^ 32'h7bdf00ac;
|
||||
5'd15: jMTaMbqs055c0zWDyuyX = 32'h4819 ^ 32'd5201 ^ 32'b00110000101110111110101010011101;
|
||||
5'o4: jMTaMbqs055c0zWDyuyX = 32'd20548 ^ 32'h10344c94;
|
||||
5'b11001: jMTaMbqs055c0zWDyuyX = 32'o65765 ^ 32'o47043 ^ 32'b01100100111111110111000011100011;
|
||||
5'b00101: jMTaMbqs055c0zWDyuyX = 32'd31297 ^ 32'd5304 ^ 32'h23b36249;
|
||||
5'd19: jMTaMbqs055c0zWDyuyX = 32'b00000000000000000111000000001011 ^ 32'o4472612632;
|
||||
5'd2: jMTaMbqs055c0zWDyuyX = 32'b00000000000000000111110001001100 ^ 32'd17247 ^ 32'h555c1aef;
|
||||
5'd28: jMTaMbqs055c0zWDyuyX = 32'h13e7 ^ 32'b00010111110000011101010111100011;
|
||||
5'b10100: jMTaMbqs055c0zWDyuyX = 32'h1a07 ^ 32'h713a ^ 32'h7b647c68;
|
||||
5'd27: jMTaMbqs055c0zWDyuyX = 32'd27114 ^ 32'h1f7c ^ 32'b00111111111000011101110000111011;
|
||||
5'h6: jMTaMbqs055c0zWDyuyX = 32'h243d ^ 32'd484145837;
|
||||
5'd13: jMTaMbqs055c0zWDyuyX = 32'o72040 ^ 32'o6326065451;
|
||||
5'h7: jMTaMbqs055c0zWDyuyX = 32'b00000000000000000100111000111010 ^ 32'h2048 ^ 32'b00010100100110011101000001011011;
|
||||
5'h15: jMTaMbqs055c0zWDyuyX = 32'b00000000000000000100010000000100 ^ 32'h37ed0d9d;
|
||||
5'b10010: jMTaMbqs055c0zWDyuyX = 32'b00000000000000000100011000001110 ^ 32'd26026 ^ 32'd2088858357;
|
||||
5'o0: jMTaMbqs055c0zWDyuyX = 32'd10323 ^ 32'd460283331;
|
||||
5'hb: jMTaMbqs055c0zWDyuyX = 32'o20050 ^ 32'd438053772;
|
||||
5'o10: jMTaMbqs055c0zWDyuyX = 32'o74066 ^ 32'b00000000000000000110011000010000 ^ 32'o1737740073;
|
||||
5'b10000: jMTaMbqs055c0zWDyuyX = 32'b00000000000000000111001000010110 ^ 32'd212527463;
|
||||
endcase
|
||||
end
|
||||
|
||||
logic [31:0] cI7ozekBmfu12;
|
||||
always_comb begin
|
||||
case ({VICULOkZm, XJhsywc8r, wKSnwVGWV, pEo, qICjuvAOmWmr})
|
||||
5'd19: cI7ozekBmfu12 = 32'o57146 ^ 32'h3fc7 ^ 32'd479659813;
|
||||
5'h16: cI7ozekBmfu12 = 32'h5c5b ^ 32'd1434596568;
|
||||
5'b01111: cI7ozekBmfu12 = 32'b00000000000000000011011001110101 ^ 32'h6ba09ff2;
|
||||
5'h11: cI7ozekBmfu12 = 32'd2669 ^ 32'd334215551;
|
||||
5'b10101: cI7ozekBmfu12 = 32'h325f ^ 32'o45527 ^ 32'h3356711;
|
||||
5'd24: cI7ozekBmfu12 = 32'b00000000000000000011000001010100 ^ 32'o16260 ^ 32'h2f09e87d;
|
||||
5'hd: cI7ozekBmfu12 = 32'o61174 ^ 32'o16426 ^ 32'b01001101010000001000101111111010;
|
||||
5'b00011: cI7ozekBmfu12 = 32'o12243 ^ 32'h1d7c ^ 32'h5eb2511b;
|
||||
5'o32: cI7ozekBmfu12 = 32'h2e49 ^ 32'o67010 ^ 32'o2457411160;
|
||||
5'd20: cI7ozekBmfu12 = 32'd2147 ^ 32'o5045051261;
|
||||
5'o33: cI7ozekBmfu12 = 32'o54106 ^ 32'd957482061;
|
||||
5'b00010: cI7ozekBmfu12 = 32'h6aa7 ^ 32'b00001010000011100001111010011011;
|
||||
5'hc: cI7ozekBmfu12 = 32'b00000000000000000011100001111111 ^ 32'b01111100000000111011011100110001;
|
||||
5'h0: cI7ozekBmfu12 = 32'd5806 ^ 32'o46044 ^ 32'h28b2451;
|
||||
5'o1: cI7ozekBmfu12 = 32'b00000000000000000100000010101010 ^ 32'd4588 ^ 32'd1605026255;
|
||||
5'o31: cI7ozekBmfu12 = 32'h44d ^ 32'b00000000000000000010100001000000 ^ 32'b00001000101110101111101011011110;
|
||||
5'o6: cI7ozekBmfu12 = 32'd4761 ^ 32'h6ed5 ^ 32'h113e251c;
|
||||
5'd8: cI7ozekBmfu12 = 32'b00000000000000000110011010010001 ^ 32'o75145 ^ 32'b01100000100111001100000000111011;
|
||||
5'b00100: cI7ozekBmfu12 = 32'h3ea0 ^ 32'h7ece5d64;
|
||||
5'b11100: cI7ozekBmfu12 = 32'b00000000000000000000001001000010 ^ 32'b00000000000000000111100110011001 ^ 32'b01111100010101000001010111000100;
|
||||
5'o35: cI7ozekBmfu12 = 32'o26077 ^ 32'b01000111101111101110001100110110;
|
||||
5'o37: cI7ozekBmfu12 = 32'h37 ^ 32'b00000000000000000100101011110001 ^ 32'b01010111011111111110011000000101;
|
||||
5'd9: cI7ozekBmfu12 = 32'o35212 ^ 32'h3d1fddd0;
|
||||
5'b01110: cI7ozekBmfu12 = 32'b00000000000000000000110001111000 ^ 32'o12534110346;
|
||||
5'b01010: cI7ozekBmfu12 = 32'd25735 ^ 32'o45675 ^ 32'b00000001011000111010011100011111;
|
||||
5'b01011: cI7ozekBmfu12 = 32'b00000000000000000000111010000011 ^ 32'd415529667;
|
||||
5'b00101: cI7ozekBmfu12 = 32'h689c ^ 32'h30983181;
|
||||
5'b10010: cI7ozekBmfu12 = 32'b00000000000000000011010001101010 ^ 32'b00000000000000000111100111111111 ^ 32'h1b000e39;
|
||||
5'o20: cI7ozekBmfu12 = 32'd24689 ^ 32'h6e6f ^ 32'd1284891543;
|
||||
5'd7: cI7ozekBmfu12 = 32'o36225 ^ 32'b01111000111111111010010000001100;
|
||||
5'h17: cI7ozekBmfu12 = 32'h658 ^ 32'd778613074;
|
||||
5'o36: cI7ozekBmfu12 = 32'o53073 ^ 32'o15466557266;
|
||||
endcase
|
||||
end
|
||||
|
||||
always_ff @(posedge clk_i) begin
|
||||
if(zZF) begin
|
||||
X5ldx3X4a <= '0;
|
||||
end else if (jMTaMbqs055c0zWDyuyX[32'd15091 ^ 32'd28271 ^ 32'o65644 ^ 32'h4036 ^ 32'b00000000000000000110010001100010 ^ 32'o15555]) begin
|
||||
X5ldx3X4a <= '0;
|
||||
end
|
||||
else if(cI7ozekBmfu12[32'o13355 ^ 32'b00000000000000000101111011100001 ^ 32'o44011]) begin
|
||||
case(UmLX)
|
||||
32'h00: X5ldx3X4a <= data;
|
||||
32'h04: X5ldx3X4a <= valid;
|
||||
32'h08: X5ldx3X4a <= busy;
|
||||
32'h0c: X5ldx3X4a <= baudrate;
|
||||
32'h10: X5ldx3X4a <= parity_en;
|
||||
32'h14: X5ldx3X4a <= stopbit;
|
||||
default: X5ldx3X4a <= X5ldx3X4a;
|
||||
endcase
|
||||
end
|
||||
else begin
|
||||
X5ldx3X4a <= X5ldx3X4a;
|
||||
end
|
||||
end
|
||||
|
||||
always_ff @(posedge clk_i) begin
|
||||
if(zZF) begin
|
||||
stopbit <= '0;
|
||||
end else if (WLGbSSV5YzHmlpmqLI[32'b00000000000000000000010011110011 ^ 32'b00000000000000000111111100110011 ^ 32'h7bc1]) begin
|
||||
stopbit <= '0;
|
||||
end else if(vBjc8EzRDlz48WXa4k[32'h207b ^ 32'o24252 ^ 32'h7639 ^ 32'h764 ^ 32'o20713 ^ 32'd30353 ^ 32'b00000000000000000010001101000100 ^ 32'o6627]) begin
|
||||
stopbit <= FFDK4sD9m7;
|
||||
end
|
||||
else begin
|
||||
stopbit <= stopbit;
|
||||
end
|
||||
end
|
||||
assign q0MK89N8qKhS8mdymRsz = FFDK4sD9m7[0];
|
||||
assign pEo = req_i;
|
||||
endmodule
|
||||
|
@@ -22,10 +22,10 @@
|
||||
- [10. Подсистема прерывания (IC)](#10-подсистема-прерывания-ic)
|
||||
- [11. Интеграция подсистемы прерывания](#11-интеграция-подсистемы-прерывания)
|
||||
- [12. Увеличение количества источников прерываний с помощью дейзи-цепочки](#12-увеличение-количества-источников-прерываний-с-помощью-дейзи-цепочки)
|
||||
- [12. Периферийные устройства (PU)](#12-периферийные-устройства-pu)
|
||||
- [13. Программирование на языке высокого уровня](#13-программирование-на-языке-высокого-уровня)
|
||||
- [14. Программатор](#14-программатор)
|
||||
- [15. Оценка производительности](#15-оценка-производительности)
|
||||
- [13. Периферийные устройства (PU)](#13-периферийные-устройства-pu)
|
||||
- [14. Программирование на языке высокого уровня](#14-программирование-на-языке-высокого-уровня)
|
||||
- [15. Программатор](#15-программатор)
|
||||
- [16. Оценка производительности](#16-оценка-производительности)
|
||||
|
||||
## Полезное
|
||||
|
||||
@@ -106,17 +106,17 @@
|
||||
|
||||
## 1. Сумматор. SystemVerilog (Adder)
|
||||
|
||||

|
||||

|
||||
На первой лабораторной работе изучаются базовые конструкции языка описания аппаратуры SystemVerilog, с помощью которого разрабатывается цифровой сумматор из примитивных логических вентилей, который, в последствии, конфигурируется в ПЛИС и его работа проверяется на отладочном стенде.
|
||||
|
||||
## 2. Арифметико-логическое устройство (ALU)
|
||||
|
||||

|
||||

|
||||
На второй лабораторной изучаются новые конструкции языка SystemVerilog, на основе которых разрабатывается блок арифметико-логического устройства (АЛУ). АЛУ — это устройство, на входы которого подаются операнды, над которыми нужно выполнить некоторую операцию (сложение, вычитание и тому подобное) и код операции, которую нужно выполнить, а на выходе появляется результат этой операции. Проще говоря АЛУ - это "калькулятор" процессора.
|
||||
|
||||
## 3. Регистровый файл и внешняя память (RF)
|
||||
|
||||

|
||||

|
||||
На третьей лабораторной разрабатываются элементы памяти для будущего процессора: память команд, память данных и регистровый файл. В памяти команд будет храниться программа, которую будет выполнять процессор. В памяти данных хранятся данные, которые будут обрабатываться процессором. Регистровый файл — это маленькая память, тоже с данными, которые могут быть поданы непосредственно на АЛУ. Особенность RISC-архитектур в том, что данные перед обработкой необходимо перенести из памяти данных в регистровый файл, только после этого к ним можно применять различные операции.
|
||||
|
||||
## 4. Простейшее программируемое устройство (PPD)
|
||||
@@ -126,12 +126,12 @@
|
||||
|
||||
## 5. Основной дешифратор команд (MD)
|
||||
|
||||

|
||||

|
||||
Пятая лабораторная посвящена разработке устройства управления – основному дешифратору команд. Функция основного дешифратора — получать на вход коды выполняемых операций и преобразовывать их в управляющие сигналы для всех блоков процессора (АЛУ, память, регистровый файл, мультиплексоры). Работа требует внимательности в реализации, а ее результат проверяется заранее подготовленными автоматическими тестами.
|
||||
|
||||
## 6. Тракт данных (DP)
|
||||
|
||||

|
||||

|
||||
Разработанные блоки объединяются, образуя тракт данных, управляемый основным дешифратором команд. Результатом шестой лабораторной работы является однотактный процессор, с архитектурой RISC-V, поддерживающий стандартный набор целочисленных инструкций RV32I. В качестве проверки на процессоре запускаются программы, заранее написанные на языке ассемблера RISC-V. Сравнивается результат полученный на симуляторе и на разработанном процессоре.
|
||||
|
||||
## 7. Внешняя память
|
||||
@@ -142,7 +142,7 @@
|
||||
|
||||
## 8. Блог загрузки и сохранения данных (LSU)
|
||||
|
||||

|
||||

|
||||
|
||||
Для корректного исполнения инструкций `LB`, `LBU`, `SB`, `LH`, `LHU`, `SH` мало использовать память с побайтовой записью. Необходимо также уметь управлять этой памятью, определенным образом подготавливать данные как для записи в память данный, так и для записи в регистровый файл, а также следить за тем, чтобы за время работы с памятью, программа процессора не начала исполняться дальше. Все эти задачи возлагаются на специальный модуль, который называется **Блок загрузки и сохранения** (**Load and Store Unit**, **LSU**)
|
||||
|
||||
@@ -150,11 +150,11 @@
|
||||
|
||||
Вспомогательная лабораторная работа по интеграции реализованного ранее блока загрузки и сохранения, а также новой памяти данных в модуль `riscv_unit`.
|
||||
|
||||

|
||||

|
||||
|
||||
## 10. Подсистема прерывания (IC)
|
||||
|
||||

|
||||

|
||||
|
||||
Одной из основных функций процессоров является возможность реагировать на внешние события (дернуть мышку, нажать кнопку и т.п.), автоматически запуская, при их возникновении, соответствующие программы. В данной лабораторной создается и подсистема прерывания, к которой относятся контроллер прерываний с циклическим опросом и блок регистров статуса и управления.
|
||||
|
||||
@@ -162,7 +162,7 @@
|
||||
|
||||
Вспомогательная лабораторная работа по интеграции реализованной ранее подсистемы прерывания.
|
||||
|
||||

|
||||

|
||||
|
||||
## 12. Увеличение количества источников прерываний с помощью дейзи-цепочки
|
||||
|
||||
@@ -170,19 +170,19 @@
|
||||
|
||||

|
||||
|
||||
## 12. Периферийные устройства (PU)
|
||||
## 13. Периферийные устройства (PU)
|
||||
|
||||

|
||||

|
||||
|
||||
В данной лабораторной создаются и подключаются к общей шине и подсистеме прерывания контроллеры периферийных устройств: переключатели, светодиоды, клавиатура, семисегментные дисплеи а также контроллер uart.
|
||||
|
||||
## 13. Программирование на языке высокого уровня
|
||||
## 14. Программирование на языке высокого уровня
|
||||
|
||||

|
||||

|
||||
|
||||
В рамках данной лабораторной настраивается компилятор GCC для RISC-V и для разработанной системы пишется программное обеспечение на языке программирования C++.
|
||||
|
||||
## 14. Программатор
|
||||
## 15. Программатор
|
||||
|
||||
До этого момента, исполняемая процессором программа попадала в память инструкций через магический вызов `$readmemh`. Однако реальные микроконтроллеры не обладают такими возможностями. Программа из внешнего мира попадает в них посредством так называемого **программатора** — устройства, обеспечивающего запись программы в память микроконтроллера. Программатор записывает данные в постоянное запоминающее устройство (ПЗУ). Для того, чтобы программа попала из ПЗУ в память инструкций, после запуска контроллера сперва начинает исполняться **загрузчик** (**bootloader**) — небольшая программа, вшитая в память микроконтроллера на этапе изготовления, которая отвечает за первичную инициализацию и подготовку микроконтроллера к выполнению основной программы (включая её перенос из ПЗУ в память инструкций).
|
||||
|
||||
@@ -190,7 +190,7 @@
|
||||
|
||||

|
||||
|
||||
## 15. Оценка производительности
|
||||
## 16. Оценка производительности
|
||||
|
||||
На текущий момент мы создали процессорную систему, которая способна взаимодействовать с внешним миром посредством периферийных устройств ввода-вывода и программатора. Однако сложно понять, какое место данная система занимает в ряду уже существующих вычислительных систем.
|
||||
|
||||
|
@@ -101,11 +101,11 @@
|
||||
|
||||
<details>
|
||||
<summary> Радиотехники </summary>
|
||||
Использование радиоволн сегодня помогает в решении огромного круга задач связанных с передачей информации/энергии на расстояние, локацией, позиционированием, изучением свойств объектов отражения и многим другим на что только фантазии хватит. На практике радиоволны оказываются удивительно полезными, и для того чтобы управлять ими и извлекать из них максимум, используются антенны. Эти устройства могут быть довольно сложными, и за ними должны стоять профессионалы, способные их создать. Управляют антеннами, контролируют их и получают с них информацию специальные устройства, которые, в конечном итоге, преобразуют радиосигналы в электрические цифровые, или наоборот.
|
||||
Использование радиоволн сегодня помогает в решении огромного круга задач, связанных с передачей информации/энергии на расстояние, локацией, позиционированием, изучением свойств объектов отражения и многим другим на что только фантазии хватит. На практике радиоволны оказываются удивительно полезными, и для того, чтобы управлять ими и извлекать из них максимум, используются антенны. Эти устройства могут быть довольно сложными, и за ними должны стоять профессионалы, способные их создать. Управляют антеннами, контролируют их и получают с них информацию специальные устройства, которые, в конечном итоге, преобразуют радиосигналы в электрические цифровые, или наоборот.
|
||||
|
||||
Современные микросхемы СВЧ (сверхвысоких частот), которые используются в антенных устройствах, часто являются программируемыми. Это означает, что они либо содержат в себе процессор, либо спроектированы для взаимодействия с процессорами. Чтобы раскрыть потенциал этих микросхем, вам нужно знать, как работают процессоры. Понимание их функций также пригодится в области радиотехники, особенно если вам нужно управлять сигналами в строгие временные рамки.
|
||||
|
||||
Радиотехника — это не только работа с радиосигналами, но и их обработка. Иногда нужно обрабатывать сигналы очень быстро. В таких случаях важно знать, какой вычислитель выбрать, чтобы обеспечить точность обработки в установленные временные рамки и при этом не превысить требования по энергопотреблению. Без понимания АПС вы не сможете решать такие задачи. Ведь приходится выбирать из множества устройств, включая микроконтроллеры и процессоры цифровой обработки сигналов с различными характеристиками, ПЛИС. А как это сделать, если даже не понимаешь что это такое.
|
||||
Радиотехника — это не только работа с радиосигналами, но и их обработка. Иногда нужно обрабатывать сигналы очень быстро. В таких случаях важно знать, какой вычислитель выбрать, чтобы обеспечить точность обработки в установленные временные рамки и при этом не превысить требования по энергопотреблению. Без понимания АПС вы не сможете решать такие задачи. Ведь приходится выбирать из множества устройств, включая микроконтроллеры и процессоры цифровой обработки сигналов с различными характеристиками, ПЛИС. А как это сделать, если даже не понимаешь, что это такое.
|
||||
|
||||
По сути, радиотехник – это специалист, который может не только посчитать антенну, но и создать ее, а также разработать систему управления, сбора и обработки данных с использованием знаний АПС.
|
||||
|
||||
|