Министерство науки и высшего образования Российской Федерации ФГАОУ ВО «Севастопольский государственный университет» Институт радиоэлектроники и информационной безопасности Кафедра «Радиоэлектронные системы и технологии» Лабораторная работа №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-триггеру и одному инвертору. К счётчику был добавлен блок логики и блок кодера. В текстовом объединении получилось устройство, называемое генератором псевдослучайной последовательности.