Uploaded by Селим Смаилов

ЛР2 ПЦИС Смаилов

advertisement
Министерство науки и высшего образования Российской Федерации
ФГАОУ ВО «Севастопольский государственный университет»
Институт радиоэлектроники и информационной безопасности
Кафедра «Радиоэлектронные системы и технологии»
Лабораторная работа №2
«Проектирование комбинационных цепей с использованием языка
Verilog»
по дисциплине
«Программирование цифровых интегральных схем»
Выполнил студент Смаилов С. Ф.
Группа РС/с-18-1-о
Отметка о защите ____________
Преподаватель: ассистент
Савинов В. В.
Севастополь
2022
1. ОПИСАНИЕ ЛАБОРАТОРНОЙ РАБОТЫ
1.1. Цель работы
Целью
работы
является
приобретение
начальных
сведений
о
проектировании комбинационных цепей с использованием языка описания
аппаратуры Verilog на логическом(вентильном) уровне описания.
1.2. Здание на лабораторную работу
Необходимо
последовательности
спроектировать
(ПСП).
генератор
ПСП
псевдослучайной
представляет
собой
последовательность элементов di (i = 0, 1, 2, 3, …  — номер элемента
последовательности), повторяющихся с периодом N = 8, т. е. di + 8 = di.
Нулевой элемент последовательности d0 = 0, а каждый последующий,
начиная с d1 по d7, может принимать одно из двух значений: +1 или –1, в
зависимости
от
варианта
задания.
Первые
четыре
элемента
последовательности (d0, d1, d2, d3) выбираются согласно варианту (вариант
№19): 0, –1, +1, +1, а последующие четыре элемента определить по
следующему рекуррентному соотношению:
di= –di-3×di–1. (1)
Кроме того, каждый элемент последовательности (0, +1, –1) нужно
сформировать проектируемым генератором в 4-разрядном дополнительном
коде (элементу 0 соответствует код 0000, элементу +1 соответствует код 0001,
а элементу –1 соответствует код 1111).
Требуется разработать указанный генератор ПСП в виде модуля на языке
Verilog с использованием логического уровня описания и провести его
моделирование.
2. ВЫПОЛНЕНИЕ ЛАБОРАТОРНОЙ РАБОТЫ
2.1. Предварительный расчет
Рассчитаем используя формулу 1, значения последующий четырёх
элементов:
𝑑4 = 𝑑1 ∗ 𝑑3 = (−1) ∙ (+1) = −1;
𝑑5 = 𝑑2 ∗ 𝑑4 = (+1) ∙ (−1) = −1;
𝑑6 = 𝑑3 ∗ 𝑑5 = (+1) ∙ (−1) = −1;
𝑑7 = 𝑑4 ∗ 𝑑6 = (−1) ∙ (−1) = +1.
Значит:
𝑑𝑖 = 0; −1; +1; +1; −1: −1; −1; +1,
то есть:
𝑑𝑖 = 0; 0; 1; 1; 0: 0; 0; 1.
Исходя из полученной последовательности, составим СДНФ:
𝐹 = ̅̅̅𝑥
𝑥2 1 ̅̅̅̅̅
𝑥0 0 + ̅̅̅𝑥
𝑥2 1 𝑥0 + 𝑥2 𝑥1 𝑥0 .
Упростим полученную функцию:
𝐹 = ̅̅̅𝑥
𝑥2 1 ̅̅̅
𝑥0 + ̅̅̅𝑥
𝑥2 1 𝑥0 + 𝑥2 𝑥1 𝑥0 = ̅̅̅𝑥
𝑥2 1 ̅̅̅
𝑥0 + ̅̅̅𝑥
𝑥2 1 𝑥0 + 𝑥2 𝑥
̅̅̅𝑥
1 ̅̅̅
0 + 𝑥2 𝑥1 𝑥0
= ̅̅̅𝑥
𝑥2 0 (𝑥
̅̅̅1 + 𝑥1 ) + 𝑥2 (𝑥
̅̅̅𝑥
𝑥2 0 + 𝑥2 .
1 ̅̅̅
0 + 𝑥1 𝑥0 ) = ̅̅̅𝑥
2.2. Создание блоков
В программе будут использоваться 7 блоков:
 d_ff (D-триггер);
 t_ff (T-триггер);
 counter (модуль счётчика);
 genel (логический модуль);
 coder (модуль кодера);
 result (итоговый модуль);
 test_bench (блок испытательных сигналов).
