Скачиваний:
21
Добавлен:
03.01.2023
Размер:
537.8 Кб
Скачать

МИНОБРНАУКИ РОССИИ

Санкт-Петербургский государственный

электротехнический университет

«ЛЭТИ» им. В.И. Ульянова (Ленина)

Кафедра Вычислительной техники

отчЁт

по лабораторной работе №5

по дисциплине «Проектирование проблемно-ориентированных вычислительных устройств»

Тема: Проектирование операционных устройств

Студенты гр.

Преподаватель

Буренёва О.И.

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

2022

Цель работы

Практическое освоение темы предусматривает построение и моделирование устройства последовательного анализа разрядов входного слова по типовой схеме алгоритма с использованием предоставленных обучающемуся трафаретов программных модулей.

Задание на лабораторную работу

Рекомендуется придерживаться следующего порядка работы.

1. Создать в системе QuestaSIM новый проект, включив в него файлы Control.v, Struct_l5.v и Components.v.

2. Изобразить регистровую структуру и схему алгоритма по аналогии с рис. 5.1 и 5.2 в соответствии с индивидуальным заданием.

3. Модифицировать файлы Control.v и Struct_l5.v для реализации заданного алгоритма. При корректировке Struct_l5.v обращайте внимание на соответствие имен портов их образу в файле Componnents.v.

4. Разработать программу для тестирования, Генератор входных сигналов должен выдать до 100 выбранных тестовых кодов через интервалы времени, достаточные для обработки каждого тестового кода, и необходимые управляющие сигналы. В качестве образца целесообразно использовать файл Top.v.

5. Выполнить компиляцию файлов в порядке их вхождения в иерархию проекта.

6. Выполнить моделирование проекта и наблюдать временную диаграмму работы. Подтвердить правильность функционирования.

7. Выполнить имплементацию разработанного устройства в учебную плату, для чего перейти в САПР Quartus II и создать проект, указав семейство и тип микросхемы, установленной на учебной плате в соответствии с рекомендациями Приложения 2.

8. В рабочем каталоге проекта подготовить исходные файлы: файл с описанием спроектированного устройства, а также файл преобразователя двоичного кода в код символьного представления на семисегментном индикаторе, а также файл вершины проекта, в котором подключить выход устройства к входам преобразователя.

Подготовку файлов облегчает использование шаблонов, которые можно вызвать командой EditInsert Template, указав в появившемся окне язык проектирования и необходимый шаблон.

При написании кода преобразователя двоичного кода в код символьного представления на семисегментном индикаторе рекомендуется пользоваться схемой представления символов, приведенной на рис. 5.3. Фрагмент файла преобразователя приведен в листинге 5.5. В вариантах заданий 1 – 5 на индикатор будет выводится численное значение, в варианте 6 – символ, характеризующий четность или нечетность анализируемого кода.

9. Выполнить компиляцию проекта, проанализировать его RTL представление.

10. Моделировать поведение схемы. Перед началом моделирования установить связь между САПР Quartus II и моделирующей системой в соответствии с рекомендациями Приложения 3.

12. Выполнить загрузку проекта в учебную плату, наблюдать работу схемы на оборудовании. Исходные данные (анализируемый код) необходимо формировать на движковых переключателях, сигналы start и reset – на кнопках. Для вывода результата использовать семисегментный индикатор, сигнал ready вывести на светоизлучающий диод.

Вариант задания

В качестве индивидуальных заданий могут предлагаться такие:

1. Подсчет числа единиц (или нулей) во входном коде.

2. Определение позиции крайней левой (правой) единицы в коде.

3. Определение длины самой длинной плотной группы единиц в коде.

4. Определение количества переходов 0 → 1 в коде.

5. Определение количества переходов 1 ­→ 0 в коде.

6. Проверка входного слова на четность.

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

Различие вариантов состоит лишь в наборе действий, выполняемых после проверки значения очередного разряда.

В качестве варианта было выбрано задание 1: Подсчёт числа нулей во входном коде.

Выполнение работы

Структура операционного устройства представлена на рисунках 1 и 2.

Рисунок 1. Структура операционного устройства

Рисунок 2. Граф-схема алгоритма

На основе представленных структур, было описано устройство на языке Verilog.

Файл “tester.v” с модулем тестирования программы

module tests

(

start, // start program signal

reset, // reset signal

clock, // clk signal

ready, // finish signal

x

);

input ready;

output x, clock, start, reset;

wire ready;

reg clock, reset, start;

