ЛР / otchet_LR4
.docxМИНИСТЕРСТВО ЦИФРОВОГО РАЗВИТИЯ,
СВЯЗИ И МАССОВЫХ КОММУНИКАЦИЙ РОССИЙСКОЙ ФЕДЕРАЦИИ
ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ОБРАЗОВАНИЯ
«САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ ТЕЛЕКОММУНИКАЦИЙ ИМ. ПРОФ. М.А. БОНЧ-БРУЕВИЧА»
(СПБГУТ)
_________________________________________________________________________
Кафедра Радиосвязи и Вещания (РСиВ)
Лабораторная работа №4
По дисциплине «Основы разработки систем на кристалле»
РАЗРАБОТКА МНОГОФАЙЛОВОГО ПРОЕКТА НА ЯЗЫКЕ ПОВЕДЕНЧЕСКОГО ОПИСАНИЯ
Выполнили
студенты группы РТ-XX
Проверил:
Фёдоров Андрей Сергеевич __________
Санкт-Петербург
2023
Цель работы
Разработка модуля верхнего уровня с использованием возможности межсоединения модулей внутри проекта. Изучение возможности соединения нескольких модулей в проекте. Проверка готового модуля на плате.
1. Принцип соединения модулей на Verilog. Назначение файлов sw_led_wrapper.v и top.v.
Соединение модулей происходит в верхнем модуле через указание соответствующих входов и выходов через экземпляры подмодулей. Файл sw_led_wrapper.v нужен для создания внешнего модуля (обёртки). Он служит отдельным блоком с входами и выходами, который взаимодействует с периферией.
2. Блочная схема проекта.
3. Листинг модулей из индивидуального задания с поясняющими комментариями каждой строки.
module top ( // верхний модуль
input [7:0] sw, // обозначение входов и выходов
output [2:0] led
);
wire [4:0] temp; // инициализация промежуточных переменных
user_and and_0 ( // установка экземпляра пользовательского
.a (sw[7]), // модуля логического И
.b (sw[6]),
.c (temp[0])
);
user_not not_0 ( // установка экземпляра пользовательского
.a (sw[5]), // логического НЕ
.c (temp[1])
);
user_or or_0 ( // установка экземпляра пользовательского
.a (sw[3]), // логического ИЛИ
.b (sw[2]),
.c (temp[2])
);
user_or or_1 (
.a (temp[0]),
.b (temp[1]),
.c (led[2])
);
user_and and_1 (
.a (sw[4]),
.b (temp[2]),
.c (temp[3])
);
user_not not_1 (
.a (temp[3]),
.c (led[1])
);
user_and and_2 (
.a (sw[1]),
.b (sw[0]),
.c (temp[4])
);
user_not not_2 (
.a (temp[4]),
.c (led[0])
);
endmodule
module sw_led_wrapper( // модуль обёртки
input [7:0] sw,
output [4:0] led
);
top sw_led( // экземпляр основного модуля
.sw (sw),
.led (led)
);
endmodule
module user_and( // модуль пользовательского логического И
input a, b,
output c
);
assign c = a & b;
endmodule
module user_not( // модуль пользовательского логического НЕ
input a,
output c
);
assign c = ~ a;
endmodule
module user_or( // модуль пользовательского логического ИЛИ
input a, b,
output c
);
assign c = a | b;
endmodule
4. Указание отличий данной работы от предыдущей.
Отличие предыдущей работы заключается в наличии процессорного модуля. Всё взаимодействие с периферией происходило через процессор. В этой работе мы не используем процессор, а напрямую конфигурируем модуль на ПЛИС.
5. Текст тестового модуля для индивидуального задания с комментариями каждой строки.
module top_tb( ); // тестбенч для проверки
reg [7:0] in_tb; // входные регистры модуля
wire [2:0] out_tb; // выход модуля
integer i; // объявление целочисленной переменной для шкалы
// времени
top DUT( // экземпляр основного модуля
.sw (in_tb),
.led (out_tb)
);
initial begin
for(i = 0; i < 256; i = i + 1) begin
in_tb = i;
#10;
end
endmodule
6. Зарисованные временные диаграммы.
7. Таблица из 5 наборов значений входных и выходных сигналов.
in[7] |
in[6] |
in[5] |
in[4] |
in[3] |
in[2] |
in[1] |
in[0] |
out[2] |
out[1] |
out[0] |
0 |
0 |
0 |
0 |
0 |
1 |
1 |
1 |
1 |
1 |
0 |
0 |
0 |
0 |
0 |
1 |
0 |
0 |
0 |
1 |
1 |
1 |
0 |
0 |
0 |
0 |
1 |
0 |
0 |
1 |
1 |
1 |
1 |
0 |
0 |
0 |
1 |
1 |
1 |
1 |
0 |
1 |
0 |
0 |
0 |
0 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
1 |
8. Выводы о правильности работы.
Данные с проверки на оборудовании совпадают с данными, полученными после модуляции, и с расчётными данными.
Программа работает корректно, ошибок не обнаружено.