2.2.1 Блок d_ff
`timescale 1ns/1ns
module d_ff
(
d,
clk.
reset,
q
);
input d;
input clk;
input reset;
output q;
reg q;
always @(posedge reset or negedge clk)
if (reset)
q<=1’b0;
else
q<=d;
endmodule
2.2.2. Блок t_ff
`timescale 1ns/1ns
module t_ff
(
reset,
clk,
q
);
output q;
input reset;
input clk;
wire d;
d_ff i_dff0
(
.d (d),
.reset (reset),
.clk (clk),
.q (q)
);
not i_not (d, q);
endmodule
2.2.3. Блок counter
`timescale 1ns/1ns
module counter
(
clk,reset,q
);
input clk;
input reset;
output [2:0] q;
t_ff i_tff0
(
.clk (clk),
.reset (reset),
.q (q[0])
);
t_ff i_tff1
(
.clk (q[0]),
.reset (reset),
.q (q[1])
);
t_ff i_tff2
(
.clk (q[1]),
.reset (reset),
.q (q[2])
);
Endmodule
2.2.4. Блок genel (генератор элементов отрезка)
module genel (x0,x1,x2,y); //Запись логики, исходя из выражения
input x0,x1,x2;
//(НЕ х2*х0+ х2)
output y;
assign y=~x2&x0|x1&~x0
endmodule
2.1.5. Блок coder
`timescale 1ns/1ns
module coder
(
input [3:0]a,
input [3:0]b,
input ctrl,
input en,
output [3:0]d,
wire [3:0]c
);
assign c=~(a|b);
assign d = en?c:(ctrl?a:b);
endmodule
2.1.6. Блок result
`timescale 1ns/1ns//Блок результата: счётчик+логика+кодер
module result (reset,clk,en,a,b,d);
input reset;
input clk;
input en;
input [3:0]a;
input [3:0]b;
output [3:0]d;
wire [2:0]q;
wire y;
wire [3:0]c;
counter i_counter0
(
.clk (clk),
.reset (reset),
.q (q)
);
genel i_genel0
(
.x0 (q[0]),
.x1 (q[1]),
.x2 (q[2]),
.y (y)
);
coder i_coder
(
.a (a),
.b (b),
.d (d),
.ctrl (y),
.en (en),
.c (c)
);
endmodule
2.1.7. Блок test_bench
`timescale 1ns/1ns//Модуль для теста
module test_bench;
reg clk;
reg en;
reg reset;
reg [3:0]a;
reg [3:0]b;
reg [3:0]c;
wire [2:0] q;
wire [3:0]d;
wire y;
result i_result
(
.clk (clk),
.reset (reset),
.a (a),
.b (b),
.d (d),
.en (en)
);
genel i_genel0
(
.x0 (q[0]),
.x1 (q[1]),
.x2 (q[2]),
.y (y)
);
counter i_counter
(
.clk (clk),
.reset (reset),
.q (q)
);
initial
begin
clk=0;
forever #5 clk=!clk;
end
initial
begin
en=0;
forever #20 en=!en;
end
initial
begin
a = 4'b0001;
b = 4'b1111;
c = ~(a|b);
reset = 1'b1;
#20 reset=1'b0;
#180 reset=1'b1;
#10 reset=1'b0;
#20 reset=1'b0;
#20 $stop;
end
initial $monitor($time,"Output q=%d",q);
initial $monitor($time,"Output y=%d",y);
initial $monitor($time,"Output d=%d",d);
endmodule
2.2. Результаты выполнения
В ходе симуляции программы были получены результаты, приведённые
на рисунке 2.1.
Рис. 2.1 — Диаграмма сигналов, полученных в результате симуляции
написанной программы
ВЫВОДЫ
В ходе выполнения лабораторной работы была произведена пошаговая
компиляция каждого блока, затем произведена настройка параметров,
необходимых
для
симуляции.
Далее
была
скомпилирована
работа
трехразрядного счётчика, состоящего из 3-х T-триггеров, в каждый из которых
входят по одному D-триггеру и одному инвертору. К счётчику был добавлен
блок логики и блок кодера. В текстовом объединении получилось устройство,
называемое генератором псевдослучайной последовательности.
Download