reg [7:0] x;

integer i, j;

parameter length = 6;

initial begin

clock = 0;

reset = 1;

#5;

reset = 0;

#5;

repeat (length)

begin

x = $urandom%20; //в Quartus модуль тестирования не должен пользоваться

start = 1;

// вечный цикл ожидания ready

for(j = 1; j < length; j = j + 1)

begin

#5

clock = 1;

#5

start = 0;

#5;

j = ready == 1? length: 1;

clock = 0;

// start = 0;

// #10;

#5;

// start = 1;

end

#5;

clock = 1;

#10;

clock = 0;

#5;

end

end

endmodule

module main_tester();

wire clock, reset, start, ready;

wire [7:0] in_data;

wire [3:0] out_data;

tests v1(

.start(start),

.reset(reset),

.clock(clock),

.ready(ready),

.x(in_data)

);

main v2(

.start(start),

.reset(reset),

.clock(clock),

.in_data(in_data),

.ready(ready),

.out_data(out_data)

);

endmodule

Файл “main.v

module main

#

(

parameter nOutputBits = 4,

nBits = 8

)

(

input wire start, // start program signal

input wire reset, // reset signal

input wire clock, // clk signal

input wire [nBits - 1 : 0] in_data, // sequence

output wire ready, // finish signal

output wire [nOutputBits - 1 : 0] out_data // number of zeroes

);

wire shiftedBit;

wire [1 : 0] ctrl_shift_reg, ctrl_counter;

counter_block v1(

.reset(reset),

.clock(clock),

.instruction(ctrl_counter),

.result(out_data)

);

shift_register_block v2(

.reset(reset),

.clock(clock),

.inputBits(in_data),

.instruction(ctrl_shift_reg),

.lastBit(shiftedBit)

);

control_block v3(

.start(start),

.reset(reset),

.clock(clock),

.shiftedBit(shiftedBit),

.ready(ready),

.ctrl_counter(ctrl_counter),

.ctrl_shift_reg(ctrl_shift_reg)

);

endmodule

Файл “counter.v” с модулем счётчика

/**

Модуль: Счетчик

Назначение: Подсчет количества нулевых битов в заданной последовательности битов

Пояснение по переменным:

- nBits: Количество битов результата (до 8, значит нужно 4 бита, тк 1000 - 8)

- load: Инструкция загрузки (см. описание instruction)

- zeroDetected: Инструкция обнаружения нуля (см. описание instruction)

- nZeros: Количество посчитанных нулей

- clock, reset: Сигналы Clock и сброса. Приходят извне

- instruction: двухбитовая инструкция. Приходит извне

Первый бит(shift_bit) - рассматриваемый бит(если ноль, то увеличиваем счетчик);

Второй бит(additional_bit) - Дополнительный бит двухразрядной инструкции (одного мало);

Инструкции:

00 - Инструкция, когда мы обнаружили, что сдвинутый бит - ноль

11 - Загрузка (Сбрасываем значение в ноль)

10, 01 - Инструкции, в которых мы никак на счетчик не влияем

- result: Итоговое количество нулей в последовательности. Выдается наружу

*/

module counter_block

#

(

parameter nBits = 4

)

(

input wire reset, // reset signal

input wire clock, // clk signal

input wire [1 : 0] instruction, // option to execute

output wire [nBits - 1 : 0] result // number of zeroes

);

parameter load = 2'b11;

parameter zeroDetected = 2'b00;

reg [nBits - 1 : 0] nZeros;

assign result = nZeros;

always @(posedge clock or posedge reset)

if (reset)

nZeros <= 0; //начальное состояние счетчика

else if (instruction == load)

nZeros <= 0; //начальное состояние счетчика

else if (instruction == zeroDetected)

nZeros <= nZeros + 1'b1;

endmodule

Файл “shift_register.v” с модулем сдвига

/**

Модуль: Сдвиг

Назначение: Сдвиг бита для дальнейшей проверки его на ноль

Пояснение по переменным:

- nBits: Количество битов результата (8)

- shiftLength: Длина сдвига (двигаем по одному)

- clock, reset: Сигналы Clock и сброса. Приходят извне

- instruction: двухбитовая инструкция. Приходит извне

Инструкции:

10, 01 - Сдвигаем бит

11 - Загрузка последовательности в локальную память

00 - Инструкция, в которой мы никак на блок не влияем

- inputBits: Входная последовательность битов

- lastBit: Сдвинутый бит (Обратная связь)

*/

module shift_register_block

