Добавил:
СПбГУТ * ИКСС * Программная инженерия Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

4 семестр / ППЭВС. 4 семестр. Лабораторные работы (09.05.20)

.pdf
Скачиваний:
36
Добавлен:
09.05.2020
Размер:
469.3 Кб
Скачать

Подготовительная работа «Работа с пакетом»

Порядок выполнения:

1.Запустить ModelSim, используя путь: Приложения — Программирование —

ModelSim Altera. Окно информации Altera закрыть.

2.Создать проект. Для этого в верхнем меню активировать File — New — Project. В окне Create Project записать имя проекта — Project Name. Прописать путь к проекту в своей директории — Project Location (через поиск). Обязательно проверить наличие по умолчанию библиотеки work. Проверить наличие записи исходного пути (Copy Settings From): /opt/altera15.0/modelsim_ase/modelsim.ini.

3.Создать новый файл. Для этого в открывшемся окне Add items to the Project выбрать Create New File. Записать имя, выбрать тип Verilog, а также проверить, что файл верхнего уровня.

4.Открыть поле файла через двойной клик по названию. Записать текст, сохранить.

5.Откомпилировать: Compile — Compile All. Компиляция без ошибок отмечается галочкой возле имени файла.

6.После успешной компиляции основного модуля создать новый файл для тестбенча.

Для этого правым кликом на поле под названием файла вызвать контекстное меню и выбрать Add to Project — New File. Записать имя, выбрать тип Verilog. Открыть поле файла, записать текст, сохранить.

7.Откомпилировать все файлы проекта: Compile — Compile All. Компиляция без ошибок отмечается галочкой возле имени файла.

8.При успешной компиляции запустить симуляцию: Simulate — Start Simulation.

9.В открывшемся окне библиотек раскрыть библиотеку work и отметить файл для

симуляции — тестбенч-файл. При этом должны открыться окна sim, Objects и Wave. Из окна Objects перенести название выводов в Wave: выделить их и правой кнопкой мыши вызвать контекстное меню, в котором выбрать Add Wave.

10.После добавления всех необходимых линий необходимо выполнить построение диаграммы. Для этого используется специальная панель инструментов, находящаяся в верхней части основного окна программы.

Перечислим по порядку панели и их назначение:

Restart — для перезапуска симуляции при изменении списка исследуемых линий.

Текстовое поле — для указания интервала времени, для которого необходимо выполнить симуляцию.

Run — для выполнения симуляций на заданный интервал времени.

ContinueRun — Для многократного выполнения симуляции на заданный интервал времени, пока не будет достигнута точка останова.

Run -All — используется для выполнения беспрерывной симуляции, пока не будет достигнута команда stop или break.

Break — для остановки запущенной симуляции.

Нажимаем Run -All.

После завершения анализа необходимо завершить работу симулятора: выбрать пункт меню Simulate — End Simulation.

Программа функционирования

Файл тестбенч

устройства

 

Кодер: coder.v

coder_tb.v

module coder

`timescale 1ns/10ps

(input wire [3:0] data,

module dms7_4_tb;

output wire [6:0] seg);

reg [3:0] test_in;

reg [6:0] code;

wire [6:0] test_out;

assign seg = code;

coder test (.data(test_in),

always @*

.seg(test_out));

case (data)

initial

4'b0000: code = 7'b1000000;

begin

4'b0001: code = 7'b1111001;

test_in = 4'b0000; #200;

4'b0010: code = 7'b0100100;

test_in = 4'b0001; #200;

4'b0011: code = 7'b0110000;

test_in = 4'b0010; #200;

 

test_in = 4'b0011; #200;

4'b0100: code = 7'b0011001;

test_in = 4'b0100; #200;

4'b0101: code = 7'b0010010;

test_in = 4'b0101; #200;

4'b0110: code = 7'b0000010;

test_in = 4'b0110; #200;

4'b0111: code = 7'b1111000;

test_in = 4'b0111; #200;

4'b1000: code = 7'b0000000;

test_in = 4'b1000; #200;

4'b1001: code = 7'b0010000;

test_in = 4'b1001; #200;

4'b1010: code = 7'b0001000;

test_in = 4'b1010; #200;

4'b1011: code = 7'b0000011;

test_in = 4'b1011; #200;

 

test_in = 4'b1100; #200;

4'b1100: code = 7'b1000110;

test_in = 4'b1101; #200;

4'b1101: code = 7'b0100001;

test_in = 4'b1110; #200;

4'b1110: code = 7'b0000110;

test_in = 4'b1111; #200;

4'b1111: code = 7'b0001110;

$stop;

endcase

end

endmodule

endmodule

Директива `timescale 1ns/10ps определяет единицу времени для симулятора — 1ns и единичный шаг — 10ps.

