конкурсные задания по направлению «Программирование

advertisement
 Категория сложности А
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»).
Related documents
Download