Файл: Мультиплексор, демультиплексор и селектор. Построение иерархических модулей Практическая работа 6 по направлению 09. 03.pdf

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 25.10.2023

Просмотров: 36

Скачиваний: 2

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ АВТОНОМНОЕ
ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ОБРАЗОВАНИЯ
«НАЦИОНАЛЬНЫЙ ИССЛЕДОВАТЕЛЬСКИЙ УНИВЕРСИТЕТ
«ВЫСШАЯ ШКОЛА ЭКОНОМИКИ»
Московский институт электроники и математики им. А.Н.Тихонова
«Мультиплексор, демультиплексор и селектор. Построение иерархических модулей»
Практическая работа №6 по направлению 09.03.01 Информатика и вычислительная техника
Проверил: Лежнев Евгений Владимирович
Выполнил: Степченко Александр Сергеевич
Корчагин Илья Александрович
БИВ196
Москва 2022 г

Оглавление
Дополнительное задание 1
....................................................................................................................... 3
Дополнительное задание 2
....................................................................................................................... 4
Дополнительное задание 3
....................................................................................................................... 5
Дополнительное задание 4
....................................................................................................................... 7
Дополнительное задание 5
....................................................................................................................... 9
Дополнительное задание 6
..................................................................................................................... 10
Основное задание
.................................................................................................................................... 11