Лабораторная работа №1: «Проектирование двухмодульного КЦУ в CycloneV»

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

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

Порядок выполнения работы:

1.Открыть новый проект в ModelSim. Скопировать в него файлы кодера и демультиплексора, созданные на предыдущих занятиях.

2.Изменить файл демультиплексора, превратив устройство в 7 демультиплексоров, подключенных параллельным образом по адресной шине. Сохранить файл в проекте с новым именем, откомпилировать файлы.

3.Написать тестбенч для файла построения 7-ми демультиплексоров, откомпилировать, провести симуляцию, проверить её результат.

4.Записать результирующий файл устройства, состоящего из модулей кодера и подключенному к его выходу модулю 7 демультиплексоров. Откомпилировать файлы.

5.Записать тестбенч для результирующего файла, откомпилировать, провести симуляцию, проверить её результат.

6.При положительном результате функциональной симуляции перенести файлы основных модулей проекта в Quartus15. Для этого открыть Quartus15, создать в нем новый проект, добавив в него при создании 3 файла: файлы кодера, 7-ми демультиплексоров и результирующий.

7.Откомпилировать все файлы в Quartus15, предварительно поставив результирующий файл старшим в иерархии (вкладка Files).

8.Пользуясь приложением 3, произвести разводку выводов схемы для работы в макете таким образом, чтобы ввод числа осуществлялся с тумблеров SW9, SW8, SW7, SW6 (где SW9 — старший разряд), ввод адреса — SW1, SW0 (где SW1 — старший разряд). Вывод производить на сегментные индикаторы с 0-го по 3 -ий.

После компиляции файла планировщика ещё раз откомпилируйте файл верхнего уровня!

9.Пользуясь приложением 4, произвести программирование кристалла FPGA макета. Проверить работу устройства: устанавливаем адрес, устанавливаем число. Убедившись, что вывод производится, устанавливаем новый адрес и повторяем вывод любого числа.

Продемонстрировать работу преподавателю.

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

Лабораторная работа №2: «Проектирование элемента АЛУ в CycloneV»

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

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

op_a

 

s_y

 

 

y 4

 

hex

 

sum_4

latch_rgstr

5

 

 

op_b

sm

coder

 

 

 

 

 

 

 

 

op_c

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

led

 

 

 

 

 

 

 

 

 

 

 

 

sync

Порядок выполнения работы:

1.Открыть новый проект в ModelSim. Скопировать в него файл кодера, созданный на предыдущих занятиях.

2.Открыть новый файл и записать в него текст кода одноразрядного сумматора. Сохранить и скомпилировать файл.

Одноразрядный сумматор: 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

3.Написать тестбенч для файла одноразрядного сумматора, откомпилировать, провести симуляцию, проверить её результат.

4.Добавить в проект новый файл для 4-разрядного сумматора. Записать текст, сохранить, откомпилировать файл.

Четырехразрядный сумматор: 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

5.Написать тестбенч для файла 4-разрядного сумматора, откомпилировать, провести симуляцию, проверить её результат.

6.Добавить в проект новый файл для 5-разрядного регистра защелки. Записать текст, сохранить, откомпилировать файл.

Пятиразрядный регистр защелка: latch_rgstr.v

module latch_rgstr

#(parameter N=5)

(input wire [N-1:0] d_in, input wire clk,

output wire [N-1:0] d_out); reg [N-1:0] q;

