Лабораторные работы. Неелова / Архитектура. Отчет №4
.docxФЕДЕРАЛЬНОЕ АГЕНТСТВО СВЯЗИ
ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ОБРАЗОВАНИЯ
«САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ ТЕЛЕКОММУНИКАЦИЙ ИМ. ПРОФ. М.А. БОНЧ-БРУЕВИЧА»
(СПбГУТ)
ФАКУЛЬТЕТ ИНФОРМАЦИОННЫХ ТЕХНОЛОГИЙ И ПРОГРАММНОЙ ИНЖЕНЕРИИ (ИТПИ)
КАФЕДРА ПРОГРАММНОЙ ИНЖЕНЕРИИ И ВЫЧИСЛИТЕЛЬНОЙ ТЕХНИКИ (ПИ И ВТ)
Дисциплина: «Архитектура распределенных вычислительных систем»
Лабораторная работа №4.
Тема: «Проектирование сдвигового регистра»
Выполнили:
студенты группы ИКПИ-32
Кларк А.Е.
Блинов И.С.
Яковлев М.А.
Приняла:
Неелова О. Л.
Подпись ______________
Цель работы
Изучение методов проектирования устройств, основанных на регистрах сдвига.
Задание на работу в лаборатории. Необходимо получить последовательный вывод чисел, набираемых с тумблеров макета, на шесть 7-сегментных индикаторов. Вывод должен производиться с частотой 1 Гц. (Тактовая частота кристалла в макете 50МГц). Блок-схема устройства с указанием типа используемых переменных представлена на рис. 1.
Рисунок 1 - Схема проектируемого устройства
Файл coder.v : модуль coder выполняет преобразование 4-битного входного двоичного числа (data) в код для семисегментного индикатора (seg).
module coder
(input wire [3:0] data,
output wire [6:0] seg);
reg [6:0]code;
assign seg=code;
always @*
case(data)
4'b0001: code = 7'b0001001; // H
4'b0011: code = 7'b0000110; // E
4'b0010: code = 7'b1000111; // L
4'b0110: code = 7'b1000000; // O
4'b1110: code = 7'b0001110; // F
4'b1111: code = 7'b0101111; // r
4'b1011: code = 7'b1001111; // I
4'b0011: code = 7'b0000110; // E
4'b1010: code = 7'b0101011; // n
4'b1101: code = 7'b0100001; // d
default: code = 7'b11111111;
endcase
endmodule
Файл coder.v : модуль coder выполняет преобразование 4-битного входного двоичного числа (data) в символы для семисегментного индикатора (seg) для написания фразы.
module coder
(input wire [3:0] data,
output wire [6:0] seg);
reg [6:0]code;
assign seg=code;
always @*
case(data)
4'b0001: code = 7'b0001001; // H
4'b0011: code = 7'b0000110; // E
4'b0010: code = 7'b1000111; // L
4'b0110: code = 7'b1000000; // O
4'b1110: code = 7'b0001110; // F
4'b1111: code = 7'b0101111; // r
4'b1011: code = 7'b1001111; // I
4'b0011: code = 7'b0000110; // E
4'b1010: code = 7'b0101011; // n
4'b1101: code = 7'b0100001; // d
//4'b0111: code = 7'b0100001; //
default: code = 7'b11111111;
endcase
Файл shift_reg_6.v: модуль shift_reg_6 реализует 6-разрядный сдвиговый регистр с параллельным считыванием данных. При каждом тактовом импульсе (clk) информация с входа (data_in) поочерёдно сдвигается по ячейкам регистра. Предусмотрен асинхронный сброс (reset), который устанавливает все разряды регистра в нулевое состояние. На выходах out1–out6 постоянно присутствуют текущие значения соответствующих разрядов регистра.
module shift_reg_6
(input clk, reset,
input [3:0] data_in,
output [3:0] data_out_0, data_out_1, data_out_2,
output [3:0] data_out_3, data_out_4, data_out_5);
integer i;
reg [3:0] shift_reg [5:0]; // 6 ячеек по 4 бита
assign data_out_0 = shift_reg[0];
assign data_out_1 = shift_reg[1];
assign data_out_2 = shift_reg[2];
assign data_out_3 = shift_reg[3];
assign data_out_4 = shift_reg[4];
assign data_out_5 = shift_reg[5];
always@(posedge clk, posedge reset)
begin
if (reset)
begin
for (i=0; i<6; i=i+1)
shift_reg[i] <= 4'b0000; // Сброс всех ячеек в 0
end
else
begin
for (i=5; i>0; i=i-1)
shift_reg[i] <= shift_reg[i-1];
shift_reg[0] <= data_in; // Всегда записываем новые данные
end
end
endmodule
Файл clk_divider.v: модуль clk_divider реализует делитель тактовой частоты с настраиваемым коэффициентом деления, формируя на выходе сигнал с пониженной частотой.
module freq_divider
#(parameter DIVIDER = 75000000)
(input wire clk,
output reg clk_out = 0);
reg [31:0] counter = 0;
always@(posedge clk)
begin
if (counter == DIVIDER - 1)
begin
counter <= 0;
clk_out <= ~clk_out;
end
else
begin
counter <= counter + 1;
end
end
endmodule
Файл shift_system.v: модуль shift_system объединяет все компоненты в единую систему. В его состав входят делитель частоты, сдвиговый регистр и шесть модулей преобразования кода. Модуль обрабатывает сигналы с тумблеров (sw) и входного тактового сигнала, обеспечивая последовательный вывод данных на шесть семисегментных индикаторов (hex0–hex5).
module shift_system
(input wire clk, reset,
input wire [8:0] data_input,
output wire [6:0] hex0, hex1, hex2, hex3, hex4, hex5);
wire slow_clk;
wire [3:0] reg_out_0, reg_out_1, reg_out_2, reg_out_3, reg_out_4, reg_out_5;
freq_divider div_inst
(
.clk(clk),
.clk_out(slow_clk)
);
shift_reg_6 reg_inst
(
.clk(slow_clk),
.reset(reset),
.data_in(data_input),
.data_out_0(reg_out_0),
.data_out_1(reg_out_1),
.data_out_2(reg_out_2),
.data_out_3(reg_out_3),
.data_out_4(reg_out_4),
.data_out_5(reg_out_5)
);
coder coder_inst_0 (.data(reg_out_0), .seg(hex0));
coder coder_inst_1 (.data(reg_out_1), .seg(hex1));
coder coder_inst_2 (.data(reg_out_2), .seg(hex2));
coder coder_inst_3 (.data(reg_out_3), .seg(hex3));
coder coder_inst_4 (.data(reg_out_4), .seg(hex4));
coder coder_inst_5 (.data(reg_out_5), .seg(hex5));
endmodule
Wave
На временной диаграмме показан процесс работы 6-разрядного сдвигового регистра с последующим преобразованием данных для вывода на семисегментные индикаторы. При активном сигнале сброса (reset = 1) выполняется асинхронная очистка регистра, и все его разряды переходят в нулевое состояние. Это видно по тому, что индикаторы hex0–hex5 не отображают никаких символов. После перевода сигнала reset в 0 работа регистра разрешается, и по тактовым импульсам начинается сдвиг данных. Символы поочерёдно выводятся на индикаторы, начиная с самого правого, с последующим смещением влево. Диаграмма демонстрирует корректную работу механизма сдвига и модулей преобразования кода.
Рисунок 2 - Результат функциональной симуляции
Вывод
Функциональное моделирование в среде ModelSim подтвердило правильную работу всех блоков схемы: реализованы асинхронный сброс регистра, синхронный сдвиг данных и преобразование входных кодов в символы для формирования текстового сообщения. Работоспособность устройства дополнительно проверена с помощью тестового модуля, показавшего корректность сдвигового процесса: данные последовательно перемещаются по ячейкам регистра, формируя на индикаторах требуемую текстовую последовательность. Полученные результаты симуляции подтвердили корректность работы всех модулей и пригодность схемы для наглядного визуального отображения данных через семисегментные индикаторы.
Санкт-Петербург
2025 г.
