Скачиваний:
0
Добавлен:
23.12.2025
Размер:
246.28 Кб
Скачать

МИНИСТЕРСТВО ЦИФРОВОГО РАЗВИТИЯ,

СВЯЗИ И МАССОВЫХ КОММУНИКАЦИЙ РОССИЙСКОЙ ФЕДЕРАЦИИ

ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ОБРАЗОВАНИЯ

«САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ ТЕЛЕКОММУНИКАЦИЙ ИМ. ПРОФ. М.А. БОНЧ-БРУЕВИЧА»

(СПбГУТ)

Факультет «Информационных технологий и программной инженерии»

Кафедра «Программной инженерии и вычислительной техники»

Направление подготовки:

09.03.04 – Программная инженерия

Направленность (профиль):

Разработка программного обеспечения и приложений искусственного интеллекта в киберфизических системах

ЛАБОРАТОРНАЯ РАБОТА № 2

по дисциплине:

Архитектура распределённых вычислительных систем

на тему:

ПРОЕКТИРОВАНИЕ ЭЛЕМЕНТА АЛУ В CYCLONE V

Выполнили студенты группы

ИКПИ-32

Блинов И.С., Кларк А.Е., Яковлев М.А.

Фамилия И. О.

Принял

оценка

уч. степень, уч. звание

Неелова О.Л.

дата, подпись

Фамилия И. О.

Цель работы: Изучение методов проектирования линейных схем в ПЛИС с использованием пакетов Modelsim и Quartus15.

Постановка задачи:

Спроектировать устройство, позволяющее производить арифметическое сложение 4-разрядных данных, подаваемых с тумблеров макета DE1-SoC, сохраняя результат в регистре, а бит переноса в триггере, представленном, как старший разряд того же регистра. Полученная сумма выводится на семисегментный индикатор, а состояние переноса – на светодиод макета (рисунок 1).

Рисунок 1 - Схема проектируемого устройства

Ход работы

Модуль coder выполняет преобразование 4-битного входного двоичного числа (data) в код для семисегментного индикатора (seg). Ниже представлен код файла coder.v:

module coder

(input wire [3:0] data,

output wire [6:0] seg);

reg [6:0]code;

assign seg=code;

always @*

case(data)

4'b0000: code = 7'b1000000;

4'b0001: code = 7'b1111001;

4'b0010: code = 7'b0100100;

4'b0011: code = 7'b0110000;

4'b0100: code = 7'b0011001;

4'b0101: code = 7'b0010010;

4'b0110: code = 7'b0000010;

4'b0111: code = 7'b1111000;

4'b1000: code = 7'b0000000;

4'b1001: code = 7'b0010000;

4'b1010: code = 7'b0001000;

4'b1011: code = 7'b0000011;

4'b1100: code = 7'b1000110;

4'b1101: code = 7'b0100001;

4'b1110: code = 7'b0000110;

4'b1111: code = 7'b0001110;

endcase

endmodule

Модуль sum реализует одноразрядный полный сумматор. Вычисляет сумму (s) и перенос (crp) для трех входных битов: двух слагаемых (a, b) и входного переноса (cr). Далее представлен код файла sum.v:

module sum

(input wire a,b,cr,

output wire s,crp);

assign s=(a^b)^cr;

assign crp=(a&b) | ((a^b)&cr);

endmodule

Модуль sum_4 реализует 4-разрядный сумматор с последовательным переносом. Объединяет четыре одноразрядных сумматора для сложения двух 4-битных чисел (a_in, b_in) с учетом входного переноса (cr_in), формируя 4-битную сумму (s_out) и выходной перенос (crp_out).

Содержание файла sum_4.v приведено ниже:

module sum_4

(input wire [3:0]a_in,b_in,

input wire cr_in,

output wire [3:0]s_out,

output wire crp_out);

wire [2:0]crp_n;

sum sum0(.a (a_in[0]),.b (b_in[0]),.cr(cr_in), .s(s_out[0]),.crp(crp_n[0]));

sum sum1(.a(a_in[1]),.b(b_in[1]),.cr(crp_n[0]), .s(s_out[1]),.crp(crp_n[1]));