assign d_out = q; always@ (posedge clk) begin

q <= d_in;

end endmodule

7.Написать тестбенч для файла 5-разрядного регистра-защелки, откомпилировать, провести симуляцию, проверить её результат.

8.Записать результирующий файл устройства, состоящего из модулей 4-разрядного сумматора, регистра-защелки и кодера. Откомпилировать файлы.

Результирующее устройство: latch_rgstr.v

module sum_rgstr_coder

(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

9.Записать тестбенч для результирующего файла, откомпилировать, провести симуляцию, проверить её результат.

10.При положительном результате функциональной симуляции перенести файлы основных модулей проекта в Quartus15. Для этого открыть Quartus15 создать в нем проект, добавив в него 5 файлов: файлы сумматоров, регистра-защелки, кодера и результирующий.

11.Откомпилировать все файлы в Quartus15, предварительно поставив результирующий файл старшим в иерархии (вкладка Files).

12.Пользуясь приложением 3, произвести разводку выводов схемы для работы в макете таким образом, чтобы ввод чисел осуществлялся с тумблеров SW9-SW6 (где SW9 — старший разряд) — первое слагаемое, SW5-SW2 (где SW5 — старший разряд) — второе слагаемое, вход переноса — с тумблера SW0. Частота подается с кнопки KEY(0). Вывод суммы производить на 1-ый сегментный индикатор. Вывод переноса на светодиод LEDR1. После компиляции файла планировщика ещё

раз откомпилируйте файл верхнего уровня!

13.Пользуясь приложением 4, произвести программирование кристалла FPGA макета. Проверить работу устройства: устанавливаем любые числа на тумблерах, нажимаем крайнюю справа кнопку и проверяем результат.

Продемонстрировать работу преподавателю.

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

Лабораторная работа №3: «Проектирование двоичного счетчика в CycloneV»

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

Задание на проектирование. Спроектировать 4-разрядный реверсивный счетчик с возможностями асинхронного reset и синхронного res сбросов, синхронной загрузки состояния load и с разрешением счета ena. Частота sync подается на реверсивный счетчик от генератора через понижающий счетчик. Вывод состояний счетчика производится на 7-сегментный индикатор. Управляющие сигналы подаются с тумблеров макета. Загружаемое состояние также вводится с тумблеров.

Порядок выполнения работы:

1.Открыть новый проект в ModelSim. Скопировать в него файл кодера, созданный на предыдущих занятиях.

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

Реверсивный счетчик: count_par.v

module count_par

#(parameter N=4)

(input wire clk, reset, res, ena, rev, load, input wire [N-1:0] d,

output wire [N-1:0] q); reg [N-1:0] cnt, cnt_next; assign q = cnt;

always@ (posedge clk, negedge reset) cnt <= (reset) ? cnt_next : 0;

always@*

if (res) cnt_next = 0;

else if (load) cnt_next <= d;

else if (ena & !rev) cnt_next = cnt + 1; else if (ena & rev) cnt_next = cnt - 1; else cnt_next = cnt;

endmodule

3.Написать тестбенч для реверсивного счетчика, откомпилировать, провести симуляцию, проверить её результат.

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

Понижающий счетчик: count_div2.v

module count_div2

#(parameter N=4, M=4'd10) (input wire clk,

output reg sync=0, output wire [N-1:0] q); reg [N-1:0] cnt = 0; wire [N-1:0] cnt_next; assign q = cnt;

assign cnt_next = cnt + 1'b1; always@ (posedge clk)

begin

cnt <= cnt_next; sync <= sync;

if (cnt == M)

begin

cnt <= 0; sync <= ~sync;

end

end endmodule

Логика работы

Коэффициент счета M=4

5.Написать тестбенч для понижающего счетчика, откомпилировать, провести симуляцию, проверить её результат.

6.Записать результирующий файл устройства, состоящего из модулей понижающего счетчика, реверсивного счетчика и кодера. Откомпилировать файл.

7.Записать тестбенч для результирующего файла, откомпилировать, провести симуляцию, проверить её результат.