Задания
Дополнительное задание 1
Разработать RTL-модель и тест для счетчика с предустановкой.
Листинг кода:
// Counter with load data module cnt_load
#( parameter WIDTH=16
)
( input clk, input rst_n, input load, input [WIDTH-1:0] data_load, output reg [WIDTH-1:0] cnt
); always@(posedge clk or negedge rst_n) begin:cnt_with_load if(!rst_n) cnt <= {WIDTH{1'b0}}; else if(load) cnt <= data_load; else cnt <= cnt + 1'b1; end endmodule // cnt_load
Тестбенч:
Рис. 1 Тест счетчика с предустановкой.
RTL-модуль:
Рис. 2 RTL представление счетчика с предустановкой.

Дополнительное задание 2
Разработать RTL-модель и тест счетчика управляемым направлением счета.
Сравнить результаты.
Листинг кода:
// Up-down counter module cnt_updown
#( parameter WIDTH=16
)
( input clk, input rst_n, input up_down, output reg [WIDTH-1:0] cnt
); always@(posedge clk or negedge rst_n) begin if(!rst_n) cnt <= {WIDTH{1'b0}}; else if(up_down) cnt <= cnt + 1'b1; else cnt <= cnt - 1'b1; end endmodule // cnt_updown
Тестбенч:
Рис. 3 Тест счетчика с управляемым направлением счета с высоким уровнем сигнала up_down.

Рис. 4 Тест счетчика с управляемым направлением счета с низким уровнем сигнала up_down.
Из тестов видно, что счетчик работает исправно. При низком уровне сигнала up_down выходной сигнал clk_out уменьшается, а при высоком уровне, увеличивается.
RTL-модуль:
Рис. 5 RTL представление счетчика с управляемым направлением счета.
Дополнительное задание 3
Провести симуляцию модуля cnt_div. Определить частоту выходного сигнала clk_out. Изменить код так, чтобы заполнение сигнала было 20%-50%
Листинг кода:
// Frequency clock divider module cnt_div
#( parameter DIV_CNT=10, parameter WIDTH = $clog2(DIV_CNT)
)
( input clk_in, input rst_n, output clk_out
); reg [WIDTH-1:0] cnt; always@(posedge clk_in or negedge rst_n) begin if(!rst_n) cnt <= {WIDTH{1'b0}}; else if(cnt == DIV_CNT-1)

cnt <= {WIDTH{1'b0}}; else cnt <= cnt + 1'b1; end assign clk_out = (cnt == 0) ? 1'b1 : 1'b0; endmodule // cnt_div
Тестбенч:
Рис. 6 Тест делителя частоты при частоте 10%.
Из теста видно, что заполнение сигнала 10%. Чтобы изменить этот параметр, нужно изменить условие в непрерывном присваивании clk_out
Например, чтобы изменить заполнение сигнала на 20%: assign clk_out = (cnt <2'b10) ? 1'b1 : 1'b0;
Рис. 7 Тест делителя частоты при частоте 20%.
Например, чтобы изменить заполнение сигнала на 50%: assign clk_out = (cnt <3'b101) ? 1'b1 : 1'b0;
Рис. 8 Тест делителя частоты при частоте 50%.
RTL-модуль:
Рис. 9 RTL представление делителя частоты.

Дополнительное задание 4
Проанализировать работу модуля pwm. Определить, в каких случаях светодиод будет светить ярче. Определить коэффициент заполнения выходного сигнала pwm_out для каждого случая. Проанализировать временные диаграммы. Разработать собственный модуль ШИМ.
Листинг кода:
//Simple PWM module pwm
#( parameter PWM_WIDTH=16
)
( input clk, input rst_n, input [PWM_WIDTH-1:0] imp_width, output pwm_out
); reg [PWM_WIDTH-1:0] cnt; always@(posedge clk or negedge rst_n) begin if(!rst_n) cnt <= {PWM_WIDTH{1'b0}}; else cnt <= cnt + 1'b1; end assign pwm_out = (imp_width > cnt) ? 1'b1 : 1'b0; endmodule // pwm
Тестбенч:
Рис. 10 Тест регулятора ШИМ.

Таблица коэффициентов заполнения:
Огранич ивающи й сигнал
Ограничи вающий сигнал в десятично й системе
Пери од входн ого сигна ла
Период выходно го сигнала
Фронт выходног о сигнала
Спад выхоного сигнала
Вычи сленн ое значе ние счетч ика
Коэффициент заполнения
0d
13 4
1024 1058000 1110000 13 5
37 35 8226000 8446000 35 21
C7 199 12322000 13118000 199 79 5a
90 14370000 14730000 90 35 6c
108 21538000 21790000 108 42 48 72 27970000 28706000 72 28
Ce
206 29730000 30554000 206 80 43 67 36898000 37166000 67 26 39 57 45090000 45318000 57 22 11 17 50210000 50278000 17 7
Рис. 11 Waveform регулятора ШИМ из учебника.
Из рисунка видно, что в первом случае частота заполнения меньше, чем во втором. Значит можно сделать вывод, что в втором случае лампа будет гореть ярче, чем в первом.
RTL-модуль:
Рис. 12 RTL представление регулятора ШИМ.

Дополнительное задание 5
Разработать RTL-модель и тест для счетчика Грея. Проанализировать полученные результаты.
Листинг кода: module gray_cnt
#( parameter WIDTH = 4
)
( input clk, input rst_n, input enable, output reg [WIDTH - 1 : 0] gray
); reg [WIDTH - 1 : 0] bin; wire [WIDTH - 1 : 0] bin_inc; wire [WIDTH - 1 : 0] bin_to_gray; always@(posedge clk or negedge rst_n) if(!rst_n)begin bin <= 0; gray <= 0; end else if(enable)begin bin <= bin_inc; gray <= bin_to_gray; end assign bin_inc = bin + 1'b1; assign bin_to_gray = bin_inc ^ (bin_inc >> 1); endmodule // gray_cnt
Тестбенч:
Рис. 13 Тест счетчика кода Грея.

RTL-модель:
Рис. 14 RTL представление счетчика кода Грея.
Дополнительное задание 6
Разработать RTL-модель и тест сдвигового регистра. Проанализировать полученные результаты.
Листинг кода: module shift_reg
#( parameter WIDTH=8
)
( input clk, input rst_n, input data_in, input shift_en, output reg [WIDTH-1:0] data_out, output serial_out
); always@(posedge clk or negedge rst_n) begin if(!rst_n) data_out <= {WIDTH{1'b0}}; else if(shift_en) data_out <= {data_in,data_out[WIDTH-1:1]}; end assign serial_out = data_out[0]; endmodule // shift_reg


Тестбенч:
Рис. 15 Тест сдвигового регистра.
RTL-модель:
Рис. 14 RTL представление сдвигового регистра.
Основное задание
Листинг: module gray_cnt
#( parameter WIDTH = 4
)
( input clk, input rst_n, input enable, output reg [WIDTH - 1 : 0] gray
); reg [WIDTH - 1 : 0] bin; wire [WIDTH - 1 : 0] bin_inc; wire [WIDTH - 1 : 0] bin_to_gray; always@(posedge clk or negedge rst_n) if(!rst_n)begin bin <= 0; gray <= 0; end else if(enable)begin bin <= bin_inc; gray <= bin_to_gray;
end assign bin_inc = bin + 1'b1; assign bin_to_gray = bin_inc ^ (bin_inc >> 1); endmodule // gray_cnt module strobe_gen
#( parameter div=24 )
( input clk, input rst_n, output strobe
); reg [div-1:0] cnt; always@(posedge clk or negedge rst_n) if(!rst_n) cnt <= {div{1'b0}}; else cnt <= cnt + {{(div-1){1'b0}},1'b1}; assign strobe = (cnt[div-1:0] == {div{1'b1}}); endmodule // strobe_gen module led7 #( parameter COUNT = 1 //Quantity of used 7-segs leds
)( input [4*COUNT-1:0] data, output [8*COUNT-1:0] leds
); wire [3:0] in [0:COUNT-1]; reg [7:0] out [0:COUNT-1]; genvar i; generate for (i=0; i<=COUNT-1; i=i+1) begin : groups assign in[i] = data[4*i +: 4]; assign leds[8*i +: 8] = out[i]; always@ (in[i]) case (in[i]) //6543201 4'h0: out[i] = 8'b11000000;
4'h1: out[i] = 8'b11111001;
4'h2: out[i] = 8'b10100100;
4'h3: out[i] = 8'b10110000;
4'h4: out[i] = 8'b10011001;
4'h5: out[i] = 8'b10010010;
4'h6: out[i] = 8'b10000010;
4'h7: out[i] = 8'b11111000;
4'h8: out[i] = 8'b10000000;
4'h9: out[i] = 8'b10010000;
4'ha: out[i] = 8'b10001000;

4'hb: out[i] = 8'b10000011;
4'hc: out[i] = 8'b11000110;
4'hd: out[i] = 8'b10100001;
4'he: out[i] = 8'b10000110;
4'hf: out[i] = 8'b10001110; default: out[i] = 8'h7f; endcase end endgenerate endmodule module de10_lite
( input CLOCK_50, input [1:0] KEY, output [7:0] LEDR, output [7:0] HEX1, output [7:0] HEX0
); localparam cnt_size = 8; wire strobe; wire next_cnt; wire [cnt_size - 1:0] bin_to_led; wire [cnt_size - 1:0] gray_data; strobe_gen #(.div(24)) strobe_en
(
.clk ( CLOCK_50 ),
.rst_n ( KEY[0] ),
.strobe ( strobe )
); assign next_cnt = (!KEY[1]) ? strobe : 1'b0;
// Gray counter on ledr gray_cnt #(.WIDTH(cnt_size)) gcnt
(
.clk ( CLOCK_50 ),
.rst_n ( KEY[0] ),
.enable ( next_cnt ),
.gray ( gray_data )
); assign LEDR = gray_data; led7 #(.COUNT(2)) led7_inst
(
.data ( gray_data ),
.leds ( {HEX1,HEX0} )
); endmodule // de10_lite

Контрольные вопросы:

1. В чём основные отличия последовательных и комбинационных устройств?
Выходы комбинационных устройств однозначно определены их входами.
Последовательные схемы имеют состояние (определённую форму памяти).
2. Почему сложно разрабатывать асинхронные схемы, а в современной электронике большие асинхронные цифровые схемы практически не используются?
Процесс верификации асинхронных схем – сложная задача, требующая много сил и времени.
3. Опишите модель Хаффмана для последовательных устройств.
Состоит из входов, выходов, комбинационной логики и элементы хранения состояний. Отдельный блок реализует комбинационную логику, а другой хранит состояние.

4. Каково различие между блокирующим и неблокирующим присваиванием?
В неблокирующем присваивании вычисление значения не будет блокировать вычисление другого. Неблокирующее присваивание выполняется независимо от порядка.

5. К чему приведёт изменение порядка операций в блоке always?
Получится такая схема.

6. В каких случаях следует использовать блокирующее, а в каких – неблокирующее?
Блокирующие, когда цепочка вычислений, неблокирующее – параллельно.
7. Опишите порядок выполнения циклов симуляции в IEEE Verilog Standard.

8. В результате чего при синтезе возникают зашёлки, чем они опасны?
Когда не учитываются все возможные условия. Приводит к появлению трудностей при проведении верификации, временного анализа и при использовании технологии тестопригодного проектирования.
9. Для чего нужны счётчики? Какими они бывают? Опишите на Verilog пример простого счётчика.
Счётчики последовательно увеличивают или уменьшают значение в момент, когда происходит событие из списка чувствительности. Бывают с асинхронным сбросом, с предустановкой, с управляемым направлением счёта. Пример в лабораторной работе.

10. Для каких задач используется делитель частоты?
Делитель частоты используется для уменьшения частоты входного тактового сигнала.


11. Опишите что такое ШИМ, и для чего она применяется.
Широтно-импульсная модуляция используется для регулирования подаваемой к нагрузке мощности путём изменения времени полезной работы сигнала.
12. Как строится счётчик Грея? В чём его особенность? Опишите пример счётчика на
Verilog.
Каждое соседнее значение отличается друг от друга на 1 разряд. Пример в лабораторной работе.

13. Для чего нужны сдвиговые регистры? Каковы виды сдвиговых регистров?
Приведите пример сдвигового регистра на Verilog.
Сдвиговые регистры преобразуют поток последовательной информации в параллельный код и наоборот; обнаруживают маскированную последовательность. Бывают с сигналом разрешения, с линейной обратной связью
14. Что такое циклически избыточный код? Приведите области применения.
Алгоритм обнаружения ошибок. Используется в протоколах связи Ethernet, USB,
CAN, Modbus.
15. Приведите примеры периферийных устройств, используемых с отладочными платами ПЛИС; опишите процесс их подключения.
Матрица светодиодов, ультразвуковой дальномер, пьезоэлектрический излучатель.