sum sum2(.a (a_in[2]),.b (b_in[2]),.cr(crp_n[1]), .s(s_out[2]),.crp(crp_n[2]));

sum sum3(.a (a_in[3]),.b (b_in[3]),.cr(crp_n[2]), .s(s_out[3]),.crp(crp_out));

endmodule

Модуль latch_rgstr представляет собой параметри- зированный N-разрядный регистр с тактированием по положительному фронту. Сохраняет входные данные (d_in) по фронту тактового сигнала (clk) и выдает их на выход (d_out).

Ниже приведено содержание файла latch_rgstr.v:

module latch_rgstr

#(parameter N=5)

(input [N-1:0] d_in,

input clk,

output [N-1:0]d_out);

reg [N-1:0]q;

assign d_out=q;

always@ (posedge clk)

begin

q<=d_in;

end

endmodule

Модуль summ_4 является верхнеуровневым модулем, который объединяет все предыдущие блоки для создания завершенной системы 4-разрядного сумматора с регистром и семисегментным индикатором.

Содержание файла summ_4.v:

module summ_4

(input wire [3:0]op_a,op_b,

input wire op_c, sync,

output wire led,

output wire [6:0]hex);

wire [3:0]sm;

wire c_y;

wire [4:0]y;

assign led=y[4];

sum_4 block1(.a_in(op_a), .b_in(op_b), .cr_in(op_c), .s_out(sm), .crp_out(c_y));

latch_rgstr block2(.d_in({c_y,sm[3:0]}), .clk(sync), .d_out(y));

coder block3(.data(y[3:0]), .seg(hex));

endmodule

Модуль test_summ4 – это итоговый тестбенч для проверки работы схемы. Содержание файла test_summ4.v:

`timescale 1ns/1ns

module test_summ4;

reg [3:0] op_a, op_b;

reg op_c;

reg sync;

wire led;

wire [6:0] hex;

summ_4 dut (

.op_a(op_a),

.op_b(op_b),

.op_c(op_c),

.sync(sync),

.led(led),

.hex(hex)

);

initial begin

sync = 0;

forever #5 sync = ~sync;

end

initial begin

op_a = 4'b0000;

op_b = 4'b0000;

op_c = 1'b0;

@(negedge sync);

// 5 + 3

op_a = 4'b0101; // 5

op_b = 4'b0011; // 3

op_c = 1'b0;

@(negedge sync);

// 7 + 9 + 1

op_a = 4'b0111; // 7

op_b = 4'b1001; // 9

op_c = 1'b1;

@(negedge sync);

// 15 + 1

op_a = 4'b1111; // 15

op_b = 4'b0001; // 1

op_c = 1'b0;

@(negedge sync);

// 8 + 8

op_a = 4'b1000; // 8

op_b = 4'b1000; // 8

op_c = 1'b0;

@(negedge sync);

$stop;

end

endmodule

В среде ModelSim была проведена функциональная симуляция разработанных модулей. На рисунке 2 представлена диаграмма с результатом, содержащая:

  • op_a – первое 4-битное слагаемое;

  • op_b – второе 4-битное слагаемое;

  • op_c – входной перенос;

  • sync – тактовый сигнал для регистра;

  • led – выходной сигнал переноса;

  • hex – код для семисегментного индикатора.

Рисунок 2 - Результат симуляции

Вывод: В ходе выполнения лабораторной работы было разработано устройство, реализующее 4-разрядный сумматор с отображением результата на семисегментном индикаторе. Устройство состоит из модулей одноразрядного полного сумматора, 4-разрядного сумматора, N-разрядного регистра и декодера для 7-сегментного индикатора.

Для проверки работоспособности устройства были написаны тестбенч-файлы и проведена функциональная симуляция в среде ModelSim, подтвердившая правильность работы разработанных модулей. Проект был перенесён в среду Quartus 15, где далее выполнено программирование макета ПЛИС DE1-SoC.

Результаты симуляции подтвердили корректность работы всех модулей: устройство правильно выполняет сложение 4-битных чисел, учитывает входной перенос, отображает результат на семисегментном индикаторе и сигнализирует о переполнении.

Санкт-Петербург 2025