8.При положительном результате функциональной симуляции перенести файлы основных модулей проекта в Quartus15.

9.Откомпилировать все файлы в Quartus15, предварительно поставив результирующий файл старшим в иерархии (вкладка Files).

10.Пользуясь приложением 3, произвести разводку выводов схемы для работы в макете таким образом, чтобы ввод загружаемого состояния осуществлялся с тумблеров SW9-SW6 (где SW9 — старший разряд), асинхронный сброс (reset) с тумблера SW0, синхронный сброс (res) с тумблера SW1, разрешение счета (ena) с тумблера SW2, реверс (rev) с тумблера SW3, синхронная загрузка состояния (load)

с SW4. После компиляции файла планировщика необходимо снова

откомпилировать файл верхнего уровня!

11.Пользуясь приложением 4, произвести программирование кристалла FPGA макета. Проверить работу устройства. Порядок установки управлений должен соответствовать коду тестбенча.

Продемонстрировать работу преподавателю.

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

Лабораторная работа №4: «Проектирование сдвигающего регистра в CycloneV»

Цель работы. Изучение методов проектирования сдвигающего регистра с использованием пакетов ModelSim и Quartus15.

Задание на проектирование. Спроектировать устройство последовательного вывода четырехразрядных чисел, набираемых с тумблеров макета, на 6 семисегментных индикаторах. Предполагается использование кодера. Вывод должен производиться с частотой 1 Гц. (Тактовая частота кристалла в макете 50 МГц).

— 6 семисегментных индикаторов

Порядок выполнения работы:

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

Образец на основе фрагмента кода

Необходимо получить

 

 

Фрагмент кода

(input wire [7:0] data_in, input wire clk, …); integer i;

reg [7:0] shift_reg [15:0]; always@ (posedge clk) begin

for (i = 1; i < 16; i = i + 1) shift_reg[i] <= shift_reg[i – 1]

shift_reg[0] <= data_in;

end

2.Записать тестбенч для созданного модуля. Работа устройства может выглядеть так:

Продемонстрировать работу преподавателю.

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

Лабораторная работа №5: «Проектирование конечного автомата в CycloneV»

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

Задание на проектирование. Составить программу функционирования конечного автомата, который в зависимости от состояния управляющего бита m считывает числа с одного из портов (a или b) и выводит их на семисегментные индикаторы. В каждом цикле автомат ожидает подготовку данных в течение 3-х тактов. После вывода полученных данных автомат обнуляет счетчик тактов и уходит в режим ожидания.

S0 — начальное состояние (обнуление счетчика), переходящее в S1.

S1 — состояние счета, переходящее в S2, если счетчик имеет значение 2.

S2 — состояние счета, переходящее в S3, если выбран порт a, или в S4, если порт b. S3 — состояние счета, при котором в out4 загружаются данные порта a. Переход к

состоянию S5, если счетчик имеет значение 5.

S4 — состояние счета, при котором в out4 загружаются данные порта b. Переход к состоянию S5, если счетчик имеет значение 5.

S5 — состояние обнуления счетчика и out4, переходящее в S1. Состояние счета означает прибавление к текущему значению cnt единицы. Предполагается использование кодера.

Пример начального описания

module moore_lab

(input wire clk, m, reset, input wire [3:0] a, b, output reg [6:0] out7); reg [2:0] state;

reg [3:0] out4 = 0, cnt = 0;

parameter S0 = 0, S1 = 1, S2 = 2, S3 = 3, S4 = 4, S5 = 5;

always@ (posedge clk or posedge reset) // смена состояний begin

if (reset) state <= S0;

else case (state)

S0: state <= S1;

always@ (posedge clk) // действия внутри состояний begin

case (state) S0: begin

out4 <= 4'd0; cnt <= cnt;

end

Порядок выполнения работы:

1.Открыть новый проект в ModelSim. Записать код программы для конечного автомата, откомпилировать.

2.Написать тестбенч для конечного автомата, откомпилировать, провести симуляцию, проверить её результат.

Работа устройства может выглядеть так:

Продемонстрировать работу преподавателю.

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