Категория сложности А 1. В чем заключаются преимущества использования ПЛИС по сравнению с процессорами? В каких случаях предпочтительнее использовать ПЛИС, в каких процессор? 2. Изобразите типовую архитектуру ПЛИС. Перечислите, из каких элементов состоит ПЛИС. 3. Каким образом выполняется переход из одного тактового домена в другой при разработке ПЛИС? 4. Что такое система на кристалле (SoC) и в чем его преимущество перед ПЛИС (FPGA)? 5. Зачем нужна PLL в ПЛИС? 6. Какое логическое состояние примет сигнал типа std_logic на линии, если на нее действуют одновременно два драйвера со следующими состояниями: а) ‘H’ и ‘1’ б) ‘0’ и ‘Z’ в) ‘0’ и ‘1’ г) ‘Z’ и ‘H’ 7. В первом проекте прошивки ПЛИС было задействовано 500 логических вентилей, во втором - 10 000. Как изменится размер файла прошивки для ПЛИС? 8. Для чего необходим список чувствительности процесса? Что будет, если пропустить сигнал и использовать его внутри процесса: а) для присвоения значения другому сигналу; б) для изменения его собственного значения. 9. Каковы принципиальные отличия использования аппаратно-реализованного процессорного ядра (SoCZynq) и программно-реализуемого (MicroBlaze)? 10. Реализуйте класс для сохранения строк и безопасной работы с ними. Каждый объект класса должен хранить значение char * и самостоятельно отслеживать, какое количество памяти необходимо для хранения строки. Пример такого класса: class String { private: char * data; ... }; Возможно, вам захочется, также, завести приватное поле для хранения длины строки или указателя на последний элемент. Необходимо реализовать: - конструктор по умолчанию (создает пустую строку); - конструктор с параметром char *; - конструктор копирования; - деструктор (освобождает выделенную память); - оператор присваивания; - оператор приведения к const char *; - конкатенацию строк: операторы + и +=; - обращение по индексу – два варианта оператора []: константный для чтения, возвращающий char & для изменения. Категория сложности B 1. Разработайте программный модуль ПЛИС для детектирования последовательности 101001 на входном однобитовом порту data_in. Строб детектирования должен устанавливаться на выходном порту val через 3 такта clk после получения последнего бита. Длительность строба - 1 такт сигнала clk. 2. Разработайте программный модуль с управляемым мерцанием (Скважность: 2; Период: 0,5сек, 1сек, 2сек) светодиода. Изменение периода производится нажатием пользователя на кнопку. 3. Разработайте программный модуль ПЛИС, генерирующий псевдослучайную последовательность. Полином, определяющий последовательность задается входным портом pol_in. Максимальное значение, задающее полином не превышает 232-1. 4. Предложите оптимальный по быстродействию код для модуля, который выставляет логическую единицу на выход val каждый N-ый такт, где N – задается значением на входе count (16 разрядов). 5. Реализуйте шаблон класса для хранения динамического списка элементов типа T. Пример: template <typename T> class List { private: struct element { T data; element * next; }; element *head; ... }; Необходимо реализовать: - операции вставки элемента в начало списка; - операцию удаления первого элемента; - деструктор, освобождающий всю выделенную память; - операции вставки элемента в конец списка; - операцию удаления последнего элемента; - запрет использования конструктора копирования и оператора присваивания; - класс-итератор, перебирающий элементы списка при вызове оператор ++, для которого определены операторы * и ->. Категория сложности С 1. Разработайте модуль ПЛИС, формирующий синусоиду на выходе data_out. Частота синусоиды должна управляться входным портом freq. Разрядность портов должна быть выбрана, исходя из требования получения 1% точности. 2. Разработайте арифметико-логическое устройство для суммирования, вычитания и умножения 4-х комплексных чисел. Разрядность входных данных (действительной и мнимой составляющей) задается параметром отдельно для каждого комплексного числа. Операции, выполняемые внутри устройства должны определяться значением на входном порту opr_in: 0 – суммирование (a1+a2+a3+a4); 1 – вычитание(-a1-a2-a3-a4); 2 – умножение (a1*a2*a3*a4); Задержка между входными и выходными данными не должна превышать 8 тактов сигнала clk. 3. Реализуйте абстрактный класс Expression с чисто виртуальными методами Expression *diff(); и void print(); и отнаследуйте от него классы Number, Variable, Add и Sub – число, переменная, сумма двух выражений и разность двух выражений, для которых напишите реализацию этих двух методов. Пример: Expression *e = new Add(new Number(1), new Variable('x')); std::cout «\n»; Expression *de = e->diff(); de->print(); std::cout << «\n»; delete e; delete de; Результатом выполнения этого кода должно быть: 0+1. Не запрещается сделать упрощение выражений и научить diff() дифференцировать по заданной переменной, а не только по x. Необходимо реализовать: - классы Expression, Number, Variable. Add, Sub; - классы Mul (произведение), Div (частное), при желании функции типа Sin, Cos и т. п. - чтение выражения из строки или std::sin с автоматическим созданием необходимых объектов. Пример: Expression *e = read_expression(«(x+1)*x»).