#

(

parameter nBits = 8,

shiftLength = 1

)

(

input wire reset, // reset signal

input wire clock, // clk signal

input wire [nBits - 1 : 0] inputBits, // sequence

input wire [1 : 0] instruction, // option to execute

output wire lastBit // last bit from sequence

);

reg [nBits - 1 : 0] localMemory;

assign lastBit = localMemory[nBits - 1];

always @(posedge clock, posedge reset)

begin

if (reset)

localMemory <= 0;

else if (instruction == 2'b11)

localMemory <= inputBits;

else if (instruction == 2'b10 || instruction == 2'b01)

localMemory <= localMemory << shiftLength;

end

endmodule

Файл “control_block.v” с модулем управляющего блока

/**

Модуль: Управляющий блок

Назначение: Управление блоками control_block и counter_block

Пояснение по переменным:

- max: Максимальное возможное количество бит последовательности

- initialNumber: Начальное состояние счетчика

- nShifted: Текущее количество сдвинутых битов

- currentState: Текущее состояние

- nextState: Следующее состояние

- initState: Начальное состояние, все сброшено

- loadState: Состояние загрузки

- shiftState: Состояние, в котором сдвигается бит и возвращается обратная связь в control_block

- finalState: Состояние окончания (когда прошлись по всей последовательности )

- clock, reset: Сигналы clock и сброса. Приходят извне

- start: Сигнал начала

- shiftedBit: Рассматриваемый бит (сдвигается в данной итерации)

- ctrl_shift_reg: Инструкции для сдвигающего регистра

- ctrl_counter: Инструкции для счетчика

- ready: флаг окончания (Максимальное количество нулей в последовательности)

*/

module control_block

(

input wire start, // start program signal

input wire reset, // reset signal

input wire clock, // clk signal

input wire shiftedBit, // shifted bit

output reg ready, // finish signal

output reg [1 : 0] ctrl_counter, // counter option

output reg [1 : 0] ctrl_shift_reg // shift reg option

);

parameter max = 4'b1000;

parameter initialNumber = 4'b0000;

reg [3:0] nShifted;

localparam [1:0]

initState = 2'b00,

loadState = 2'b01,

shiftState = 2'b10,

finalState = 2'b11;

reg [1:0] currentState, nextState;

always @(posedge clock or posedge reset)

begin

currentState = reset? initState: nextState;

end

always @ (*)

begin

case (currentState)

initState:

begin

if (start)

begin

nextState = loadState;

ready = 0;

ctrl_shift_reg = 0;

ctrl_counter = 2'b11;

end

end

loadState:

begin

nextState = shiftState;

ready = 0;

ctrl_shift_reg = 2'b11;

ctrl_counter = 2'b11;

end

shiftState:

begin

ready = 0;

ctrl_counter = {shiftedBit, 1'b0};

ctrl_shift_reg = 2'b10;

nextState = nShifted == max? finalState: currentState;

end

finalState:

begin

ready = 1;

ctrl_counter = 2'b10;

ctrl_shift_reg = 0;

nextState = initState;

end

default:

begin

nextState = loadState;

ready = 0;

ctrl_shift_reg = 0;

ctrl_counter = 2'b11;

end

endcase

end

always @(negedge clock or posedge reset)

begin

if(reset)

nShifted = initialNumber;

else if(currentState != shiftState)

nShifted = initialNumber;

else

nShifted = nShifted + 1'b1;

end

endmodule

Результаты моделирования представлены на рисунке 3.

Рисунок 3. Временная диаграмма работы устройства

Исходя из временной диаграммы можно сказать, что устройство работает корректно, выдавая правильный результат на наш запрос.

Далее проведём синтез проекта, чтобы получить RTL (register transfer level). RTL представлены на рисунках 4 – 7.

Рисунок 4. Схема “counter_block”

Рисунок 5. Схема “shift_register_block”

Рисунок 6. Схема “control_block”

Рисунок 7. Схема операционного устройства

Вывод

В ходе выполнения лабораторной работы 5 «Проектирование операционных устройств» были изучены методы построения операционных устройств, процесс разработки операционного устройства. Далее были рассмотрены предоставляемые программы с образцами алгоритмов на языке Verilog, а также написаны собственные программы и тесты, проверяющие их корректность, на языке Verilog. Таким образом и было спроектировано операционное устройство.

PS. По-моему, тут надо что-то исправить, если забыл

Соседние файлы в предмете Проектирование проблемно-ориентированных вычислительных устройств