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

ФЕДЕРАЛЬНОЕ АГЕНТСТВО СВЯЗИ

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

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

(СПбГУТ)

ФАКУЛЬТЕТ ИНФОРМАЦИОННЫХ ТЕХНОЛОГИЙ И ПРОГРАММНОЙ ИНЖЕНЕРИИ (ИТПИ)

КАФЕДРА ПРОГРАММНОЙ ИНЖЕНЕРИИ И ВЫЧИСЛИТЕЛЬНОЙ ТЕХНИКИ (ПИ И ВТ)

Дисциплина: «Архитектура распределенных вычислительных систем»

Лабораторная работа №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 г.