Файл: А. Н. ТихоноваОсновы последовательностной логики. Управление энергопотреблением цифровой схемы.pdf
ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 25.10.2023
Просмотров: 25
Скачиваний: 2
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ АВТОНОМНОЕ
ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ОБРАЗОВАНИЯ
«НАЦИОНАЛЬНЫЙ ИССЛЕДОВАТЕЛЬСКИЙ УНИВЕРСИТЕТ
«ВЫСШАЯ ШКОЛА ЭКОНОМИКИ»
Московский институт электроники и математики им. А.Н.Тихонова
«Основы последовательностной логики. Управление энергопотреблением цифровой схемы»
Практическая работа №2
по направлению 09.03.01 Информатика и вычислительная техника студента образовательной программы бакалавриата
«Информатика и вычислительная техника»
Проверил:
Лежнев Евгений Владимирович
Выполнил:
Степченко Александр Сергеевич
Корчагин Илья Александрович
БИВ196
Москва 2022 г.
Содержание
Задания..........................................................................................................................................................3
Основное задание....................................................................................................................................3
Дополнительное задание 1.....................................................................................................................3
Дополнительное задание 2.....................................................................................................................3
Дополнительное задание 3.....................................................................................................................3
Дополнительное задание 4.....................................................................................................................3
Дополнительное задание 5.....................................................................................................................3
Дополнительное задание 6.....................................................................................................................3
Дополнительное задание 7.....................................................................................................................4
Дополнительное задание 8.....................................................................................................................4
Дополнительное задание 9.....................................................................................................................4
Дополнительное задание 10...................................................................................................................4
Выполнение работы.....................................................................................................................................4
Дополнительное задание 1.....................................................................................................................4
Дополнительное задание 2.....................................................................................................................7
Дополнительное задание 3...................................................................................................................11
Дополнительное задание 4...................................................................................................................12
Дополнительное задание 5...................................................................................................................13
Дополнительное задание 6...................................................................................................................14
Дополнительное задание 7...................................................................................................................18
Дополнительное задание 8...................................................................................................................19
Дополнительное задание 9...................................................................................................................20
Дополнительное задание 10.................................................................................................................21
Выводы........................................................................................................................................................22
Контрольные вопросы...............................................................................................................................22 2
Задания
Основное задание
Выполните все дополнительные задания данной главы.
Дополнительное задание 1
Используя опыт, полученный при создании двухступенчатого RS-триггера, самостоятельно разработайте на языке Verilog модуль, описывающий структуру JK-триггера, приведённую на рисунке 2.17.
Дополнительное задание 2
Используя созданные ранее D-триггер и JK-триггер, опишите Verilog-модули T-триггера
в соответствии с рис. 2.18 и самостоятельное постройте таблицу переходов данного триггера.
Дополнительное задание 3
Найти в сети интернет документ с рекомендациями по программированию на языке HDL
для ПЛИС производства компании Intel FPGA.
Дополнительное задание 4
Отредактируйте код D-защелки (листинг 2.16) так, чтобы входное значение сохранялось при низком уровне тактового сигнала. Скомпилируйте код и сравните его RTL-представление с рис. 2.23.
Дополнительное задание 5
Измените D-триггер, код которого приведён в листинге 2.17, так, чтобы он работал под управлением заднего фронта тактового сигнала. Для этого необходимо заменить ключевое слово
posedge на negedge. Скомпилируйте проект и сравните его RTL-представление с предыдущей реализацией на рисунке 2.25.
Дополнительное задание 6
Используя опыт, полученный при реализации D-триггера, самостоятельно отредактируйте код листинга 2.19. Проведите его моделирование, иммитируя все возможные комбинации входных
3
сигналов, приведённые в таблице переходов на рис. 2.16. Сравните получаемые результаты с таблицей.
Аналогичным образом отредактируйте код листинга 2.18, добавив ещё одну кнопку.
Проверьте работоспособность JK-триггера, наблюдая за состоянием светодиода, подключённого к выходу. Сравните затраты ресурсов, необходимых для создания D-триггера и JK-триггера в RTL
Viewer.
Дополнительное задание 7
Неинвертированный синхронный сигнал сброса часто называют сигналом очистки.
Измените пример в листинге 2.20 для реализации D-триггера с сигналом очистки. Сравните его
RTL-представление с рис. 2.29.
Дополнительное задание 8
Добавьте в D-триггер асинхронный сброс с сигналом очистки, реализованным на предыдущем шаге. Модуль должен иметь положительный синхронный сигнал очистки и в тоже время асинхронный вход n_rst. Сравните его аппаратную реализацию (RTL-представление) с рис.
2.31.
Дополнительное задание 9
Измените активируемый триггер в листинге 2.24. Необходимо добавить синхронный положительный сигнал очистки и асинхронный сигнал n_rst. Сравните аппаратную реализацию
(RTL View) с рис. 2.35.
Дополнительное задание 10
Измените реализацию тригерра, приведённую в листинге 2.28. Добавьте положительный сигнал синхронной очистки, асинхронный сброс rst_n и сигнал разрешения работы en. Сравните аппаратную реализацию (RTL View) с рис. 2.37.
Выполнение работы
Дополнительное задание 1
Создадим проект в Quartus под названием lab_02. JK-триггер строиться на основе RS- триггера, поэтому сначала реализуем RS-триггер на элементах И-НЕ в файле sr_latch.v.
Получившаяся схема представлена на рисунке 1.
// sr_latch.v module sr_latch (
4
input s,
input r,
output q,
output q_n
);
assign q = (s & q_n);
assign q_n = (r & q);
endmodule
Рис. 1: Логическая схема RS-триггера в RTL Viewer
Разработаем модуль, описывающий структуру JK-триггера на рисунке 2.17 (а) типа защёлка.
// jk_latch.v module jk_latch (
input clk,
input j,
input k,
output q,
output q_n
);
wire nand1 = (clk & j & q_n);
wire nand2 = (clk & k & q);
5
sr_latch sr_latch(nand1, nand2, q, q_n);
endmodule
На рисунке 2 представлена логическая схема данной реализации триггера, открытая в RTL
Viewer для файла jk_latch.v, которая совпадает со схемой на рисунке 2.17 (а).
Рис. 2: Логическая схема, построенная по рисунку 2.17 (а)
Разработаем модуль, описывающий структуру JK-триггера на рисунке 2.17 (б) типа триггер.
// jk_flip_flop.v module jk_flip_flop (
input clk,
input j,
input k,
output q,
output q_n
);
wire g1 = (clk & j & q_n);
wire g2 = (clk & k & q);
6
wire q1, q1_n;
sr_latch master(g1, g2, q1, q1_n);
wire g5 = (g1 & q1);
wire g6 = (g2 & q1_n);
sr_latch slave(g5, g6, q, q_n);
endmodule
На рисунке 3 представлена логическая схема данной реализации триггера, открытая в RTL
Viewer для файла jk_flip_flop.v, которая совпадает со схемой на рисунке 2.17 (б).
Рис. 3: Логическая схема JK-триггера, построенная по рис 2.17 (б)
Дополнительное задание 2
Реализуем D-защёлку в файле d_latch.v на основе RS-триггера.
// d_latch.v module d_latch(
input clk,
input d,
7
output q,
output q_n
);
wire s = d & clk;
wire r = d & clk;
sr_latch sr_latch(s, r, q, q_n);
endmodule
Рис. 4: Логическая схема D-защёлки
Реализуем D-триггер в файле d_flip_flop.v.
// d_flip_flop.v module d_flip_flop(
input clk,
input d,
output q,
output q_n
);
wire n1;
d_latch master(
.clk(clk),
8
.d(d),
.q(n1)
);
d_latch slave(
.clk(clk),
.d(n1),
.q(q),
.q_n(q_n)
);
endmodule
Рис. 5: Логическая схема D-триггера
Построим таблицу переходов T-триггера.
Таблица 1
Таблица переходов T-триггера
CLK
T
Q
0→1 0
Q
prev
0→1 1
Q
prev
9
Реализуем T-триггер с использованием D-триггера в файле t_flip_flop_d.v.
// t_flip_flop_d.v module t_flip_flop_d (
input clk,
input t,
output q,
output q_n
);
wire d = t ^ q;
d_flip_flop d_flip_flop(
.clk(clk),
.d(d),
.q(q),
.q_n(q_n)
);
endmodule
Рис. 6: Логическая схема T-триггера с использованием D-триггера
Реализуем T-триггер с использованием JK-триггера в файле t_flip_flop_jk.v.
10
// t_flip_flop_jk.v module t_flip_flop_jk (
input clk,
input t,
output q,
output q_n
);
jk_flip_flop jk_flip_flop(
.clk(clk),
.j(t),
.k(t),
.q(q),
.q_n(q_n)
);
endmodule
Рис. 7: Логическая схема T-триггера с использованием JK-триггера
Дополнительное задание 3
Найдём в интернете рекомендации по программированию на HDL для ПЛИС производства компании Intel FPGA (рис. 8). Перейдём по первой ссылке.
http://www.gstitt.ece.ufl.edu/courses/spring10/eel4712/lectures/vhdl/qts_qii51007.pdf
11
Рис. 8: Поисковой запрос
Дополнительное задание 4
Отредактируем код D-защёлки так, чтобы входное значение сохранялось при низком уровне тактового сигнала. Для этого в условной конструкции поставим отрицание.
// d_latch.v module d_latch(
input clk,
input d,
output reg q
);
always @(clk or d)
if (!clk)
q <= d;
endmodule
Сравним RTL-представление данного кода (рис. 9) с рисунком 2.23. Отличие заключается в наличие инвертора на входе LATCH_ENABLE.
12
Рис. 9: RTL-представление D-защёлки после редактирования кода
Дополнительное задание 5
Отредактируем код D-триггера так, чтобы он работал под управлением заднего фронта тактового сигнала. Для этого заменим posedge на negedge.
// d_flip_flop.v module d_flip_flop(
input clk,
input d,
output reg q
);
always @ (negedge clk)
q <= d;
endmodule
Сравним RTL-представление данного кода (рис. ) с рисунком 2.25. Отличие заключается в наличие инвертора на входе CLK.
13
Рис. 10: RTL-представление D-триггера после редактирования кода
Дополнительное задание 6
Реализуем аппаратно JK-триггер.
// de10_lite.v module de10_lite(
input ADC_CLK_10,
input MAX10_CLK1_50,
input MAX10_CLK2_50,
input [ 1:0] KEY,
input [ 9:0] SW,
output [ 9:0] LEDR
);
assign LEDR[9:1] = 8'b0;
JKK JKK(
.CLK ( KEY [0] ),
.J ( KEY [1] ),
.K ( SW [0] ),
.Q ( LEDR[0] )
14
);
endmodule
Рис. 11: RTL-представление JK-триггера
Отредактируем код JK-триггера так, чтобы он работал под управлением заднего фронта тактового сигнала. Для этого заменим posedge на negedge.
// JKK.v module JKK(
input J,
input K,
input CLK,
output reg Q
);
always @(negedge CLK)
begin if (J && K)
Q <= Q;
else if (J && K)
Q <= 1;
else if (J && K)
Q <= 0;
end endmodule
Проведём моделирование отредактированного кода, имитируя всевозможные комбинации входных сигналов, приведённых в таблице переходов на рис 2.16.
15
Рис. 12: Временная диаграмма JK-триггера под управлением заднего фронта тактового сигнала
Из рисунка 12 видно, что JK-триггер работает в соответствии с таблицей переходов за исключением того, что переключение происходит по заднему фронту тактового сигнала.
Проверим работоспособность JK-триггера, наблюдая за состоянием светодиода,
подключённого к выходу. Для больше наглядности, светодиоды LEDR[1], LEDR[2] и LEDR[3]
подключены к сигналам CLK, J и K, соответственно.
Рис. 13: Проверка работоспособности JK-триггера CLK=0, J=1, K=1, Q=1 16
Рис. 14: Проверка работоспособности JK-триггера CLK=1, J=1, K=1, Q=1
Рис. 15: Проверка работоспособности JK-триггера CLK=0, J=1, K=1, Q=0 (Q_prev = 1)
17
Из рисунков 10 и 11 видно, что затраты ресурсов, необходимых для создания JK-триггера больше, чем для D-триггера, на 8 элементов (2 НЕ, 3 И, 3 мультиплексора). D-триггер, в свою очередь, не требует дополнительной комбинационной схемы.
Дополнительное задание 7
Изменим пример в листинге 2.20 для реализации D-триггера с сигналом очистки. Для этого уберём отрицание в условной конструкции.
// dff_sync_rst_n.v module dff_sync_rst_n (
input clk,
input rst_n,
input d,
output reg q
);
always @(posedge clk)
if (rst_n)
q <= 0;
else q <= d;
endmodule
Сравним RTL-представление данной реализации с рисунком 2.29. Из рисунка 16 видно, что единственное отличие заключется в мультиплексоре. В данном случае сигнал d передается при rst_n=0, иначе 0.
Рис. 16: Реализация D-триггера с синхронной очисткой
18
Дополнительное задание 8
Добавим в D-триггер асинхронный сброс (rst_n) и синхронный сигнал очистки (clr).
// dff_async_rst_n_clr.v module dff_async_rst_n_clr(
input clk,
input rst_n,
input clr,
input d,
output reg q
);
always @(posedge clk or negedge rst_n)
if (!rst_n)
q <= 0;
else if (clr)
q <= 0;
else q <= d;
endmodule
Запишем аппаратную реализацию D-триггера с асинхронныи сбросом и синхронным сигналом очистки.
// de10_lite.v module de10_lite(
input ADC_CLK_10,
input MAX10_CLK1_50,
input MAX10_CLK2_50,
input [ 1:0] KEY,
input [ 9:0] SW,
output [ 9:0] LEDR
);
assign LEDR[9:1] = 8'b0;
dff_async_rst_n_clr dff_async_rst_n_clr(
.clk ( KEY [0] ),
.rst_n ( SW [0] ),
.clr ( SW [1] ),
19
.d ( KEY [1] ),
.q ( LEDR[0] )
);
endmodule
Рис. 17: RTL-представление D-триггера с асинхронным сигналом сброса и синхронным сигналом очистки
Из рисунка 17 видно, что для реализации синхронного сигнала очистки необходим дополнительный элемент (мультиплексор), в отличие от реализации асинхронного сигнала сброса.
Дополнительное задание 9
Добавим синхронный положительный сигнал очистки и асинхронный сигнал n_rst.
// dff_with_en_clr_rst_n.v module dff_with_en_clr_rst_n(
input clk,
input en,
input clr,
input rst_n,
input d,
output reg q
);
always @(posedge clk or negedge rst_n)
if (!rst_n)
q <= 0;
else if (clr)
q <= 0;
else if (en)
q <= d;
endmodule
20
Рис. 18: RTL-представление активируемого D-триггера с синхронным положительным сигналом очистки и асинхронным сигналом сброса
Из рисунка 18 видно, что при добавлении синхронного сигнала очистки, для реализация активируемого D-триггер необходимо два мультиплексора: один для очистки, второй для активации.
Дополнительное задание 10
Добавим положительный сигнал синхронной очистки (clr), асинхронный сброс rst_n и сигнал разрешения работы en.
// dff_with_en_clr_rst_n_param.v module dff_with_en_clr_rst_n_param #(
parameter WIDTH = 8,
RESET = 8'b0
)(
input clk,
input en,
input clr,
input rst_n,
input [WIDTH - 1:0] d,
output reg [WIDTH - 1:0] q
);
always @(posedge clk or negedge rst_n)
if (!rst_n)
q <= RESET;
21
else if (clr)
q <= RESET;
else if (en)
q <= d;
endmodule
Рис. 19: RTL-представление параметризированного активирующегося D-триггера с положительным сигналом синхронного сброса, асинхронным сбросом и сигналом разрешения работы
Из рисунка 19 видно, что как и в случае с непараметризированным триггером, при добавлении синхронного сигнала очистки, для реализации необходимо два мультиплексора.
Выводы
Бла-бла.
Контрольные вопросы
22
ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ АВТОНОМНОЕ
ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ОБРАЗОВАНИЯ
«НАЦИОНАЛЬНЫЙ ИССЛЕДОВАТЕЛЬСКИЙ УНИВЕРСИТЕТ
«ВЫСШАЯ ШКОЛА ЭКОНОМИКИ»
Московский институт электроники и математики им. А.Н.Тихонова
«Основы последовательностной логики. Управление энергопотреблением цифровой схемы»
Практическая работа №2
по направлению 09.03.01 Информатика и вычислительная техника студента образовательной программы бакалавриата
«Информатика и вычислительная техника»
Проверил:
Лежнев Евгений Владимирович
Выполнил:
Степченко Александр Сергеевич
Корчагин Илья Александрович
БИВ196
Москва 2022 г.
Содержание
Задания..........................................................................................................................................................3
Основное задание....................................................................................................................................3
Дополнительное задание 1.....................................................................................................................3
Дополнительное задание 2.....................................................................................................................3
Дополнительное задание 3.....................................................................................................................3
Дополнительное задание 4.....................................................................................................................3
Дополнительное задание 5.....................................................................................................................3
Дополнительное задание 6.....................................................................................................................3
Дополнительное задание 7.....................................................................................................................4
Дополнительное задание 8.....................................................................................................................4
Дополнительное задание 9.....................................................................................................................4
Дополнительное задание 10...................................................................................................................4
Выполнение работы.....................................................................................................................................4
Дополнительное задание 1.....................................................................................................................4
Дополнительное задание 2.....................................................................................................................7
Дополнительное задание 3...................................................................................................................11
Дополнительное задание 4...................................................................................................................12
Дополнительное задание 5...................................................................................................................13
Дополнительное задание 6...................................................................................................................14
Дополнительное задание 7...................................................................................................................18
Дополнительное задание 8...................................................................................................................19
Дополнительное задание 9...................................................................................................................20
Дополнительное задание 10.................................................................................................................21
Выводы........................................................................................................................................................22
Контрольные вопросы...............................................................................................................................22 2
Задания
Основное задание
Выполните все дополнительные задания данной главы.
Дополнительное задание 1
Используя опыт, полученный при создании двухступенчатого RS-триггера, самостоятельно разработайте на языке Verilog модуль, описывающий структуру JK-триггера, приведённую на рисунке 2.17.
Дополнительное задание 2
Используя созданные ранее D-триггер и JK-триггер, опишите Verilog-модули T-триггера
в соответствии с рис. 2.18 и самостоятельное постройте таблицу переходов данного триггера.
Дополнительное задание 3
Найти в сети интернет документ с рекомендациями по программированию на языке HDL
для ПЛИС производства компании Intel FPGA.
Дополнительное задание 4
Отредактируйте код D-защелки (листинг 2.16) так, чтобы входное значение сохранялось при низком уровне тактового сигнала. Скомпилируйте код и сравните его RTL-представление с рис. 2.23.
Дополнительное задание 5
Измените D-триггер, код которого приведён в листинге 2.17, так, чтобы он работал под управлением заднего фронта тактового сигнала. Для этого необходимо заменить ключевое слово
posedge на negedge. Скомпилируйте проект и сравните его RTL-представление с предыдущей реализацией на рисунке 2.25.
Дополнительное задание 6
Используя опыт, полученный при реализации D-триггера, самостоятельно отредактируйте код листинга 2.19. Проведите его моделирование, иммитируя все возможные комбинации входных
3
сигналов, приведённые в таблице переходов на рис. 2.16. Сравните получаемые результаты с таблицей.
Аналогичным образом отредактируйте код листинга 2.18, добавив ещё одну кнопку.
Проверьте работоспособность JK-триггера, наблюдая за состоянием светодиода, подключённого к выходу. Сравните затраты ресурсов, необходимых для создания D-триггера и JK-триггера в RTL
Viewer.
Дополнительное задание 7
Неинвертированный синхронный сигнал сброса часто называют сигналом очистки.
Измените пример в листинге 2.20 для реализации D-триггера с сигналом очистки. Сравните его
RTL-представление с рис. 2.29.
Дополнительное задание 8
Добавьте в D-триггер асинхронный сброс с сигналом очистки, реализованным на предыдущем шаге. Модуль должен иметь положительный синхронный сигнал очистки и в тоже время асинхронный вход n_rst. Сравните его аппаратную реализацию (RTL-представление) с рис.
2.31.
Дополнительное задание 9
Измените активируемый триггер в листинге 2.24. Необходимо добавить синхронный положительный сигнал очистки и асинхронный сигнал n_rst. Сравните аппаратную реализацию
(RTL View) с рис. 2.35.
Дополнительное задание 10
Измените реализацию тригерра, приведённую в листинге 2.28. Добавьте положительный сигнал синхронной очистки, асинхронный сброс rst_n и сигнал разрешения работы en. Сравните аппаратную реализацию (RTL View) с рис. 2.37.
Выполнение работы
Дополнительное задание 1
Создадим проект в Quartus под названием lab_02. JK-триггер строиться на основе RS- триггера, поэтому сначала реализуем RS-триггер на элементах И-НЕ в файле sr_latch.v.
Получившаяся схема представлена на рисунке 1.
// sr_latch.v module sr_latch (
4
input s,
input r,
output q,
output q_n
);
assign q = (s & q_n);
assign q_n = (r & q);
endmodule
Рис. 1: Логическая схема RS-триггера в RTL Viewer
Разработаем модуль, описывающий структуру JK-триггера на рисунке 2.17 (а) типа защёлка.
// jk_latch.v module jk_latch (
input clk,
input j,
input k,
output q,
output q_n
);
wire nand1 = (clk & j & q_n);
wire nand2 = (clk & k & q);
5
sr_latch sr_latch(nand1, nand2, q, q_n);
endmodule
На рисунке 2 представлена логическая схема данной реализации триггера, открытая в RTL
Viewer для файла jk_latch.v, которая совпадает со схемой на рисунке 2.17 (а).
Рис. 2: Логическая схема, построенная по рисунку 2.17 (а)
Разработаем модуль, описывающий структуру JK-триггера на рисунке 2.17 (б) типа триггер.
// jk_flip_flop.v module jk_flip_flop (
input clk,
input j,
input k,
output q,
output q_n
);
wire g1 = (clk & j & q_n);
wire g2 = (clk & k & q);
6
wire q1, q1_n;
sr_latch master(g1, g2, q1, q1_n);
wire g5 = (g1 & q1);
wire g6 = (g2 & q1_n);
sr_latch slave(g5, g6, q, q_n);
endmodule
На рисунке 3 представлена логическая схема данной реализации триггера, открытая в RTL
Viewer для файла jk_flip_flop.v, которая совпадает со схемой на рисунке 2.17 (б).
Рис. 3: Логическая схема JK-триггера, построенная по рис 2.17 (б)
Дополнительное задание 2
Реализуем D-защёлку в файле d_latch.v на основе RS-триггера.
// d_latch.v module d_latch(
input clk,
input d,
7
output q,
output q_n
);
wire s = d & clk;
wire r = d & clk;
sr_latch sr_latch(s, r, q, q_n);
endmodule
Рис. 4: Логическая схема D-защёлки
Реализуем D-триггер в файле d_flip_flop.v.
// d_flip_flop.v module d_flip_flop(
input clk,
input d,
output q,
output q_n
);
wire n1;
d_latch master(
.clk(clk),
8
.d(d),
.q(n1)
);
d_latch slave(
.clk(clk),
.d(n1),
.q(q),
.q_n(q_n)
);
endmodule
Рис. 5: Логическая схема D-триггера
Построим таблицу переходов T-триггера.
Таблица 1
Таблица переходов T-триггера
CLK
T
Q
0→1 0
Q
prev
0→1 1
Q
prev
9
Реализуем T-триггер с использованием D-триггера в файле t_flip_flop_d.v.
// t_flip_flop_d.v module t_flip_flop_d (
input clk,
input t,
output q,
output q_n
);
wire d = t ^ q;
d_flip_flop d_flip_flop(
.clk(clk),
.d(d),
.q(q),
.q_n(q_n)
);
endmodule
Рис. 6: Логическая схема T-триггера с использованием D-триггера
Реализуем T-триггер с использованием JK-триггера в файле t_flip_flop_jk.v.
10
// t_flip_flop_jk.v module t_flip_flop_jk (
input clk,
input t,
output q,
output q_n
);
jk_flip_flop jk_flip_flop(
.clk(clk),
.j(t),
.k(t),
.q(q),
.q_n(q_n)
);
endmodule
Рис. 7: Логическая схема T-триггера с использованием JK-триггера
Дополнительное задание 3
Найдём в интернете рекомендации по программированию на HDL для ПЛИС производства компании Intel FPGA (рис. 8). Перейдём по первой ссылке.
http://www.gstitt.ece.ufl.edu/courses/spring10/eel4712/lectures/vhdl/qts_qii51007.pdf
11
Рис. 8: Поисковой запрос
Дополнительное задание 4
Отредактируем код D-защёлки так, чтобы входное значение сохранялось при низком уровне тактового сигнала. Для этого в условной конструкции поставим отрицание.
// d_latch.v module d_latch(
input clk,
input d,
output reg q
);
always @(clk or d)
if (!clk)
q <= d;
endmodule
Сравним RTL-представление данного кода (рис. 9) с рисунком 2.23. Отличие заключается в наличие инвертора на входе LATCH_ENABLE.
12
Рис. 9: RTL-представление D-защёлки после редактирования кода
Дополнительное задание 5
Отредактируем код D-триггера так, чтобы он работал под управлением заднего фронта тактового сигнала. Для этого заменим posedge на negedge.
// d_flip_flop.v module d_flip_flop(
input clk,
input d,
output reg q
);
always @ (negedge clk)
q <= d;
endmodule
Сравним RTL-представление данного кода (рис. ) с рисунком 2.25. Отличие заключается в наличие инвертора на входе CLK.
13
Рис. 10: RTL-представление D-триггера после редактирования кода
Дополнительное задание 6
Реализуем аппаратно JK-триггер.
// de10_lite.v module de10_lite(
input ADC_CLK_10,
input MAX10_CLK1_50,
input MAX10_CLK2_50,
input [ 1:0] KEY,
input [ 9:0] SW,
output [ 9:0] LEDR
);
assign LEDR[9:1] = 8'b0;
JKK JKK(
.CLK ( KEY [0] ),
.J ( KEY [1] ),
.K ( SW [0] ),
.Q ( LEDR[0] )
14
);
endmodule
Рис. 11: RTL-представление JK-триггера
Отредактируем код JK-триггера так, чтобы он работал под управлением заднего фронта тактового сигнала. Для этого заменим posedge на negedge.
// JKK.v module JKK(
input J,
input K,
input CLK,
output reg Q
);
always @(negedge CLK)
begin if (J && K)
Q <= Q;
else if (J && K)
Q <= 1;
else if (J && K)
Q <= 0;
end endmodule
Проведём моделирование отредактированного кода, имитируя всевозможные комбинации входных сигналов, приведённых в таблице переходов на рис 2.16.
15
Рис. 12: Временная диаграмма JK-триггера под управлением заднего фронта тактового сигнала
Из рисунка 12 видно, что JK-триггер работает в соответствии с таблицей переходов за исключением того, что переключение происходит по заднему фронту тактового сигнала.
Проверим работоспособность JK-триггера, наблюдая за состоянием светодиода,
подключённого к выходу. Для больше наглядности, светодиоды LEDR[1], LEDR[2] и LEDR[3]
подключены к сигналам CLK, J и K, соответственно.
Рис. 13: Проверка работоспособности JK-триггера CLK=0, J=1, K=1, Q=1 16
Рис. 14: Проверка работоспособности JK-триггера CLK=1, J=1, K=1, Q=1
Рис. 15: Проверка работоспособности JK-триггера CLK=0, J=1, K=1, Q=0 (Q_prev = 1)
17
Из рисунков 10 и 11 видно, что затраты ресурсов, необходимых для создания JK-триггера больше, чем для D-триггера, на 8 элементов (2 НЕ, 3 И, 3 мультиплексора). D-триггер, в свою очередь, не требует дополнительной комбинационной схемы.
Дополнительное задание 7
Изменим пример в листинге 2.20 для реализации D-триггера с сигналом очистки. Для этого уберём отрицание в условной конструкции.
// dff_sync_rst_n.v module dff_sync_rst_n (
input clk,
input rst_n,
input d,
output reg q
);
always @(posedge clk)
if (rst_n)
q <= 0;
else q <= d;
endmodule
Сравним RTL-представление данной реализации с рисунком 2.29. Из рисунка 16 видно, что единственное отличие заключется в мультиплексоре. В данном случае сигнал d передается при rst_n=0, иначе 0.
Рис. 16: Реализация D-триггера с синхронной очисткой
18
Дополнительное задание 8
Добавим в D-триггер асинхронный сброс (rst_n) и синхронный сигнал очистки (clr).
// dff_async_rst_n_clr.v module dff_async_rst_n_clr(
input clk,
input rst_n,
input clr,
input d,
output reg q
);
always @(posedge clk or negedge rst_n)
if (!rst_n)
q <= 0;
else if (clr)
q <= 0;
else q <= d;
endmodule
Запишем аппаратную реализацию D-триггера с асинхронныи сбросом и синхронным сигналом очистки.
// de10_lite.v module de10_lite(
input ADC_CLK_10,
input MAX10_CLK1_50,
input MAX10_CLK2_50,
input [ 1:0] KEY,
input [ 9:0] SW,
output [ 9:0] LEDR
);
assign LEDR[9:1] = 8'b0;
dff_async_rst_n_clr dff_async_rst_n_clr(
.clk ( KEY [0] ),
.rst_n ( SW [0] ),
.clr ( SW [1] ),
19
.d ( KEY [1] ),
.q ( LEDR[0] )
);
endmodule
Рис. 17: RTL-представление D-триггера с асинхронным сигналом сброса и синхронным сигналом очистки
Из рисунка 17 видно, что для реализации синхронного сигнала очистки необходим дополнительный элемент (мультиплексор), в отличие от реализации асинхронного сигнала сброса.
Дополнительное задание 9
Добавим синхронный положительный сигнал очистки и асинхронный сигнал n_rst.
// dff_with_en_clr_rst_n.v module dff_with_en_clr_rst_n(
input clk,
input en,
input clr,
input rst_n,
input d,
output reg q
);
always @(posedge clk or negedge rst_n)
if (!rst_n)
q <= 0;
else if (clr)
q <= 0;
else if (en)
q <= d;
endmodule
20
Рис. 18: RTL-представление активируемого D-триггера с синхронным положительным сигналом очистки и асинхронным сигналом сброса
Из рисунка 18 видно, что при добавлении синхронного сигнала очистки, для реализация активируемого D-триггер необходимо два мультиплексора: один для очистки, второй для активации.
Дополнительное задание 10
Добавим положительный сигнал синхронной очистки (clr), асинхронный сброс rst_n и сигнал разрешения работы en.
// dff_with_en_clr_rst_n_param.v module dff_with_en_clr_rst_n_param #(
parameter WIDTH = 8,
RESET = 8'b0
)(
input clk,
input en,
input clr,
input rst_n,
input [WIDTH - 1:0] d,
output reg [WIDTH - 1:0] q
);
always @(posedge clk or negedge rst_n)
if (!rst_n)
q <= RESET;
21
else if (clr)
q <= RESET;
else if (en)
q <= d;
endmodule
Рис. 19: RTL-представление параметризированного активирующегося D-триггера с положительным сигналом синхронного сброса, асинхронным сбросом и сигналом разрешения работы
Из рисунка 19 видно, что как и в случае с непараметризированным триггером, при добавлении синхронного сигнала очистки, для реализации необходимо два мультиплексора.
Выводы
Бла-бла.
Контрольные вопросы
22
ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ АВТОНОМНОЕ
ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ОБРАЗОВАНИЯ
«НАЦИОНАЛЬНЫЙ ИССЛЕДОВАТЕЛЬСКИЙ УНИВЕРСИТЕТ
«ВЫСШАЯ ШКОЛА ЭКОНОМИКИ»
Московский институт электроники и математики им. А.Н.Тихонова
«Основы последовательностной логики. Управление энергопотреблением цифровой схемы»
Практическая работа №2
по направлению 09.03.01 Информатика и вычислительная техника студента образовательной программы бакалавриата
«Информатика и вычислительная техника»
Проверил:
Лежнев Евгений Владимирович
Выполнил:
Степченко Александр Сергеевич
Корчагин Илья Александрович
БИВ196
Москва 2022 г.
Содержание
Задания..........................................................................................................................................................3
Основное задание....................................................................................................................................3
Дополнительное задание 1.....................................................................................................................3
Дополнительное задание 2.....................................................................................................................3
Дополнительное задание 3.....................................................................................................................3
Дополнительное задание 4.....................................................................................................................3
Дополнительное задание 5.....................................................................................................................3
Дополнительное задание 6.....................................................................................................................3
Дополнительное задание 7.....................................................................................................................4
Дополнительное задание 8.....................................................................................................................4
Дополнительное задание 9.....................................................................................................................4
Дополнительное задание 10...................................................................................................................4
Выполнение работы.....................................................................................................................................4
Дополнительное задание 1.....................................................................................................................4
Дополнительное задание 2.....................................................................................................................7
Дополнительное задание 3...................................................................................................................11
Дополнительное задание 4...................................................................................................................12
Дополнительное задание 5...................................................................................................................13
Дополнительное задание 6...................................................................................................................14
Дополнительное задание 7...................................................................................................................18
Дополнительное задание 8...................................................................................................................19
Дополнительное задание 9...................................................................................................................20
Дополнительное задание 10.................................................................................................................21
Выводы........................................................................................................................................................22
Контрольные вопросы...............................................................................................................................22 2
Задания
Основное задание
Выполните все дополнительные задания данной главы.
Дополнительное задание 1
Используя опыт, полученный при создании двухступенчатого RS-триггера, самостоятельно разработайте на языке Verilog модуль, описывающий структуру JK-триггера, приведённую на рисунке 2.17.
Дополнительное задание 2
Используя созданные ранее D-триггер и JK-триггер, опишите Verilog-модули T-триггера
в соответствии с рис. 2.18 и самостоятельное постройте таблицу переходов данного триггера.
Дополнительное задание 3
Найти в сети интернет документ с рекомендациями по программированию на языке HDL
для ПЛИС производства компании Intel FPGA.
Дополнительное задание 4
Отредактируйте код D-защелки (листинг 2.16) так, чтобы входное значение сохранялось при низком уровне тактового сигнала. Скомпилируйте код и сравните его RTL-представление с рис. 2.23.
Дополнительное задание 5
Измените D-триггер, код которого приведён в листинге 2.17, так, чтобы он работал под управлением заднего фронта тактового сигнала. Для этого необходимо заменить ключевое слово
posedge на negedge. Скомпилируйте проект и сравните его RTL-представление с предыдущей реализацией на рисунке 2.25.
Дополнительное задание 6
Используя опыт, полученный при реализации D-триггера, самостоятельно отредактируйте код листинга 2.19. Проведите его моделирование, иммитируя все возможные комбинации входных
3
сигналов, приведённые в таблице переходов на рис. 2.16. Сравните получаемые результаты с таблицей.
Аналогичным образом отредактируйте код листинга 2.18, добавив ещё одну кнопку.
Проверьте работоспособность JK-триггера, наблюдая за состоянием светодиода, подключённого к выходу. Сравните затраты ресурсов, необходимых для создания D-триггера и JK-триггера в RTL
Viewer.
Дополнительное задание 7
Неинвертированный синхронный сигнал сброса часто называют сигналом очистки.
Измените пример в листинге 2.20 для реализации D-триггера с сигналом очистки. Сравните его
RTL-представление с рис. 2.29.
Дополнительное задание 8
Добавьте в D-триггер асинхронный сброс с сигналом очистки, реализованным на предыдущем шаге. Модуль должен иметь положительный синхронный сигнал очистки и в тоже время асинхронный вход n_rst. Сравните его аппаратную реализацию (RTL-представление) с рис.
2.31.
Дополнительное задание 9
Измените активируемый триггер в листинге 2.24. Необходимо добавить синхронный положительный сигнал очистки и асинхронный сигнал n_rst. Сравните аппаратную реализацию
(RTL View) с рис. 2.35.
Дополнительное задание 10
Измените реализацию тригерра, приведённую в листинге 2.28. Добавьте положительный сигнал синхронной очистки, асинхронный сброс rst_n и сигнал разрешения работы en. Сравните аппаратную реализацию (RTL View) с рис. 2.37.
Выполнение работы
Дополнительное задание 1
Создадим проект в Quartus под названием lab_02. JK-триггер строиться на основе RS- триггера, поэтому сначала реализуем RS-триггер на элементах И-НЕ в файле sr_latch.v.
Получившаяся схема представлена на рисунке 1.
// sr_latch.v module sr_latch (
4
input s,
input r,
output q,
output q_n
);
assign q = (s & q_n);
assign q_n = (r & q);
endmodule
Рис. 1: Логическая схема RS-триггера в RTL Viewer
Разработаем модуль, описывающий структуру JK-триггера на рисунке 2.17 (а) типа защёлка.
// jk_latch.v module jk_latch (
input clk,
input j,
input k,
output q,
output q_n
);
wire nand1 = (clk & j & q_n);
wire nand2 = (clk & k & q);
5
sr_latch sr_latch(nand1, nand2, q, q_n);
endmodule
На рисунке 2 представлена логическая схема данной реализации триггера, открытая в RTL
Viewer для файла jk_latch.v, которая совпадает со схемой на рисунке 2.17 (а).
Рис. 2: Логическая схема, построенная по рисунку 2.17 (а)
Разработаем модуль, описывающий структуру JK-триггера на рисунке 2.17 (б) типа триггер.
// jk_flip_flop.v module jk_flip_flop (
input clk,
input j,
input k,
output q,
output q_n
);
wire g1 = (clk & j & q_n);
wire g2 = (clk & k & q);
6
wire q1, q1_n;
sr_latch master(g1, g2, q1, q1_n);
wire g5 = (g1 & q1);
wire g6 = (g2 & q1_n);
sr_latch slave(g5, g6, q, q_n);
endmodule
На рисунке 3 представлена логическая схема данной реализации триггера, открытая в RTL
Viewer для файла jk_flip_flop.v, которая совпадает со схемой на рисунке 2.17 (б).
Рис. 3: Логическая схема JK-триггера, построенная по рис 2.17 (б)
Дополнительное задание 2
Реализуем D-защёлку в файле d_latch.v на основе RS-триггера.
// d_latch.v module d_latch(
input clk,
input d,
7
output q,
output q_n
);
wire s = d & clk;
wire r = d & clk;
sr_latch sr_latch(s, r, q, q_n);
endmodule
Рис. 4: Логическая схема D-защёлки
Реализуем D-триггер в файле d_flip_flop.v.
// d_flip_flop.v module d_flip_flop(
input clk,
input d,
output q,
output q_n
);
wire n1;
d_latch master(
.clk(clk),
8
.d(d),
.q(n1)
);
d_latch slave(
.clk(clk),
.d(n1),
.q(q),
.q_n(q_n)
);
endmodule
Рис. 5: Логическая схема D-триггера
Построим таблицу переходов T-триггера.
Таблица 1
Таблица переходов T-триггера
CLK
T
Q
0→1 0
Q
prev
0→1 1
Q
prev
9
Реализуем T-триггер с использованием D-триггера в файле t_flip_flop_d.v.
// t_flip_flop_d.v module t_flip_flop_d (
input clk,
input t,
output q,
output q_n
);
wire d = t ^ q;
d_flip_flop d_flip_flop(
.clk(clk),
.d(d),
.q(q),
.q_n(q_n)
);
endmodule
Рис. 6: Логическая схема T-триггера с использованием D-триггера
Реализуем T-триггер с использованием JK-триггера в файле t_flip_flop_jk.v.
10
// t_flip_flop_jk.v module t_flip_flop_jk (
input clk,
input t,
output q,
output q_n
);
jk_flip_flop jk_flip_flop(
.clk(clk),
.j(t),
.k(t),
.q(q),
.q_n(q_n)
);
endmodule
Рис. 7: Логическая схема T-триггера с использованием JK-триггера
Дополнительное задание 3
Найдём в интернете рекомендации по программированию на HDL для ПЛИС производства компании Intel FPGA (рис. 8). Перейдём по первой ссылке.
http://www.gstitt.ece.ufl.edu/courses/spring10/eel4712/lectures/vhdl/qts_qii51007.pdf
11
Рис. 8: Поисковой запрос
Дополнительное задание 4
Отредактируем код D-защёлки так, чтобы входное значение сохранялось при низком уровне тактового сигнала. Для этого в условной конструкции поставим отрицание.
// d_latch.v module d_latch(
input clk,
input d,
output reg q
);
always @(clk or d)
if (!clk)
q <= d;
endmodule
Сравним RTL-представление данного кода (рис. 9) с рисунком 2.23. Отличие заключается в наличие инвертора на входе LATCH_ENABLE.
12
Рис. 9: RTL-представление D-защёлки после редактирования кода
Дополнительное задание 5
Отредактируем код D-триггера так, чтобы он работал под управлением заднего фронта тактового сигнала. Для этого заменим posedge на negedge.
// d_flip_flop.v module d_flip_flop(
input clk,
input d,
output reg q
);
always @ (negedge clk)
q <= d;
endmodule
Сравним RTL-представление данного кода (рис. ) с рисунком 2.25. Отличие заключается в наличие инвертора на входе CLK.
13
Рис. 10: RTL-представление D-триггера после редактирования кода
Дополнительное задание 6
Реализуем аппаратно JK-триггер.
// de10_lite.v module de10_lite(
input ADC_CLK_10,
input MAX10_CLK1_50,
input MAX10_CLK2_50,
input [ 1:0] KEY,
input [ 9:0] SW,
output [ 9:0] LEDR
);
assign LEDR[9:1] = 8'b0;
JKK JKK(
.CLK ( KEY [0] ),
.J ( KEY [1] ),
.K ( SW [0] ),
.Q ( LEDR[0] )
14
);
endmodule
Рис. 11: RTL-представление JK-триггера
Отредактируем код JK-триггера так, чтобы он работал под управлением заднего фронта тактового сигнала. Для этого заменим posedge на negedge.
// JKK.v module JKK(
input J,
input K,
input CLK,
output reg Q
);
always @(negedge CLK)
begin if (J && K)
Q <= Q;
else if (J && K)
Q <= 1;
else if (J && K)
Q <= 0;
end endmodule
Проведём моделирование отредактированного кода, имитируя всевозможные комбинации входных сигналов, приведённых в таблице переходов на рис 2.16.
15
Рис. 12: Временная диаграмма JK-триггера под управлением заднего фронта тактового сигнала
Из рисунка 12 видно, что JK-триггер работает в соответствии с таблицей переходов за исключением того, что переключение происходит по заднему фронту тактового сигнала.
Проверим работоспособность JK-триггера, наблюдая за состоянием светодиода,
подключённого к выходу. Для больше наглядности, светодиоды LEDR[1], LEDR[2] и LEDR[3]
подключены к сигналам CLK, J и K, соответственно.
Рис. 13: Проверка работоспособности JK-триггера CLK=0, J=1, K=1, Q=1 16
Рис. 14: Проверка работоспособности JK-триггера CLK=1, J=1, K=1, Q=1
Рис. 15: Проверка работоспособности JK-триггера CLK=0, J=1, K=1, Q=0 (Q_prev = 1)
17
Из рисунков 10 и 11 видно, что затраты ресурсов, необходимых для создания JK-триггера больше, чем для D-триггера, на 8 элементов (2 НЕ, 3 И, 3 мультиплексора). D-триггер, в свою очередь, не требует дополнительной комбинационной схемы.
Дополнительное задание 7
Изменим пример в листинге 2.20 для реализации D-триггера с сигналом очистки. Для этого уберём отрицание в условной конструкции.
// dff_sync_rst_n.v module dff_sync_rst_n (
input clk,
input rst_n,
input d,
output reg q
);
always @(posedge clk)
if (rst_n)
q <= 0;
else q <= d;
endmodule
Сравним RTL-представление данной реализации с рисунком 2.29. Из рисунка 16 видно, что единственное отличие заключется в мультиплексоре. В данном случае сигнал d передается при rst_n=0, иначе 0.
Рис. 16: Реализация D-триггера с синхронной очисткой
18
Дополнительное задание 8
Добавим в D-триггер асинхронный сброс (rst_n) и синхронный сигнал очистки (clr).
// dff_async_rst_n_clr.v module dff_async_rst_n_clr(
input clk,
input rst_n,
input clr,
input d,
output reg q
);
always @(posedge clk or negedge rst_n)
if (!rst_n)
q <= 0;
else if (clr)
q <= 0;
else q <= d;
endmodule
Запишем аппаратную реализацию D-триггера с асинхронныи сбросом и синхронным сигналом очистки.
// de10_lite.v module de10_lite(
input ADC_CLK_10,
input MAX10_CLK1_50,
input MAX10_CLK2_50,
input [ 1:0] KEY,
input [ 9:0] SW,
output [ 9:0] LEDR
);
assign LEDR[9:1] = 8'b0;
dff_async_rst_n_clr dff_async_rst_n_clr(
.clk ( KEY [0] ),
.rst_n ( SW [0] ),
.clr ( SW [1] ),
19
.d ( KEY [1] ),
.q ( LEDR[0] )
);
endmodule
Рис. 17: RTL-представление D-триггера с асинхронным сигналом сброса и синхронным сигналом очистки
Из рисунка 17 видно, что для реализации синхронного сигнала очистки необходим дополнительный элемент (мультиплексор), в отличие от реализации асинхронного сигнала сброса.
Дополнительное задание 9
Добавим синхронный положительный сигнал очистки и асинхронный сигнал n_rst.
// dff_with_en_clr_rst_n.v module dff_with_en_clr_rst_n(
input clk,
input en,
input clr,
input rst_n,
input d,
output reg q
);
always @(posedge clk or negedge rst_n)
if (!rst_n)
q <= 0;
else if (clr)
q <= 0;
else if (en)
q <= d;
endmodule
20
Рис. 18: RTL-представление активируемого D-триггера с синхронным положительным сигналом очистки и асинхронным сигналом сброса
Из рисунка 18 видно, что при добавлении синхронного сигнала очистки, для реализация активируемого D-триггер необходимо два мультиплексора: один для очистки, второй для активации.
Дополнительное задание 10
Добавим положительный сигнал синхронной очистки (clr), асинхронный сброс rst_n и сигнал разрешения работы en.
// dff_with_en_clr_rst_n_param.v module dff_with_en_clr_rst_n_param #(
parameter WIDTH = 8,
RESET = 8'b0
)(
input clk,
input en,
input clr,
input rst_n,
input [WIDTH - 1:0] d,
output reg [WIDTH - 1:0] q
);
always @(posedge clk or negedge rst_n)
if (!rst_n)
q <= RESET;
21
else if (clr)
q <= RESET;
else if (en)
q <= d;
endmodule
Рис. 19: RTL-представление параметризированного активирующегося D-триггера с положительным сигналом синхронного сброса, асинхронным сбросом и сигналом разрешения работы
Из рисунка 19 видно, что как и в случае с непараметризированным триггером, при добавлении синхронного сигнала очистки, для реализации необходимо два мультиплексора.
Выводы
Бла-бла.
Контрольные вопросы
22
ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ АВТОНОМНОЕ
ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ОБРАЗОВАНИЯ
«НАЦИОНАЛЬНЫЙ ИССЛЕДОВАТЕЛЬСКИЙ УНИВЕРСИТЕТ
«ВЫСШАЯ ШКОЛА ЭКОНОМИКИ»
Московский институт электроники и математики им. А.Н.Тихонова
«Основы последовательностной логики. Управление энергопотреблением цифровой схемы»
Практическая работа №2
по направлению 09.03.01 Информатика и вычислительная техника студента образовательной программы бакалавриата
«Информатика и вычислительная техника»
Проверил:
Лежнев Евгений Владимирович
Выполнил:
Степченко Александр Сергеевич
Корчагин Илья Александрович
БИВ196
Москва 2022 г.
Содержание
Задания..........................................................................................................................................................3
Основное задание....................................................................................................................................3
Дополнительное задание 1.....................................................................................................................3
Дополнительное задание 2.....................................................................................................................3
Дополнительное задание 3.....................................................................................................................3
Дополнительное задание 4.....................................................................................................................3
Дополнительное задание 5.....................................................................................................................3
Дополнительное задание 6.....................................................................................................................3
Дополнительное задание 7.....................................................................................................................4
Дополнительное задание 8.....................................................................................................................4
Дополнительное задание 9.....................................................................................................................4
Дополнительное задание 10...................................................................................................................4
Выполнение работы.....................................................................................................................................4
Дополнительное задание 1.....................................................................................................................4
Дополнительное задание 2.....................................................................................................................7
Дополнительное задание 3...................................................................................................................11
Дополнительное задание 4...................................................................................................................12
Дополнительное задание 5...................................................................................................................13
Дополнительное задание 6...................................................................................................................14
Дополнительное задание 7...................................................................................................................18
Дополнительное задание 8...................................................................................................................19
Дополнительное задание 9...................................................................................................................20
Дополнительное задание 10.................................................................................................................21
Выводы........................................................................................................................................................22
Контрольные вопросы...............................................................................................................................22 2
Задания
Основное задание
Выполните все дополнительные задания данной главы.
Дополнительное задание 1
Используя опыт, полученный при создании двухступенчатого RS-триггера, самостоятельно разработайте на языке Verilog модуль, описывающий структуру JK-триггера, приведённую на рисунке 2.17.
Дополнительное задание 2
Используя созданные ранее D-триггер и JK-триггер, опишите Verilog-модули T-триггера
в соответствии с рис. 2.18 и самостоятельное постройте таблицу переходов данного триггера.
Дополнительное задание 3
Найти в сети интернет документ с рекомендациями по программированию на языке HDL
для ПЛИС производства компании Intel FPGA.
Дополнительное задание 4
Отредактируйте код D-защелки (листинг 2.16) так, чтобы входное значение сохранялось при низком уровне тактового сигнала. Скомпилируйте код и сравните его RTL-представление с рис. 2.23.
Дополнительное задание 5
Измените D-триггер, код которого приведён в листинге 2.17, так, чтобы он работал под управлением заднего фронта тактового сигнала. Для этого необходимо заменить ключевое слово
posedge на negedge. Скомпилируйте проект и сравните его RTL-представление с предыдущей реализацией на рисунке 2.25.
Дополнительное задание 6
Используя опыт, полученный при реализации D-триггера, самостоятельно отредактируйте код листинга 2.19. Проведите его моделирование, иммитируя все возможные комбинации входных
3
сигналов, приведённые в таблице переходов на рис. 2.16. Сравните получаемые результаты с таблицей.
Аналогичным образом отредактируйте код листинга 2.18, добавив ещё одну кнопку.
Проверьте работоспособность JK-триггера, наблюдая за состоянием светодиода, подключённого к выходу. Сравните затраты ресурсов, необходимых для создания D-триггера и JK-триггера в RTL
Viewer.
Дополнительное задание 7
Неинвертированный синхронный сигнал сброса часто называют сигналом очистки.
Измените пример в листинге 2.20 для реализации D-триггера с сигналом очистки. Сравните его
RTL-представление с рис. 2.29.
Дополнительное задание 8
Добавьте в D-триггер асинхронный сброс с сигналом очистки, реализованным на предыдущем шаге. Модуль должен иметь положительный синхронный сигнал очистки и в тоже время асинхронный вход n_rst. Сравните его аппаратную реализацию (RTL-представление) с рис.
2.31.
Дополнительное задание 9
Измените активируемый триггер в листинге 2.24. Необходимо добавить синхронный положительный сигнал очистки и асинхронный сигнал n_rst. Сравните аппаратную реализацию
(RTL View) с рис. 2.35.
Дополнительное задание 10
Измените реализацию тригерра, приведённую в листинге 2.28. Добавьте положительный сигнал синхронной очистки, асинхронный сброс rst_n и сигнал разрешения работы en. Сравните аппаратную реализацию (RTL View) с рис. 2.37.
Выполнение работы
Дополнительное задание 1
Создадим проект в Quartus под названием lab_02. JK-триггер строиться на основе RS- триггера, поэтому сначала реализуем RS-триггер на элементах И-НЕ в файле sr_latch.v.
Получившаяся схема представлена на рисунке 1.
// sr_latch.v module sr_latch (
4
input s,
input r,
output q,
output q_n
);
assign q = (s & q_n);
assign q_n = (r & q);
endmodule
Рис. 1: Логическая схема RS-триггера в RTL Viewer
Разработаем модуль, описывающий структуру JK-триггера на рисунке 2.17 (а) типа защёлка.
// jk_latch.v module jk_latch (
input clk,
input j,
input k,
output q,
output q_n
);
wire nand1 = (clk & j & q_n);
wire nand2 = (clk & k & q);
5
sr_latch sr_latch(nand1, nand2, q, q_n);
endmodule
На рисунке 2 представлена логическая схема данной реализации триггера, открытая в RTL
Viewer для файла jk_latch.v, которая совпадает со схемой на рисунке 2.17 (а).
Рис. 2: Логическая схема, построенная по рисунку 2.17 (а)
Разработаем модуль, описывающий структуру JK-триггера на рисунке 2.17 (б) типа триггер.
// jk_flip_flop.v module jk_flip_flop (
input clk,
input j,
input k,
output q,
output q_n
);
wire g1 = (clk & j & q_n);
wire g2 = (clk & k & q);
6
wire q1, q1_n;
sr_latch master(g1, g2, q1, q1_n);
wire g5 = (g1 & q1);
wire g6 = (g2 & q1_n);
sr_latch slave(g5, g6, q, q_n);
endmodule
На рисунке 3 представлена логическая схема данной реализации триггера, открытая в RTL
Viewer для файла jk_flip_flop.v, которая совпадает со схемой на рисунке 2.17 (б).
Рис. 3: Логическая схема JK-триггера, построенная по рис 2.17 (б)
Дополнительное задание 2
Реализуем D-защёлку в файле d_latch.v на основе RS-триггера.
// d_latch.v module d_latch(
input clk,
input d,
7
output q,
output q_n
);
wire s = d & clk;
wire r = d & clk;
sr_latch sr_latch(s, r, q, q_n);
endmodule
Рис. 4: Логическая схема D-защёлки
Реализуем D-триггер в файле d_flip_flop.v.
// d_flip_flop.v module d_flip_flop(
input clk,
input d,
output q,
output q_n
);
wire n1;
d_latch master(
.clk(clk),
8
.d(d),
.q(n1)
);
d_latch slave(
.clk(clk),
.d(n1),
.q(q),
.q_n(q_n)
);
endmodule
Рис. 5: Логическая схема D-триггера
Построим таблицу переходов T-триггера.
Таблица 1
Таблица переходов T-триггера
CLK
T
Q
0→1 0
Q
prev
0→1 1
Q
prev
9
Реализуем T-триггер с использованием D-триггера в файле t_flip_flop_d.v.
// t_flip_flop_d.v module t_flip_flop_d (
input clk,
input t,
output q,
output q_n
);
wire d = t ^ q;
d_flip_flop d_flip_flop(
.clk(clk),
.d(d),
.q(q),
.q_n(q_n)
);
endmodule
Рис. 6: Логическая схема T-триггера с использованием D-триггера
Реализуем T-триггер с использованием JK-триггера в файле t_flip_flop_jk.v.
10
// t_flip_flop_jk.v module t_flip_flop_jk (
input clk,
input t,
output q,
output q_n
);
jk_flip_flop jk_flip_flop(
.clk(clk),
.j(t),
.k(t),
.q(q),
.q_n(q_n)
);
endmodule
Рис. 7: Логическая схема T-триггера с использованием JK-триггера
Дополнительное задание 3
Найдём в интернете рекомендации по программированию на HDL для ПЛИС производства компании Intel FPGA (рис. 8). Перейдём по первой ссылке.
http://www.gstitt.ece.ufl.edu/courses/spring10/eel4712/lectures/vhdl/qts_qii51007.pdf
11
Рис. 8: Поисковой запрос
Дополнительное задание 4
Отредактируем код D-защёлки так, чтобы входное значение сохранялось при низком уровне тактового сигнала. Для этого в условной конструкции поставим отрицание.
// d_latch.v module d_latch(
input clk,
input d,
output reg q
);
always @(clk or d)
if (!clk)
q <= d;
endmodule
Сравним RTL-представление данного кода (рис. 9) с рисунком 2.23. Отличие заключается в наличие инвертора на входе LATCH_ENABLE.
12
Рис. 9: RTL-представление D-защёлки после редактирования кода
Дополнительное задание 5
Отредактируем код D-триггера так, чтобы он работал под управлением заднего фронта тактового сигнала. Для этого заменим posedge на negedge.
// d_flip_flop.v module d_flip_flop(
input clk,
input d,
output reg q
);
always @ (negedge clk)
q <= d;
endmodule
Сравним RTL-представление данного кода (рис. ) с рисунком 2.25. Отличие заключается в наличие инвертора на входе CLK.
13
Рис. 10: RTL-представление D-триггера после редактирования кода
Дополнительное задание 6
Реализуем аппаратно JK-триггер.
// de10_lite.v module de10_lite(
input ADC_CLK_10,
input MAX10_CLK1_50,
input MAX10_CLK2_50,
input [ 1:0] KEY,
input [ 9:0] SW,
output [ 9:0] LEDR
);
assign LEDR[9:1] = 8'b0;
JKK JKK(
.CLK ( KEY [0] ),
.J ( KEY [1] ),
.K ( SW [0] ),
.Q ( LEDR[0] )
14
);
endmodule
Рис. 11: RTL-представление JK-триггера
Отредактируем код JK-триггера так, чтобы он работал под управлением заднего фронта тактового сигнала. Для этого заменим posedge на negedge.
// JKK.v module JKK(
input J,
input K,
input CLK,
output reg Q
);
always @(negedge CLK)
begin if (J && K)
Q <= Q;
else if (J && K)
Q <= 1;
else if (J && K)
Q <= 0;
end endmodule
Проведём моделирование отредактированного кода, имитируя всевозможные комбинации входных сигналов, приведённых в таблице переходов на рис 2.16.
15
Рис. 12: Временная диаграмма JK-триггера под управлением заднего фронта тактового сигнала
Из рисунка 12 видно, что JK-триггер работает в соответствии с таблицей переходов за исключением того, что переключение происходит по заднему фронту тактового сигнала.
Проверим работоспособность JK-триггера, наблюдая за состоянием светодиода,
подключённого к выходу. Для больше наглядности, светодиоды LEDR[1], LEDR[2] и LEDR[3]
подключены к сигналам CLK, J и K, соответственно.
Рис. 13: Проверка работоспособности JK-триггера CLK=0, J=1, K=1, Q=1 16
Рис. 14: Проверка работоспособности JK-триггера CLK=1, J=1, K=1, Q=1
Рис. 15: Проверка работоспособности JK-триггера CLK=0, J=1, K=1, Q=0 (Q_prev = 1)
17
Из рисунков 10 и 11 видно, что затраты ресурсов, необходимых для создания JK-триггера больше, чем для D-триггера, на 8 элементов (2 НЕ, 3 И, 3 мультиплексора). D-триггер, в свою очередь, не требует дополнительной комбинационной схемы.
Дополнительное задание 7
Изменим пример в листинге 2.20 для реализации D-триггера с сигналом очистки. Для этого уберём отрицание в условной конструкции.
// dff_sync_rst_n.v module dff_sync_rst_n (
input clk,
input rst_n,
input d,
output reg q
);
always @(posedge clk)
if (rst_n)
q <= 0;
else q <= d;
endmodule
Сравним RTL-представление данной реализации с рисунком 2.29. Из рисунка 16 видно, что единственное отличие заключется в мультиплексоре. В данном случае сигнал d передается при rst_n=0, иначе 0.
Рис. 16: Реализация D-триггера с синхронной очисткой
18
Дополнительное задание 8
Добавим в D-триггер асинхронный сброс (rst_n) и синхронный сигнал очистки (clr).
// dff_async_rst_n_clr.v module dff_async_rst_n_clr(
input clk,
input rst_n,
input clr,
input d,
output reg q
);
always @(posedge clk or negedge rst_n)
if (!rst_n)
q <= 0;
else if (clr)
q <= 0;
else q <= d;
endmodule
Запишем аппаратную реализацию D-триггера с асинхронныи сбросом и синхронным сигналом очистки.
// de10_lite.v module de10_lite(
input ADC_CLK_10,
input MAX10_CLK1_50,
input MAX10_CLK2_50,
input [ 1:0] KEY,
input [ 9:0] SW,
output [ 9:0] LEDR
);
assign LEDR[9:1] = 8'b0;
dff_async_rst_n_clr dff_async_rst_n_clr(
.clk ( KEY [0] ),
.rst_n ( SW [0] ),
.clr ( SW [1] ),
19
.d ( KEY [1] ),
.q ( LEDR[0] )
);
endmodule
Рис. 17: RTL-представление D-триггера с асинхронным сигналом сброса и синхронным сигналом очистки
Из рисунка 17 видно, что для реализации синхронного сигнала очистки необходим дополнительный элемент (мультиплексор), в отличие от реализации асинхронного сигнала сброса.
Дополнительное задание 9
Добавим синхронный положительный сигнал очистки и асинхронный сигнал n_rst.
// dff_with_en_clr_rst_n.v module dff_with_en_clr_rst_n(
input clk,
input en,
input clr,
input rst_n,
input d,
output reg q
);
always @(posedge clk or negedge rst_n)
if (!rst_n)
q <= 0;
else if (clr)
q <= 0;
else if (en)
q <= d;
endmodule
20
Рис. 18: RTL-представление активируемого D-триггера с синхронным положительным сигналом очистки и асинхронным сигналом сброса
Из рисунка 18 видно, что при добавлении синхронного сигнала очистки, для реализация активируемого D-триггер необходимо два мультиплексора: один для очистки, второй для активации.
Дополнительное задание 10
Добавим положительный сигнал синхронной очистки (clr), асинхронный сброс rst_n и сигнал разрешения работы en.
// dff_with_en_clr_rst_n_param.v module dff_with_en_clr_rst_n_param #(
parameter WIDTH = 8,
RESET = 8'b0
)(
input clk,
input en,
input clr,
input rst_n,
input [WIDTH - 1:0] d,
output reg [WIDTH - 1:0] q
);
always @(posedge clk or negedge rst_n)
if (!rst_n)
q <= RESET;
21
else if (clr)
q <= RESET;
else if (en)
q <= d;
endmodule
Рис. 19: RTL-представление параметризированного активирующегося D-триггера с положительным сигналом синхронного сброса, асинхронным сбросом и сигналом разрешения работы
Из рисунка 19 видно, что как и в случае с непараметризированным триггером, при добавлении синхронного сигнала очистки, для реализации необходимо два мультиплексора.
Выводы
Бла-бла.
Контрольные вопросы
22
ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ АВТОНОМНОЕ
ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ОБРАЗОВАНИЯ
«НАЦИОНАЛЬНЫЙ ИССЛЕДОВАТЕЛЬСКИЙ УНИВЕРСИТЕТ
«ВЫСШАЯ ШКОЛА ЭКОНОМИКИ»
Московский институт электроники и математики им. А.Н.Тихонова
«Основы последовательностной логики. Управление энергопотреблением цифровой схемы»
Практическая работа №2
по направлению 09.03.01 Информатика и вычислительная техника студента образовательной программы бакалавриата
«Информатика и вычислительная техника»
Проверил:
Лежнев Евгений Владимирович
Выполнил:
Степченко Александр Сергеевич
Корчагин Илья Александрович
БИВ196
Москва 2022 г.
Содержание
Задания..........................................................................................................................................................3
Основное задание....................................................................................................................................3
Дополнительное задание 1.....................................................................................................................3
Дополнительное задание 2.....................................................................................................................3
Дополнительное задание 3.....................................................................................................................3
Дополнительное задание 4.....................................................................................................................3
Дополнительное задание 5.....................................................................................................................3
Дополнительное задание 6.....................................................................................................................3
Дополнительное задание 7.....................................................................................................................4
Дополнительное задание 8.....................................................................................................................4
Дополнительное задание 9.....................................................................................................................4
Дополнительное задание 10...................................................................................................................4
Выполнение работы.....................................................................................................................................4
Дополнительное задание 1.....................................................................................................................4
Дополнительное задание 2.....................................................................................................................7
Дополнительное задание 3...................................................................................................................11
Дополнительное задание 4...................................................................................................................12
Дополнительное задание 5...................................................................................................................13
Дополнительное задание 6...................................................................................................................14
Дополнительное задание 7...................................................................................................................18
Дополнительное задание 8...................................................................................................................19
Дополнительное задание 9...................................................................................................................20
Дополнительное задание 10.................................................................................................................21
Выводы........................................................................................................................................................22
Контрольные вопросы...............................................................................................................................22 2
Задания
Основное задание
Выполните все дополнительные задания данной главы.
Дополнительное задание 1
Используя опыт, полученный при создании двухступенчатого RS-триггера, самостоятельно разработайте на языке Verilog модуль, описывающий структуру JK-триггера, приведённую на рисунке 2.17.
Дополнительное задание 2
Используя созданные ранее D-триггер и JK-триггер, опишите Verilog-модули T-триггера
в соответствии с рис. 2.18 и самостоятельное постройте таблицу переходов данного триггера.
Дополнительное задание 3
Найти в сети интернет документ с рекомендациями по программированию на языке HDL
для ПЛИС производства компании Intel FPGA.
Дополнительное задание 4
Отредактируйте код D-защелки (листинг 2.16) так, чтобы входное значение сохранялось при низком уровне тактового сигнала. Скомпилируйте код и сравните его RTL-представление с рис. 2.23.
Дополнительное задание 5
Измените D-триггер, код которого приведён в листинге 2.17, так, чтобы он работал под управлением заднего фронта тактового сигнала. Для этого необходимо заменить ключевое слово
posedge на negedge. Скомпилируйте проект и сравните его RTL-представление с предыдущей реализацией на рисунке 2.25.
Дополнительное задание 6
Используя опыт, полученный при реализации D-триггера, самостоятельно отредактируйте код листинга 2.19. Проведите его моделирование, иммитируя все возможные комбинации входных
3
сигналов, приведённые в таблице переходов на рис. 2.16. Сравните получаемые результаты с таблицей.
Аналогичным образом отредактируйте код листинга 2.18, добавив ещё одну кнопку.
Проверьте работоспособность JK-триггера, наблюдая за состоянием светодиода, подключённого к выходу. Сравните затраты ресурсов, необходимых для создания D-триггера и JK-триггера в RTL
Viewer.
Дополнительное задание 7
Неинвертированный синхронный сигнал сброса часто называют сигналом очистки.
Измените пример в листинге 2.20 для реализации D-триггера с сигналом очистки. Сравните его
RTL-представление с рис. 2.29.
Дополнительное задание 8
Добавьте в D-триггер асинхронный сброс с сигналом очистки, реализованным на предыдущем шаге. Модуль должен иметь положительный синхронный сигнал очистки и в тоже время асинхронный вход n_rst. Сравните его аппаратную реализацию (RTL-представление) с рис.
2.31.
Дополнительное задание 9
Измените активируемый триггер в листинге 2.24. Необходимо добавить синхронный положительный сигнал очистки и асинхронный сигнал n_rst. Сравните аппаратную реализацию
(RTL View) с рис. 2.35.
Дополнительное задание 10
Измените реализацию тригерра, приведённую в листинге 2.28. Добавьте положительный сигнал синхронной очистки, асинхронный сброс rst_n и сигнал разрешения работы en. Сравните аппаратную реализацию (RTL View) с рис. 2.37.
Выполнение работы
Дополнительное задание 1
Создадим проект в Quartus под названием lab_02. JK-триггер строиться на основе RS- триггера, поэтому сначала реализуем RS-триггер на элементах И-НЕ в файле sr_latch.v.
Получившаяся схема представлена на рисунке 1.
// sr_latch.v module sr_latch (
4
input s,
input r,
output q,
output q_n
);
assign q = (s & q_n);
assign q_n = (r & q);
endmodule
Рис. 1: Логическая схема RS-триггера в RTL Viewer
Разработаем модуль, описывающий структуру JK-триггера на рисунке 2.17 (а) типа защёлка.
// jk_latch.v module jk_latch (
input clk,
input j,
input k,
output q,
output q_n
);
wire nand1 = (clk & j & q_n);
wire nand2 = (clk & k & q);
5
sr_latch sr_latch(nand1, nand2, q, q_n);
endmodule
На рисунке 2 представлена логическая схема данной реализации триггера, открытая в RTL
Viewer для файла jk_latch.v, которая совпадает со схемой на рисунке 2.17 (а).
Рис. 2: Логическая схема, построенная по рисунку 2.17 (а)
Разработаем модуль, описывающий структуру JK-триггера на рисунке 2.17 (б) типа триггер.
// jk_flip_flop.v module jk_flip_flop (
input clk,
input j,
input k,
output q,
output q_n
);
wire g1 = (clk & j & q_n);
wire g2 = (clk & k & q);
6
wire q1, q1_n;
sr_latch master(g1, g2, q1, q1_n);
wire g5 = (g1 & q1);
wire g6 = (g2 & q1_n);
sr_latch slave(g5, g6, q, q_n);
endmodule
На рисунке 3 представлена логическая схема данной реализации триггера, открытая в RTL
Viewer для файла jk_flip_flop.v, которая совпадает со схемой на рисунке 2.17 (б).
Рис. 3: Логическая схема JK-триггера, построенная по рис 2.17 (б)
Дополнительное задание 2
Реализуем D-защёлку в файле d_latch.v на основе RS-триггера.
// d_latch.v module d_latch(
input clk,
input d,
7
output q,
output q_n
);
wire s = d & clk;
wire r = d & clk;
sr_latch sr_latch(s, r, q, q_n);
endmodule
Рис. 4: Логическая схема D-защёлки
Реализуем D-триггер в файле d_flip_flop.v.
// d_flip_flop.v module d_flip_flop(
input clk,
input d,
output q,
output q_n
);
wire n1;
d_latch master(
.clk(clk),
8
.d(d),
.q(n1)
);
d_latch slave(
.clk(clk),
.d(n1),
.q(q),
.q_n(q_n)
);
endmodule
Рис. 5: Логическая схема D-триггера
Построим таблицу переходов T-триггера.
Таблица 1
Таблица переходов T-триггера
CLK
T
Q
0→1 0
Q
prev
0→1 1
Q
prev
9
Реализуем T-триггер с использованием D-триггера в файле t_flip_flop_d.v.
// t_flip_flop_d.v module t_flip_flop_d (
input clk,
input t,
output q,
output q_n
);
wire d = t ^ q;
d_flip_flop d_flip_flop(
.clk(clk),
.d(d),
.q(q),
.q_n(q_n)
);
endmodule
Рис. 6: Логическая схема T-триггера с использованием D-триггера
Реализуем T-триггер с использованием JK-триггера в файле t_flip_flop_jk.v.
10
// t_flip_flop_jk.v module t_flip_flop_jk (
input clk,
input t,
output q,
output q_n
);
jk_flip_flop jk_flip_flop(
.clk(clk),
.j(t),
.k(t),
.q(q),
.q_n(q_n)
);
endmodule
Рис. 7: Логическая схема T-триггера с использованием JK-триггера
Дополнительное задание 3
Найдём в интернете рекомендации по программированию на HDL для ПЛИС производства компании Intel FPGA (рис. 8). Перейдём по первой ссылке.
http://www.gstitt.ece.ufl.edu/courses/spring10/eel4712/lectures/vhdl/qts_qii51007.pdf
11
Рис. 8: Поисковой запрос
Дополнительное задание 4
Отредактируем код D-защёлки так, чтобы входное значение сохранялось при низком уровне тактового сигнала. Для этого в условной конструкции поставим отрицание.
// d_latch.v module d_latch(
input clk,
input d,
output reg q
);
always @(clk or d)
if (!clk)
q <= d;
endmodule
Сравним RTL-представление данного кода (рис. 9) с рисунком 2.23. Отличие заключается в наличие инвертора на входе LATCH_ENABLE.
12
Рис. 9: RTL-представление D-защёлки после редактирования кода
Дополнительное задание 5
Отредактируем код D-триггера так, чтобы он работал под управлением заднего фронта тактового сигнала. Для этого заменим posedge на negedge.
// d_flip_flop.v module d_flip_flop(
input clk,
input d,
output reg q
);
always @ (negedge clk)
q <= d;
endmodule
Сравним RTL-представление данного кода (рис. ) с рисунком 2.25. Отличие заключается в наличие инвертора на входе CLK.
13
Рис. 10: RTL-представление D-триггера после редактирования кода
Дополнительное задание 6
Реализуем аппаратно JK-триггер.
// de10_lite.v module de10_lite(
input ADC_CLK_10,
input MAX10_CLK1_50,
input MAX10_CLK2_50,
input [ 1:0] KEY,
input [ 9:0] SW,
output [ 9:0] LEDR
);
assign LEDR[9:1] = 8'b0;
JKK JKK(
.CLK ( KEY [0] ),
.J ( KEY [1] ),
.K ( SW [0] ),
.Q ( LEDR[0] )
14
);
endmodule
Рис. 11: RTL-представление JK-триггера
Отредактируем код JK-триггера так, чтобы он работал под управлением заднего фронта тактового сигнала. Для этого заменим posedge на negedge.
// JKK.v module JKK(
input J,
input K,
input CLK,
output reg Q
);
always @(negedge CLK)
begin if (J && K)
Q <= Q;
else if (J && K)
Q <= 1;
else if (J && K)
Q <= 0;
end endmodule
Проведём моделирование отредактированного кода, имитируя всевозможные комбинации входных сигналов, приведённых в таблице переходов на рис 2.16.
15
Рис. 12: Временная диаграмма JK-триггера под управлением заднего фронта тактового сигнала
Из рисунка 12 видно, что JK-триггер работает в соответствии с таблицей переходов за исключением того, что переключение происходит по заднему фронту тактового сигнала.
Проверим работоспособность JK-триггера, наблюдая за состоянием светодиода,
подключённого к выходу. Для больше наглядности, светодиоды LEDR[1], LEDR[2] и LEDR[3]
подключены к сигналам CLK, J и K, соответственно.
Рис. 13: Проверка работоспособности JK-триггера CLK=0, J=1, K=1, Q=1 16
Рис. 14: Проверка работоспособности JK-триггера CLK=1, J=1, K=1, Q=1
Рис. 15: Проверка работоспособности JK-триггера CLK=0, J=1, K=1, Q=0 (Q_prev = 1)
17
Из рисунков 10 и 11 видно, что затраты ресурсов, необходимых для создания JK-триггера больше, чем для D-триггера, на 8 элементов (2 НЕ, 3 И, 3 мультиплексора). D-триггер, в свою очередь, не требует дополнительной комбинационной схемы.
Дополнительное задание 7
Изменим пример в листинге 2.20 для реализации D-триггера с сигналом очистки. Для этого уберём отрицание в условной конструкции.
// dff_sync_rst_n.v module dff_sync_rst_n (
input clk,
input rst_n,
input d,
output reg q
);
always @(posedge clk)
if (rst_n)
q <= 0;
else q <= d;
endmodule
Сравним RTL-представление данной реализации с рисунком 2.29. Из рисунка 16 видно, что единственное отличие заключется в мультиплексоре. В данном случае сигнал d передается при rst_n=0, иначе 0.
Рис. 16: Реализация D-триггера с синхронной очисткой
18
Дополнительное задание 8
Добавим в D-триггер асинхронный сброс (rst_n) и синхронный сигнал очистки (clr).
// dff_async_rst_n_clr.v module dff_async_rst_n_clr(
input clk,
input rst_n,
input clr,
input d,
output reg q
);
always @(posedge clk or negedge rst_n)
if (!rst_n)
q <= 0;
else if (clr)
q <= 0;
else q <= d;
endmodule
Запишем аппаратную реализацию D-триггера с асинхронныи сбросом и синхронным сигналом очистки.
// de10_lite.v module de10_lite(
input ADC_CLK_10,
input MAX10_CLK1_50,
input MAX10_CLK2_50,
input [ 1:0] KEY,
input [ 9:0] SW,
output [ 9:0] LEDR
);
assign LEDR[9:1] = 8'b0;
dff_async_rst_n_clr dff_async_rst_n_clr(
.clk ( KEY [0] ),
.rst_n ( SW [0] ),
.clr ( SW [1] ),
19
.d ( KEY [1] ),
.q ( LEDR[0] )
);
endmodule
Рис. 17: RTL-представление D-триггера с асинхронным сигналом сброса и синхронным сигналом очистки
Из рисунка 17 видно, что для реализации синхронного сигнала очистки необходим дополнительный элемент (мультиплексор), в отличие от реализации асинхронного сигнала сброса.
Дополнительное задание 9
Добавим синхронный положительный сигнал очистки и асинхронный сигнал n_rst.
// dff_with_en_clr_rst_n.v module dff_with_en_clr_rst_n(
input clk,
input en,
input clr,
input rst_n,
input d,
output reg q
);
always @(posedge clk or negedge rst_n)
if (!rst_n)
q <= 0;
else if (clr)
q <= 0;
else if (en)
q <= d;
endmodule
20
Рис. 18: RTL-представление активируемого D-триггера с синхронным положительным сигналом очистки и асинхронным сигналом сброса
Из рисунка 18 видно, что при добавлении синхронного сигнала очистки, для реализация активируемого D-триггер необходимо два мультиплексора: один для очистки, второй для активации.
Дополнительное задание 10
Добавим положительный сигнал синхронной очистки (clr), асинхронный сброс rst_n и сигнал разрешения работы en.
// dff_with_en_clr_rst_n_param.v module dff_with_en_clr_rst_n_param #(
parameter WIDTH = 8,
RESET = 8'b0
)(
input clk,
input en,
input clr,
input rst_n,
input [WIDTH - 1:0] d,
output reg [WIDTH - 1:0] q
);
always @(posedge clk or negedge rst_n)
if (!rst_n)
q <= RESET;
21
else if (clr)
q <= RESET;
else if (en)
q <= d;
endmodule
Рис. 19: RTL-представление параметризированного активирующегося D-триггера с положительным сигналом синхронного сброса, асинхронным сбросом и сигналом разрешения работы
Из рисунка 19 видно, что как и в случае с непараметризированным триггером, при добавлении синхронного сигнала очистки, для реализации необходимо два мультиплексора.
Выводы
Бла-бла.
Контрольные вопросы
22
ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ АВТОНОМНОЕ
ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ОБРАЗОВАНИЯ
«НАЦИОНАЛЬНЫЙ ИССЛЕДОВАТЕЛЬСКИЙ УНИВЕРСИТЕТ
«ВЫСШАЯ ШКОЛА ЭКОНОМИКИ»
Московский институт электроники и математики им. А.Н.Тихонова
«Основы последовательностной логики. Управление энергопотреблением цифровой схемы»
Практическая работа №2
по направлению 09.03.01 Информатика и вычислительная техника студента образовательной программы бакалавриата
«Информатика и вычислительная техника»
Проверил:
Лежнев Евгений Владимирович
Выполнил:
Степченко Александр Сергеевич
Корчагин Илья Александрович
БИВ196
Москва 2022 г.
Содержание
Задания..........................................................................................................................................................3
Основное задание....................................................................................................................................3
Дополнительное задание 1.....................................................................................................................3
Дополнительное задание 2.....................................................................................................................3
Дополнительное задание 3.....................................................................................................................3
Дополнительное задание 4.....................................................................................................................3
Дополнительное задание 5.....................................................................................................................3
Дополнительное задание 6.....................................................................................................................3
Дополнительное задание 7.....................................................................................................................4
Дополнительное задание 8.....................................................................................................................4
Дополнительное задание 9.....................................................................................................................4
Дополнительное задание 10...................................................................................................................4
Выполнение работы.....................................................................................................................................4
Дополнительное задание 1.....................................................................................................................4
Дополнительное задание 2.....................................................................................................................7
Дополнительное задание 3...................................................................................................................11
Дополнительное задание 4...................................................................................................................12
Дополнительное задание 5...................................................................................................................13
Дополнительное задание 6...................................................................................................................14
Дополнительное задание 7...................................................................................................................18
Дополнительное задание 8...................................................................................................................19
Дополнительное задание 9...................................................................................................................20
Дополнительное задание 10.................................................................................................................21
Выводы........................................................................................................................................................22
Контрольные вопросы...............................................................................................................................22 2
Задания
Основное задание
Выполните все дополнительные задания данной главы.
Дополнительное задание 1
Используя опыт, полученный при создании двухступенчатого RS-триггера, самостоятельно разработайте на языке Verilog модуль, описывающий структуру JK-триггера, приведённую на рисунке 2.17.
Дополнительное задание 2
Используя созданные ранее D-триггер и JK-триггер, опишите Verilog-модули T-триггера
в соответствии с рис. 2.18 и самостоятельное постройте таблицу переходов данного триггера.
Дополнительное задание 3
Найти в сети интернет документ с рекомендациями по программированию на языке HDL
для ПЛИС производства компании Intel FPGA.
Дополнительное задание 4
Отредактируйте код D-защелки (листинг 2.16) так, чтобы входное значение сохранялось при низком уровне тактового сигнала. Скомпилируйте код и сравните его RTL-представление с рис. 2.23.
Дополнительное задание 5
Измените D-триггер, код которого приведён в листинге 2.17, так, чтобы он работал под управлением заднего фронта тактового сигнала. Для этого необходимо заменить ключевое слово
posedge на negedge. Скомпилируйте проект и сравните его RTL-представление с предыдущей реализацией на рисунке 2.25.
Дополнительное задание 6
Используя опыт, полученный при реализации D-триггера, самостоятельно отредактируйте код листинга 2.19. Проведите его моделирование, иммитируя все возможные комбинации входных
3
сигналов, приведённые в таблице переходов на рис. 2.16. Сравните получаемые результаты с таблицей.
Аналогичным образом отредактируйте код листинга 2.18, добавив ещё одну кнопку.
Проверьте работоспособность JK-триггера, наблюдая за состоянием светодиода, подключённого к выходу. Сравните затраты ресурсов, необходимых для создания D-триггера и JK-триггера в RTL
Viewer.
Дополнительное задание 7
Неинвертированный синхронный сигнал сброса часто называют сигналом очистки.
Измените пример в листинге 2.20 для реализации D-триггера с сигналом очистки. Сравните его
RTL-представление с рис. 2.29.
Дополнительное задание 8
Добавьте в D-триггер асинхронный сброс с сигналом очистки, реализованным на предыдущем шаге. Модуль должен иметь положительный синхронный сигнал очистки и в тоже время асинхронный вход n_rst. Сравните его аппаратную реализацию (RTL-представление) с рис.
2.31.
Дополнительное задание 9
Измените активируемый триггер в листинге 2.24. Необходимо добавить синхронный положительный сигнал очистки и асинхронный сигнал n_rst. Сравните аппаратную реализацию
(RTL View) с рис. 2.35.
Дополнительное задание 10
Измените реализацию тригерра, приведённую в листинге 2.28. Добавьте положительный сигнал синхронной очистки, асинхронный сброс rst_n и сигнал разрешения работы en. Сравните аппаратную реализацию (RTL View) с рис. 2.37.
Выполнение работы
Дополнительное задание 1
Создадим проект в Quartus под названием lab_02. JK-триггер строиться на основе RS- триггера, поэтому сначала реализуем RS-триггер на элементах И-НЕ в файле sr_latch.v.
Получившаяся схема представлена на рисунке 1.
// sr_latch.v module sr_latch (
4
input s,
input r,
output q,
output q_n
);
assign q = (s & q_n);
assign q_n = (r & q);
endmodule
Рис. 1: Логическая схема RS-триггера в RTL Viewer
Разработаем модуль, описывающий структуру JK-триггера на рисунке 2.17 (а) типа защёлка.
// jk_latch.v module jk_latch (
input clk,
input j,
input k,
output q,
output q_n
);
wire nand1 = (clk & j & q_n);
wire nand2 = (clk & k & q);
5
sr_latch sr_latch(nand1, nand2, q, q_n);
endmodule
На рисунке 2 представлена логическая схема данной реализации триггера, открытая в RTL
Viewer для файла jk_latch.v, которая совпадает со схемой на рисунке 2.17 (а).
Рис. 2: Логическая схема, построенная по рисунку 2.17 (а)
Разработаем модуль, описывающий структуру JK-триггера на рисунке 2.17 (б) типа триггер.
// jk_flip_flop.v module jk_flip_flop (
input clk,
input j,
input k,
output q,
output q_n
);
wire g1 = (clk & j & q_n);
wire g2 = (clk & k & q);
6
wire q1, q1_n;
sr_latch master(g1, g2, q1, q1_n);
wire g5 = (g1 & q1);
wire g6 = (g2 & q1_n);
sr_latch slave(g5, g6, q, q_n);
endmodule
На рисунке 3 представлена логическая схема данной реализации триггера, открытая в RTL
Viewer для файла jk_flip_flop.v, которая совпадает со схемой на рисунке 2.17 (б).
Рис. 3: Логическая схема JK-триггера, построенная по рис 2.17 (б)
Дополнительное задание 2
Реализуем D-защёлку в файле d_latch.v на основе RS-триггера.
// d_latch.v module d_latch(
input clk,
input d,
7
output q,
output q_n
);
wire s = d & clk;
wire r = d & clk;
sr_latch sr_latch(s, r, q, q_n);
endmodule
Рис. 4: Логическая схема D-защёлки
Реализуем D-триггер в файле d_flip_flop.v.
// d_flip_flop.v module d_flip_flop(
input clk,
input d,
output q,
output q_n
);
wire n1;
d_latch master(
.clk(clk),
8
.d(d),
.q(n1)
);
d_latch slave(
.clk(clk),
.d(n1),
.q(q),
.q_n(q_n)
);
endmodule
Рис. 5: Логическая схема D-триггера
Построим таблицу переходов T-триггера.
Таблица 1
Таблица переходов T-триггера
CLK
T
Q
0→1 0
Q
prev
0→1 1
Q
prev
9
Реализуем T-триггер с использованием D-триггера в файле t_flip_flop_d.v.
// t_flip_flop_d.v module t_flip_flop_d (
input clk,
input t,
output q,
output q_n
);
wire d = t ^ q;
d_flip_flop d_flip_flop(
.clk(clk),
.d(d),
.q(q),
.q_n(q_n)
);
endmodule
Рис. 6: Логическая схема T-триггера с использованием D-триггера
Реализуем T-триггер с использованием JK-триггера в файле t_flip_flop_jk.v.
10
// t_flip_flop_jk.v module t_flip_flop_jk (
input clk,
input t,
output q,
output q_n
);
jk_flip_flop jk_flip_flop(
.clk(clk),
.j(t),
.k(t),
.q(q),
.q_n(q_n)
);
endmodule
Рис. 7: Логическая схема T-триггера с использованием JK-триггера
Дополнительное задание 3
Найдём в интернете рекомендации по программированию на HDL для ПЛИС производства компании Intel FPGA (рис. 8). Перейдём по первой ссылке.
http://www.gstitt.ece.ufl.edu/courses/spring10/eel4712/lectures/vhdl/qts_qii51007.pdf
11
Рис. 8: Поисковой запрос
Дополнительное задание 4
Отредактируем код D-защёлки так, чтобы входное значение сохранялось при низком уровне тактового сигнала. Для этого в условной конструкции поставим отрицание.
// d_latch.v module d_latch(
input clk,
input d,
output reg q
);
always @(clk or d)
if (!clk)
q <= d;
endmodule
Сравним RTL-представление данного кода (рис. 9) с рисунком 2.23. Отличие заключается в наличие инвертора на входе LATCH_ENABLE.
12
Рис. 9: RTL-представление D-защёлки после редактирования кода
Дополнительное задание 5
Отредактируем код D-триггера так, чтобы он работал под управлением заднего фронта тактового сигнала. Для этого заменим posedge на negedge.
// d_flip_flop.v module d_flip_flop(
input clk,
input d,
output reg q
);
always @ (negedge clk)
q <= d;
endmodule
Сравним RTL-представление данного кода (рис. ) с рисунком 2.25. Отличие заключается в наличие инвертора на входе CLK.
13
Рис. 10: RTL-представление D-триггера после редактирования кода
Дополнительное задание 6
Реализуем аппаратно JK-триггер.
// de10_lite.v module de10_lite(
input ADC_CLK_10,
input MAX10_CLK1_50,
input MAX10_CLK2_50,
input [ 1:0] KEY,
input [ 9:0] SW,
output [ 9:0] LEDR
);
assign LEDR[9:1] = 8'b0;
JKK JKK(
.CLK ( KEY [0] ),
.J ( KEY [1] ),
.K ( SW [0] ),
.Q ( LEDR[0] )
14
);
endmodule
Рис. 11: RTL-представление JK-триггера
Отредактируем код JK-триггера так, чтобы он работал под управлением заднего фронта тактового сигнала. Для этого заменим posedge на negedge.
// JKK.v module JKK(
input J,
input K,
input CLK,
output reg Q
);
always @(negedge CLK)
begin if (J && K)
Q <= Q;
else if (J && K)
Q <= 1;
else if (J && K)
Q <= 0;
end endmodule
Проведём моделирование отредактированного кода, имитируя всевозможные комбинации входных сигналов, приведённых в таблице переходов на рис 2.16.
15
Рис. 12: Временная диаграмма JK-триггера под управлением заднего фронта тактового сигнала
Из рисунка 12 видно, что JK-триггер работает в соответствии с таблицей переходов за исключением того, что переключение происходит по заднему фронту тактового сигнала.
Проверим работоспособность JK-триггера, наблюдая за состоянием светодиода,
подключённого к выходу. Для больше наглядности, светодиоды LEDR[1], LEDR[2] и LEDR[3]
подключены к сигналам CLK, J и K, соответственно.
Рис. 13: Проверка работоспособности JK-триггера CLK=0, J=1, K=1, Q=1 16
Рис. 14: Проверка работоспособности JK-триггера CLK=1, J=1, K=1, Q=1
Рис. 15: Проверка работоспособности JK-триггера CLK=0, J=1, K=1, Q=0 (Q_prev = 1)
17
Из рисунков 10 и 11 видно, что затраты ресурсов, необходимых для создания JK-триггера больше, чем для D-триггера, на 8 элементов (2 НЕ, 3 И, 3 мультиплексора). D-триггер, в свою очередь, не требует дополнительной комбинационной схемы.
Дополнительное задание 7
Изменим пример в листинге 2.20 для реализации D-триггера с сигналом очистки. Для этого уберём отрицание в условной конструкции.
// dff_sync_rst_n.v module dff_sync_rst_n (
input clk,
input rst_n,
input d,
output reg q
);
always @(posedge clk)
if (rst_n)
q <= 0;
else q <= d;
endmodule
Сравним RTL-представление данной реализации с рисунком 2.29. Из рисунка 16 видно, что единственное отличие заключется в мультиплексоре. В данном случае сигнал d передается при rst_n=0, иначе 0.
Рис. 16: Реализация D-триггера с синхронной очисткой
18
Дополнительное задание 8
Добавим в D-триггер асинхронный сброс (rst_n) и синхронный сигнал очистки (clr).
// dff_async_rst_n_clr.v module dff_async_rst_n_clr(
input clk,
input rst_n,
input clr,
input d,
output reg q
);
always @(posedge clk or negedge rst_n)
if (!rst_n)
q <= 0;
else if (clr)
q <= 0;
else q <= d;
endmodule
Запишем аппаратную реализацию D-триггера с асинхронныи сбросом и синхронным сигналом очистки.
// de10_lite.v module de10_lite(
input ADC_CLK_10,
input MAX10_CLK1_50,
input MAX10_CLK2_50,
input [ 1:0] KEY,
input [ 9:0] SW,
output [ 9:0] LEDR
);
assign LEDR[9:1] = 8'b0;
dff_async_rst_n_clr dff_async_rst_n_clr(
.clk ( KEY [0] ),
.rst_n ( SW [0] ),
.clr ( SW [1] ),
19
.d ( KEY [1] ),
.q ( LEDR[0] )
);
endmodule
Рис. 17: RTL-представление D-триггера с асинхронным сигналом сброса и синхронным сигналом очистки
Из рисунка 17 видно, что для реализации синхронного сигнала очистки необходим дополнительный элемент (мультиплексор), в отличие от реализации асинхронного сигнала сброса.
Дополнительное задание 9
Добавим синхронный положительный сигнал очистки и асинхронный сигнал n_rst.
// dff_with_en_clr_rst_n.v module dff_with_en_clr_rst_n(
input clk,
input en,
input clr,
input rst_n,
input d,
output reg q
);
always @(posedge clk or negedge rst_n)
if (!rst_n)
q <= 0;
else if (clr)
q <= 0;
else if (en)
q <= d;
endmodule
20
Рис. 18: RTL-представление активируемого D-триггера с синхронным положительным сигналом очистки и асинхронным сигналом сброса
Из рисунка 18 видно, что при добавлении синхронного сигнала очистки, для реализация активируемого D-триггер необходимо два мультиплексора: один для очистки, второй для активации.
Дополнительное задание 10
Добавим положительный сигнал синхронной очистки (clr), асинхронный сброс rst_n и сигнал разрешения работы en.
// dff_with_en_clr_rst_n_param.v module dff_with_en_clr_rst_n_param #(
parameter WIDTH = 8,
RESET = 8'b0
)(
input clk,
input en,
input clr,
input rst_n,
input [WIDTH - 1:0] d,
output reg [WIDTH - 1:0] q
);
always @(posedge clk or negedge rst_n)
if (!rst_n)
q <= RESET;
21
else if (clr)
q <= RESET;
else if (en)
q <= d;
endmodule
Рис. 19: RTL-представление параметризированного активирующегося D-триггера с положительным сигналом синхронного сброса, асинхронным сбросом и сигналом разрешения работы
Из рисунка 19 видно, что как и в случае с непараметризированным триггером, при добавлении синхронного сигнала очистки, для реализации необходимо два мультиплексора.
Выводы
Бла-бла.
Контрольные вопросы
22
ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ АВТОНОМНОЕ
ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ОБРАЗОВАНИЯ
«НАЦИОНАЛЬНЫЙ ИССЛЕДОВАТЕЛЬСКИЙ УНИВЕРСИТЕТ
«ВЫСШАЯ ШКОЛА ЭКОНОМИКИ»
Московский институт электроники и математики им. А.Н.Тихонова
«Основы последовательностной логики. Управление энергопотреблением цифровой схемы»
Практическая работа №2
по направлению 09.03.01 Информатика и вычислительная техника студента образовательной программы бакалавриата
«Информатика и вычислительная техника»
Проверил:
Лежнев Евгений Владимирович
Выполнил:
Степченко Александр Сергеевич
Корчагин Илья Александрович
БИВ196
Москва 2022 г.
Содержание
Задания..........................................................................................................................................................3
Основное задание....................................................................................................................................3
Дополнительное задание 1.....................................................................................................................3
Дополнительное задание 2.....................................................................................................................3
Дополнительное задание 3.....................................................................................................................3
Дополнительное задание 4.....................................................................................................................3
Дополнительное задание 5.....................................................................................................................3
Дополнительное задание 6.....................................................................................................................3
Дополнительное задание 7.....................................................................................................................4
Дополнительное задание 8.....................................................................................................................4
Дополнительное задание 9.....................................................................................................................4
Дополнительное задание 10...................................................................................................................4
Выполнение работы.....................................................................................................................................4
Дополнительное задание 1.....................................................................................................................4
Дополнительное задание 2.....................................................................................................................7
Дополнительное задание 3...................................................................................................................11
Дополнительное задание 4...................................................................................................................12
Дополнительное задание 5...................................................................................................................13
Дополнительное задание 6...................................................................................................................14
Дополнительное задание 7...................................................................................................................18
Дополнительное задание 8...................................................................................................................19
Дополнительное задание 9...................................................................................................................20
Дополнительное задание 10.................................................................................................................21
Выводы........................................................................................................................................................22
Контрольные вопросы...............................................................................................................................22 2
Задания
Основное задание
Выполните все дополнительные задания данной главы.
Дополнительное задание 1
Используя опыт, полученный при создании двухступенчатого RS-триггера, самостоятельно разработайте на языке Verilog модуль, описывающий структуру JK-триггера, приведённую на рисунке 2.17.
Дополнительное задание 2
Используя созданные ранее D-триггер и JK-триггер, опишите Verilog-модули T-триггера
в соответствии с рис. 2.18 и самостоятельное постройте таблицу переходов данного триггера.
Дополнительное задание 3
Найти в сети интернет документ с рекомендациями по программированию на языке HDL
для ПЛИС производства компании Intel FPGA.
Дополнительное задание 4
Отредактируйте код D-защелки (листинг 2.16) так, чтобы входное значение сохранялось при низком уровне тактового сигнала. Скомпилируйте код и сравните его RTL-представление с рис. 2.23.
Дополнительное задание 5
Измените D-триггер, код которого приведён в листинге 2.17, так, чтобы он работал под управлением заднего фронта тактового сигнала. Для этого необходимо заменить ключевое слово
posedge на negedge. Скомпилируйте проект и сравните его RTL-представление с предыдущей реализацией на рисунке 2.25.
Дополнительное задание 6
Используя опыт, полученный при реализации D-триггера, самостоятельно отредактируйте код листинга 2.19. Проведите его моделирование, иммитируя все возможные комбинации входных
3
сигналов, приведённые в таблице переходов на рис. 2.16. Сравните получаемые результаты с таблицей.
Аналогичным образом отредактируйте код листинга 2.18, добавив ещё одну кнопку.
Проверьте работоспособность JK-триггера, наблюдая за состоянием светодиода, подключённого к выходу. Сравните затраты ресурсов, необходимых для создания D-триггера и JK-триггера в RTL
Viewer.
Дополнительное задание 7
Неинвертированный синхронный сигнал сброса часто называют сигналом очистки.
Измените пример в листинге 2.20 для реализации D-триггера с сигналом очистки. Сравните его
RTL-представление с рис. 2.29.
Дополнительное задание 8
Добавьте в D-триггер асинхронный сброс с сигналом очистки, реализованным на предыдущем шаге. Модуль должен иметь положительный синхронный сигнал очистки и в тоже время асинхронный вход n_rst. Сравните его аппаратную реализацию (RTL-представление) с рис.
2.31.
Дополнительное задание 9
Измените активируемый триггер в листинге 2.24. Необходимо добавить синхронный положительный сигнал очистки и асинхронный сигнал n_rst. Сравните аппаратную реализацию
(RTL View) с рис. 2.35.
Дополнительное задание 10
Измените реализацию тригерра, приведённую в листинге 2.28. Добавьте положительный сигнал синхронной очистки, асинхронный сброс rst_n и сигнал разрешения работы en. Сравните аппаратную реализацию (RTL View) с рис. 2.37.
Выполнение работы
Дополнительное задание 1
Создадим проект в Quartus под названием lab_02. JK-триггер строиться на основе RS- триггера, поэтому сначала реализуем RS-триггер на элементах И-НЕ в файле sr_latch.v.
Получившаяся схема представлена на рисунке 1.
// sr_latch.v module sr_latch (
4
input s,
input r,
output q,
output q_n
);
assign q = (s & q_n);
assign q_n = (r & q);
endmodule
Рис. 1: Логическая схема RS-триггера в RTL Viewer
Разработаем модуль, описывающий структуру JK-триггера на рисунке 2.17 (а) типа защёлка.
// jk_latch.v module jk_latch (
input clk,
input j,
input k,
output q,
output q_n
);
wire nand1 = (clk & j & q_n);
wire nand2 = (clk & k & q);
5
sr_latch sr_latch(nand1, nand2, q, q_n);
endmodule
На рисунке 2 представлена логическая схема данной реализации триггера, открытая в RTL
Viewer для файла jk_latch.v, которая совпадает со схемой на рисунке 2.17 (а).
Рис. 2: Логическая схема, построенная по рисунку 2.17 (а)
Разработаем модуль, описывающий структуру JK-триггера на рисунке 2.17 (б) типа триггер.
// jk_flip_flop.v module jk_flip_flop (
input clk,
input j,
input k,
output q,
output q_n
);
wire g1 = (clk & j & q_n);
wire g2 = (clk & k & q);
6
wire q1, q1_n;
sr_latch master(g1, g2, q1, q1_n);
wire g5 = (g1 & q1);
wire g6 = (g2 & q1_n);
sr_latch slave(g5, g6, q, q_n);
endmodule
На рисунке 3 представлена логическая схема данной реализации триггера, открытая в RTL
Viewer для файла jk_flip_flop.v, которая совпадает со схемой на рисунке 2.17 (б).
Рис. 3: Логическая схема JK-триггера, построенная по рис 2.17 (б)
Дополнительное задание 2
Реализуем D-защёлку в файле d_latch.v на основе RS-триггера.
// d_latch.v module d_latch(
input clk,
input d,
7
output q,
output q_n
);
wire s = d & clk;
wire r = d & clk;
sr_latch sr_latch(s, r, q, q_n);
endmodule
Рис. 4: Логическая схема D-защёлки
Реализуем D-триггер в файле d_flip_flop.v.
// d_flip_flop.v module d_flip_flop(
input clk,
input d,
output q,
output q_n
);
wire n1;
d_latch master(
.clk(clk),
8
.d(d),
.q(n1)
);
d_latch slave(
.clk(clk),
.d(n1),
.q(q),
.q_n(q_n)
);
endmodule
Рис. 5: Логическая схема D-триггера
Построим таблицу переходов T-триггера.
Таблица 1
Таблица переходов T-триггера
CLK
T
Q
0→1 0
Q
prev
0→1 1
Q
prev
9
Реализуем T-триггер с использованием D-триггера в файле t_flip_flop_d.v.
// t_flip_flop_d.v module t_flip_flop_d (
input clk,
input t,
output q,
output q_n
);
wire d = t ^ q;
d_flip_flop d_flip_flop(
.clk(clk),
.d(d),
.q(q),
.q_n(q_n)
);
endmodule
Рис. 6: Логическая схема T-триггера с использованием D-триггера
Реализуем T-триггер с использованием JK-триггера в файле t_flip_flop_jk.v.
10
// t_flip_flop_jk.v module t_flip_flop_jk (
input clk,
input t,
output q,
output q_n
);
jk_flip_flop jk_flip_flop(
.clk(clk),
.j(t),
.k(t),
.q(q),
.q_n(q_n)
);
endmodule
Рис. 7: Логическая схема T-триггера с использованием JK-триггера
Дополнительное задание 3
Найдём в интернете рекомендации по программированию на HDL для ПЛИС производства компании Intel FPGA (рис. 8). Перейдём по первой ссылке.
http://www.gstitt.ece.ufl.edu/courses/spring10/eel4712/lectures/vhdl/qts_qii51007.pdf
11
Рис. 8: Поисковой запрос
Дополнительное задание 4
Отредактируем код D-защёлки так, чтобы входное значение сохранялось при низком уровне тактового сигнала. Для этого в условной конструкции поставим отрицание.
// d_latch.v module d_latch(
input clk,
input d,
output reg q
);
always @(clk or d)
if (!clk)
q <= d;
endmodule
Сравним RTL-представление данного кода (рис. 9) с рисунком 2.23. Отличие заключается в наличие инвертора на входе LATCH_ENABLE.
12
Рис. 9: RTL-представление D-защёлки после редактирования кода
Дополнительное задание 5
Отредактируем код D-триггера так, чтобы он работал под управлением заднего фронта тактового сигнала. Для этого заменим posedge на negedge.
// d_flip_flop.v module d_flip_flop(
input clk,
input d,
output reg q
);
always @ (negedge clk)
q <= d;
endmodule
Сравним RTL-представление данного кода (рис. ) с рисунком 2.25. Отличие заключается в наличие инвертора на входе CLK.
13
Рис. 10: RTL-представление D-триггера после редактирования кода
Дополнительное задание 6
Реализуем аппаратно JK-триггер.
// de10_lite.v module de10_lite(
input ADC_CLK_10,
input MAX10_CLK1_50,
input MAX10_CLK2_50,
input [ 1:0] KEY,
input [ 9:0] SW,
output [ 9:0] LEDR
);
assign LEDR[9:1] = 8'b0;
JKK JKK(
.CLK ( KEY [0] ),
.J ( KEY [1] ),
.K ( SW [0] ),
.Q ( LEDR[0] )
14
);
endmodule
Рис. 11: RTL-представление JK-триггера
Отредактируем код JK-триггера так, чтобы он работал под управлением заднего фронта тактового сигнала. Для этого заменим posedge на negedge.
// JKK.v module JKK(
input J,
input K,
input CLK,
output reg Q
);
always @(negedge CLK)
begin if (J && K)
Q <= Q;
else if (J && K)
Q <= 1;
else if (J && K)
Q <= 0;
end endmodule
Проведём моделирование отредактированного кода, имитируя всевозможные комбинации входных сигналов, приведённых в таблице переходов на рис 2.16.
15
Рис. 12: Временная диаграмма JK-триггера под управлением заднего фронта тактового сигнала
Из рисунка 12 видно, что JK-триггер работает в соответствии с таблицей переходов за исключением того, что переключение происходит по заднему фронту тактового сигнала.
Проверим работоспособность JK-триггера, наблюдая за состоянием светодиода,
подключённого к выходу. Для больше наглядности, светодиоды LEDR[1], LEDR[2] и LEDR[3]
подключены к сигналам CLK, J и K, соответственно.
Рис. 13: Проверка работоспособности JK-триггера CLK=0, J=1, K=1, Q=1 16
Рис. 14: Проверка работоспособности JK-триггера CLK=1, J=1, K=1, Q=1
Рис. 15: Проверка работоспособности JK-триггера CLK=0, J=1, K=1, Q=0 (Q_prev = 1)
17
Из рисунков 10 и 11 видно, что затраты ресурсов, необходимых для создания JK-триггера больше, чем для D-триггера, на 8 элементов (2 НЕ, 3 И, 3 мультиплексора). D-триггер, в свою очередь, не требует дополнительной комбинационной схемы.
Дополнительное задание 7
Изменим пример в листинге 2.20 для реализации D-триггера с сигналом очистки. Для этого уберём отрицание в условной конструкции.
// dff_sync_rst_n.v module dff_sync_rst_n (
input clk,
input rst_n,
input d,
output reg q
);
always @(posedge clk)
if (rst_n)
q <= 0;
else q <= d;
endmodule
Сравним RTL-представление данной реализации с рисунком 2.29. Из рисунка 16 видно, что единственное отличие заключется в мультиплексоре. В данном случае сигнал d передается при rst_n=0, иначе 0.
Рис. 16: Реализация D-триггера с синхронной очисткой
18
Дополнительное задание 8
Добавим в D-триггер асинхронный сброс (rst_n) и синхронный сигнал очистки (clr).
// dff_async_rst_n_clr.v module dff_async_rst_n_clr(
input clk,
input rst_n,
input clr,
input d,
output reg q
);
always @(posedge clk or negedge rst_n)
if (!rst_n)
q <= 0;
else if (clr)
q <= 0;
else q <= d;
endmodule
Запишем аппаратную реализацию D-триггера с асинхронныи сбросом и синхронным сигналом очистки.
// de10_lite.v module de10_lite(
input ADC_CLK_10,
input MAX10_CLK1_50,
input MAX10_CLK2_50,
input [ 1:0] KEY,
input [ 9:0] SW,
output [ 9:0] LEDR
);
assign LEDR[9:1] = 8'b0;
dff_async_rst_n_clr dff_async_rst_n_clr(
.clk ( KEY [0] ),
.rst_n ( SW [0] ),
.clr ( SW [1] ),
19
.d ( KEY [1] ),
.q ( LEDR[0] )
);
endmodule
Рис. 17: RTL-представление D-триггера с асинхронным сигналом сброса и синхронным сигналом очистки
Из рисунка 17 видно, что для реализации синхронного сигнала очистки необходим дополнительный элемент (мультиплексор), в отличие от реализации асинхронного сигнала сброса.
Дополнительное задание 9
Добавим синхронный положительный сигнал очистки и асинхронный сигнал n_rst.
// dff_with_en_clr_rst_n.v module dff_with_en_clr_rst_n(
input clk,
input en,
input clr,
input rst_n,
input d,
output reg q
);
always @(posedge clk or negedge rst_n)
if (!rst_n)
q <= 0;
else if (clr)
q <= 0;
else if (en)
q <= d;
endmodule
20
Рис. 18: RTL-представление активируемого D-триггера с синхронным положительным сигналом очистки и асинхронным сигналом сброса
Из рисунка 18 видно, что при добавлении синхронного сигнала очистки, для реализация активируемого D-триггер необходимо два мультиплексора: один для очистки, второй для активации.
Дополнительное задание 10
Добавим положительный сигнал синхронной очистки (clr), асинхронный сброс rst_n и сигнал разрешения работы en.
// dff_with_en_clr_rst_n_param.v module dff_with_en_clr_rst_n_param #(
parameter WIDTH = 8,
RESET = 8'b0
)(
input clk,
input en,
input clr,
input rst_n,
input [WIDTH - 1:0] d,
output reg [WIDTH - 1:0] q
);
always @(posedge clk or negedge rst_n)
if (!rst_n)
q <= RESET;
21
else if (clr)
q <= RESET;
else if (en)
q <= d;
endmodule
Рис. 19: RTL-представление параметризированного активирующегося D-триггера с положительным сигналом синхронного сброса, асинхронным сбросом и сигналом разрешения работы
Из рисунка 19 видно, что как и в случае с непараметризированным триггером, при добавлении синхронного сигнала очистки, для реализации необходимо два мультиплексора.
Выводы
Бла-бла.
Контрольные вопросы
22
ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ АВТОНОМНОЕ
ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ОБРАЗОВАНИЯ
«НАЦИОНАЛЬНЫЙ ИССЛЕДОВАТЕЛЬСКИЙ УНИВЕРСИТЕТ
«ВЫСШАЯ ШКОЛА ЭКОНОМИКИ»
Московский институт электроники и математики им. А.Н.Тихонова
«Основы последовательностной логики. Управление энергопотреблением цифровой схемы»
Практическая работа №2
по направлению 09.03.01 Информатика и вычислительная техника студента образовательной программы бакалавриата
«Информатика и вычислительная техника»
Проверил:
Лежнев Евгений Владимирович
Выполнил:
Степченко Александр Сергеевич
Корчагин Илья Александрович
БИВ196
Москва 2022 г.
Содержание
Задания..........................................................................................................................................................3
Основное задание....................................................................................................................................3
Дополнительное задание 1.....................................................................................................................3
Дополнительное задание 2.....................................................................................................................3
Дополнительное задание 3.....................................................................................................................3
Дополнительное задание 4.....................................................................................................................3
Дополнительное задание 5.....................................................................................................................3
Дополнительное задание 6.....................................................................................................................3
Дополнительное задание 7.....................................................................................................................4
Дополнительное задание 8.....................................................................................................................4
Дополнительное задание 9.....................................................................................................................4
Дополнительное задание 10...................................................................................................................4
Выполнение работы.....................................................................................................................................4
Дополнительное задание 1.....................................................................................................................4
Дополнительное задание 2.....................................................................................................................7
Дополнительное задание 3...................................................................................................................11
Дополнительное задание 4...................................................................................................................12
Дополнительное задание 5...................................................................................................................13
Дополнительное задание 6...................................................................................................................14
Дополнительное задание 7...................................................................................................................18
Дополнительное задание 8...................................................................................................................19
Дополнительное задание 9...................................................................................................................20
Дополнительное задание 10.................................................................................................................21
Выводы........................................................................................................................................................22
Контрольные вопросы...............................................................................................................................22 2
Задания
Основное задание
Выполните все дополнительные задания данной главы.
Дополнительное задание 1
Используя опыт, полученный при создании двухступенчатого RS-триггера, самостоятельно разработайте на языке Verilog модуль, описывающий структуру JK-триггера, приведённую на рисунке 2.17.
Дополнительное задание 2
Используя созданные ранее D-триггер и JK-триггер, опишите Verilog-модули T-триггера
в соответствии с рис. 2.18 и самостоятельное постройте таблицу переходов данного триггера.
Дополнительное задание 3
Найти в сети интернет документ с рекомендациями по программированию на языке HDL
для ПЛИС производства компании Intel FPGA.
Дополнительное задание 4
Отредактируйте код D-защелки (листинг 2.16) так, чтобы входное значение сохранялось при низком уровне тактового сигнала. Скомпилируйте код и сравните его RTL-представление с рис. 2.23.
Дополнительное задание 5
Измените D-триггер, код которого приведён в листинге 2.17, так, чтобы он работал под управлением заднего фронта тактового сигнала. Для этого необходимо заменить ключевое слово
posedge на negedge. Скомпилируйте проект и сравните его RTL-представление с предыдущей реализацией на рисунке 2.25.
Дополнительное задание 6
Используя опыт, полученный при реализации D-триггера, самостоятельно отредактируйте код листинга 2.19. Проведите его моделирование, иммитируя все возможные комбинации входных
3
сигналов, приведённые в таблице переходов на рис. 2.16. Сравните получаемые результаты с таблицей.
Аналогичным образом отредактируйте код листинга 2.18, добавив ещё одну кнопку.
Проверьте работоспособность JK-триггера, наблюдая за состоянием светодиода, подключённого к выходу. Сравните затраты ресурсов, необходимых для создания D-триггера и JK-триггера в RTL
Viewer.
Дополнительное задание 7
Неинвертированный синхронный сигнал сброса часто называют сигналом очистки.
Измените пример в листинге 2.20 для реализации D-триггера с сигналом очистки. Сравните его
RTL-представление с рис. 2.29.
Дополнительное задание 8
Добавьте в D-триггер асинхронный сброс с сигналом очистки, реализованным на предыдущем шаге. Модуль должен иметь положительный синхронный сигнал очистки и в тоже время асинхронный вход n_rst. Сравните его аппаратную реализацию (RTL-представление) с рис.
2.31.
Дополнительное задание 9
Измените активируемый триггер в листинге 2.24. Необходимо добавить синхронный положительный сигнал очистки и асинхронный сигнал n_rst. Сравните аппаратную реализацию
(RTL View) с рис. 2.35.
Дополнительное задание 10
Измените реализацию тригерра, приведённую в листинге 2.28. Добавьте положительный сигнал синхронной очистки, асинхронный сброс rst_n и сигнал разрешения работы en. Сравните аппаратную реализацию (RTL View) с рис. 2.37.
Выполнение работы
Дополнительное задание 1
Создадим проект в Quartus под названием lab_02. JK-триггер строиться на основе RS- триггера, поэтому сначала реализуем RS-триггер на элементах И-НЕ в файле sr_latch.v.
Получившаяся схема представлена на рисунке 1.
// sr_latch.v module sr_latch (
4
input s,
input r,
output q,
output q_n
);
assign q = (s & q_n);
assign q_n = (r & q);
endmodule
Рис. 1: Логическая схема RS-триггера в RTL Viewer
Разработаем модуль, описывающий структуру JK-триггера на рисунке 2.17 (а) типа защёлка.
// jk_latch.v module jk_latch (
input clk,
input j,
input k,
output q,
output q_n
);
wire nand1 = (clk & j & q_n);
wire nand2 = (clk & k & q);
5
sr_latch sr_latch(nand1, nand2, q, q_n);
endmodule
На рисунке 2 представлена логическая схема данной реализации триггера, открытая в RTL
Viewer для файла jk_latch.v, которая совпадает со схемой на рисунке 2.17 (а).
Рис. 2: Логическая схема, построенная по рисунку 2.17 (а)
Разработаем модуль, описывающий структуру JK-триггера на рисунке 2.17 (б) типа триггер.
// jk_flip_flop.v module jk_flip_flop (
input clk,
input j,
input k,
output q,
output q_n
);
wire g1 = (clk & j & q_n);
wire g2 = (clk & k & q);
6
wire q1, q1_n;
sr_latch master(g1, g2, q1, q1_n);
wire g5 = (g1 & q1);
wire g6 = (g2 & q1_n);
sr_latch slave(g5, g6, q, q_n);
endmodule
На рисунке 3 представлена логическая схема данной реализации триггера, открытая в RTL
Viewer для файла jk_flip_flop.v, которая совпадает со схемой на рисунке 2.17 (б).
Рис. 3: Логическая схема JK-триггера, построенная по рис 2.17 (б)
Дополнительное задание 2
Реализуем D-защёлку в файле d_latch.v на основе RS-триггера.
// d_latch.v module d_latch(
input clk,
input d,
7
output q,
output q_n
);
wire s = d & clk;
wire r = d & clk;
sr_latch sr_latch(s, r, q, q_n);
endmodule
Рис. 4: Логическая схема D-защёлки
Реализуем D-триггер в файле d_flip_flop.v.
// d_flip_flop.v module d_flip_flop(
input clk,
input d,
output q,
output q_n
);
wire n1;
d_latch master(
.clk(clk),
8
.d(d),
.q(n1)
);
d_latch slave(
.clk(clk),
.d(n1),
.q(q),
.q_n(q_n)
);
endmodule
Рис. 5: Логическая схема D-триггера
Построим таблицу переходов T-триггера.
Таблица 1
Таблица переходов T-триггера
CLK
T
Q
0→1 0
Q
prev
0→1 1
Q
prev
9
Реализуем T-триггер с использованием D-триггера в файле t_flip_flop_d.v.
// t_flip_flop_d.v module t_flip_flop_d (
input clk,
input t,
output q,
output q_n
);
wire d = t ^ q;
d_flip_flop d_flip_flop(
.clk(clk),
.d(d),
.q(q),
.q_n(q_n)
);
endmodule
Рис. 6: Логическая схема T-триггера с использованием D-триггера
Реализуем T-триггер с использованием JK-триггера в файле t_flip_flop_jk.v.
10
// t_flip_flop_jk.v module t_flip_flop_jk (
input clk,
input t,
output q,
output q_n
);
jk_flip_flop jk_flip_flop(
.clk(clk),
.j(t),
.k(t),
.q(q),
.q_n(q_n)
);
endmodule
Рис. 7: Логическая схема T-триггера с использованием JK-триггера
Дополнительное задание 3
Найдём в интернете рекомендации по программированию на HDL для ПЛИС производства компании Intel FPGA (рис. 8). Перейдём по первой ссылке.
http://www.gstitt.ece.ufl.edu/courses/spring10/eel4712/lectures/vhdl/qts_qii51007.pdf
11
Рис. 8: Поисковой запрос
Дополнительное задание 4
Отредактируем код D-защёлки так, чтобы входное значение сохранялось при низком уровне тактового сигнала. Для этого в условной конструкции поставим отрицание.
// d_latch.v module d_latch(
input clk,
input d,
output reg q
);
always @(clk or d)
if (!clk)
q <= d;
endmodule
Сравним RTL-представление данного кода (рис. 9) с рисунком 2.23. Отличие заключается в наличие инвертора на входе LATCH_ENABLE.
12
Рис. 9: RTL-представление D-защёлки после редактирования кода
Дополнительное задание 5
Отредактируем код D-триггера так, чтобы он работал под управлением заднего фронта тактового сигнала. Для этого заменим posedge на negedge.
// d_flip_flop.v module d_flip_flop(
input clk,
input d,
output reg q
);
always @ (negedge clk)
q <= d;
endmodule
Сравним RTL-представление данного кода (рис. ) с рисунком 2.25. Отличие заключается в наличие инвертора на входе CLK.
13
Рис. 10: RTL-представление D-триггера после редактирования кода
Дополнительное задание 6
Реализуем аппаратно JK-триггер.
// de10_lite.v module de10_lite(
input ADC_CLK_10,
input MAX10_CLK1_50,
input MAX10_CLK2_50,
input [ 1:0] KEY,
input [ 9:0] SW,
output [ 9:0] LEDR
);
assign LEDR[9:1] = 8'b0;
JKK JKK(
.CLK ( KEY [0] ),
.J ( KEY [1] ),
.K ( SW [0] ),
.Q ( LEDR[0] )
14
);
endmodule
Рис. 11: RTL-представление JK-триггера
Отредактируем код JK-триггера так, чтобы он работал под управлением заднего фронта тактового сигнала. Для этого заменим posedge на negedge.
// JKK.v module JKK(
input J,
input K,
input CLK,
output reg Q
);
always @(negedge CLK)
begin if (J && K)
Q <= Q;
else if (J && K)
Q <= 1;
else if (J && K)
Q <= 0;
end endmodule
Проведём моделирование отредактированного кода, имитируя всевозможные комбинации входных сигналов, приведённых в таблице переходов на рис 2.16.
15
Рис. 12: Временная диаграмма JK-триггера под управлением заднего фронта тактового сигнала
Из рисунка 12 видно, что JK-триггер работает в соответствии с таблицей переходов за исключением того, что переключение происходит по заднему фронту тактового сигнала.
Проверим работоспособность JK-триггера, наблюдая за состоянием светодиода,
подключённого к выходу. Для больше наглядности, светодиоды LEDR[1], LEDR[2] и LEDR[3]
подключены к сигналам CLK, J и K, соответственно.
Рис. 13: Проверка работоспособности JK-триггера CLK=0, J=1, K=1, Q=1 16
Рис. 14: Проверка работоспособности JK-триггера CLK=1, J=1, K=1, Q=1
Рис. 15: Проверка работоспособности JK-триггера CLK=0, J=1, K=1, Q=0 (Q_prev = 1)
17
Из рисунков 10 и 11 видно, что затраты ресурсов, необходимых для создания JK-триггера больше, чем для D-триггера, на 8 элементов (2 НЕ, 3 И, 3 мультиплексора). D-триггер, в свою очередь, не требует дополнительной комбинационной схемы.
Дополнительное задание 7
Изменим пример в листинге 2.20 для реализации D-триггера с сигналом очистки. Для этого уберём отрицание в условной конструкции.
// dff_sync_rst_n.v module dff_sync_rst_n (
input clk,
input rst_n,
input d,
output reg q
);
always @(posedge clk)
if (rst_n)
q <= 0;
else q <= d;
endmodule
Сравним RTL-представление данной реализации с рисунком 2.29. Из рисунка 16 видно, что единственное отличие заключется в мультиплексоре. В данном случае сигнал d передается при rst_n=0, иначе 0.
Рис. 16: Реализация D-триггера с синхронной очисткой
18
Дополнительное задание 8
Добавим в D-триггер асинхронный сброс (rst_n) и синхронный сигнал очистки (clr).
// dff_async_rst_n_clr.v module dff_async_rst_n_clr(
input clk,
input rst_n,
input clr,
input d,
output reg q
);
always @(posedge clk or negedge rst_n)
if (!rst_n)
q <= 0;
else if (clr)
q <= 0;
else q <= d;
endmodule
Запишем аппаратную реализацию D-триггера с асинхронныи сбросом и синхронным сигналом очистки.
// de10_lite.v module de10_lite(
input ADC_CLK_10,
input MAX10_CLK1_50,
input MAX10_CLK2_50,
input [ 1:0] KEY,
input [ 9:0] SW,
output [ 9:0] LEDR
);
assign LEDR[9:1] = 8'b0;
dff_async_rst_n_clr dff_async_rst_n_clr(
.clk ( KEY [0] ),
.rst_n ( SW [0] ),
.clr ( SW [1] ),
19
.d ( KEY [1] ),
.q ( LEDR[0] )
);
endmodule
Рис. 17: RTL-представление D-триггера с асинхронным сигналом сброса и синхронным сигналом очистки
Из рисунка 17 видно, что для реализации синхронного сигнала очистки необходим дополнительный элемент (мультиплексор), в отличие от реализации асинхронного сигнала сброса.
Дополнительное задание 9
Добавим синхронный положительный сигнал очистки и асинхронный сигнал n_rst.
// dff_with_en_clr_rst_n.v module dff_with_en_clr_rst_n(
input clk,
input en,
input clr,
input rst_n,
input d,
output reg q
);
always @(posedge clk or negedge rst_n)
if (!rst_n)
q <= 0;
else if (clr)
q <= 0;
else if (en)
q <= d;
endmodule
20
Рис. 18: RTL-представление активируемого D-триггера с синхронным положительным сигналом очистки и асинхронным сигналом сброса
Из рисунка 18 видно, что при добавлении синхронного сигнала очистки, для реализация активируемого D-триггер необходимо два мультиплексора: один для очистки, второй для активации.
Дополнительное задание 10
Добавим положительный сигнал синхронной очистки (clr), асинхронный сброс rst_n и сигнал разрешения работы en.
// dff_with_en_clr_rst_n_param.v module dff_with_en_clr_rst_n_param #(
parameter WIDTH = 8,
RESET = 8'b0
)(
input clk,
input en,
input clr,
input rst_n,
input [WIDTH - 1:0] d,
output reg [WIDTH - 1:0] q
);
always @(posedge clk or negedge rst_n)
if (!rst_n)
q <= RESET;
21
else if (clr)
q <= RESET;
else if (en)
q <= d;
endmodule
Рис. 19: RTL-представление параметризированного активирующегося D-триггера с положительным сигналом синхронного сброса, асинхронным сбросом и сигналом разрешения работы
Из рисунка 19 видно, что как и в случае с непараметризированным триггером, при добавлении синхронного сигнала очистки, для реализации необходимо два мультиплексора.
Выводы
Бла-бла.
Контрольные вопросы
22
ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ АВТОНОМНОЕ
ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ОБРАЗОВАНИЯ
«НАЦИОНАЛЬНЫЙ ИССЛЕДОВАТЕЛЬСКИЙ УНИВЕРСИТЕТ
«ВЫСШАЯ ШКОЛА ЭКОНОМИКИ»
Московский институт электроники и математики им. А.Н.Тихонова
«Основы последовательностной логики. Управление энергопотреблением цифровой схемы»
Практическая работа №2
по направлению 09.03.01 Информатика и вычислительная техника студента образовательной программы бакалавриата
«Информатика и вычислительная техника»
Проверил:
Лежнев Евгений Владимирович
Выполнил:
Степченко Александр Сергеевич
Корчагин Илья Александрович
БИВ196
Москва 2022 г.
Содержание
Задания..........................................................................................................................................................3
Основное задание....................................................................................................................................3
Дополнительное задание 1.....................................................................................................................3
Дополнительное задание 2.....................................................................................................................3
Дополнительное задание 3.....................................................................................................................3
Дополнительное задание 4.....................................................................................................................3
Дополнительное задание 5.....................................................................................................................3
Дополнительное задание 6.....................................................................................................................3
Дополнительное задание 7.....................................................................................................................4
Дополнительное задание 8.....................................................................................................................4
Дополнительное задание 9.....................................................................................................................4
Дополнительное задание 10...................................................................................................................4
Выполнение работы.....................................................................................................................................4
Дополнительное задание 1.....................................................................................................................4
Дополнительное задание 2.....................................................................................................................7
Дополнительное задание 3...................................................................................................................11
Дополнительное задание 4...................................................................................................................12
Дополнительное задание 5...................................................................................................................13
Дополнительное задание 6...................................................................................................................14
Дополнительное задание 7...................................................................................................................18
Дополнительное задание 8...................................................................................................................19
Дополнительное задание 9...................................................................................................................20
Дополнительное задание 10.................................................................................................................21
Выводы........................................................................................................................................................22
Контрольные вопросы...............................................................................................................................22 2
Задания
Основное задание
Выполните все дополнительные задания данной главы.
Дополнительное задание 1
Используя опыт, полученный при создании двухступенчатого RS-триггера, самостоятельно разработайте на языке Verilog модуль, описывающий структуру JK-триггера, приведённую на рисунке 2.17.
Дополнительное задание 2
Используя созданные ранее D-триггер и JK-триггер, опишите Verilog-модули T-триггера
в соответствии с рис. 2.18 и самостоятельное постройте таблицу переходов данного триггера.
Дополнительное задание 3
Найти в сети интернет документ с рекомендациями по программированию на языке HDL
для ПЛИС производства компании Intel FPGA.
Дополнительное задание 4
Отредактируйте код D-защелки (листинг 2.16) так, чтобы входное значение сохранялось при низком уровне тактового сигнала. Скомпилируйте код и сравните его RTL-представление с рис. 2.23.
Дополнительное задание 5
Измените D-триггер, код которого приведён в листинге 2.17, так, чтобы он работал под управлением заднего фронта тактового сигнала. Для этого необходимо заменить ключевое слово
posedge на negedge. Скомпилируйте проект и сравните его RTL-представление с предыдущей реализацией на рисунке 2.25.
Дополнительное задание 6
Используя опыт, полученный при реализации D-триггера, самостоятельно отредактируйте код листинга 2.19. Проведите его моделирование, иммитируя все возможные комбинации входных
3
сигналов, приведённые в таблице переходов на рис. 2.16. Сравните получаемые результаты с таблицей.
Аналогичным образом отредактируйте код листинга 2.18, добавив ещё одну кнопку.
Проверьте работоспособность JK-триггера, наблюдая за состоянием светодиода, подключённого к выходу. Сравните затраты ресурсов, необходимых для создания D-триггера и JK-триггера в RTL
Viewer.
Дополнительное задание 7
Неинвертированный синхронный сигнал сброса часто называют сигналом очистки.
Измените пример в листинге 2.20 для реализации D-триггера с сигналом очистки. Сравните его
RTL-представление с рис. 2.29.
Дополнительное задание 8
Добавьте в D-триггер асинхронный сброс с сигналом очистки, реализованным на предыдущем шаге. Модуль должен иметь положительный синхронный сигнал очистки и в тоже время асинхронный вход n_rst. Сравните его аппаратную реализацию (RTL-представление) с рис.
2.31.
Дополнительное задание 9
Измените активируемый триггер в листинге 2.24. Необходимо добавить синхронный положительный сигнал очистки и асинхронный сигнал n_rst. Сравните аппаратную реализацию
(RTL View) с рис. 2.35.
Дополнительное задание 10
Измените реализацию тригерра, приведённую в листинге 2.28. Добавьте положительный сигнал синхронной очистки, асинхронный сброс rst_n и сигнал разрешения работы en. Сравните аппаратную реализацию (RTL View) с рис. 2.37.
Выполнение работы
Дополнительное задание 1
Создадим проект в Quartus под названием lab_02. JK-триггер строиться на основе RS- триггера, поэтому сначала реализуем RS-триггер на элементах И-НЕ в файле sr_latch.v.
Получившаяся схема представлена на рисунке 1.
// sr_latch.v module sr_latch (
4
input s,
input r,
output q,
output q_n
);
assign q = (s & q_n);
assign q_n = (r & q);
endmodule
Рис. 1: Логическая схема RS-триггера в RTL Viewer
Разработаем модуль, описывающий структуру JK-триггера на рисунке 2.17 (а) типа защёлка.
// jk_latch.v module jk_latch (
input clk,
input j,
input k,
output q,
output q_n
);
wire nand1 = (clk & j & q_n);
wire nand2 = (clk & k & q);
5
sr_latch sr_latch(nand1, nand2, q, q_n);
endmodule
На рисунке 2 представлена логическая схема данной реализации триггера, открытая в RTL
Viewer для файла jk_latch.v, которая совпадает со схемой на рисунке 2.17 (а).
Рис. 2: Логическая схема, построенная по рисунку 2.17 (а)
Разработаем модуль, описывающий структуру JK-триггера на рисунке 2.17 (б) типа триггер.
// jk_flip_flop.v module jk_flip_flop (
input clk,
input j,
input k,
output q,
output q_n
);
wire g1 = (clk & j & q_n);
wire g2 = (clk & k & q);
6
wire q1, q1_n;
sr_latch master(g1, g2, q1, q1_n);
wire g5 = (g1 & q1);
wire g6 = (g2 & q1_n);
sr_latch slave(g5, g6, q, q_n);
endmodule
На рисунке 3 представлена логическая схема данной реализации триггера, открытая в RTL
Viewer для файла jk_flip_flop.v, которая совпадает со схемой на рисунке 2.17 (б).
Рис. 3: Логическая схема JK-триггера, построенная по рис 2.17 (б)
Дополнительное задание 2
Реализуем D-защёлку в файле d_latch.v на основе RS-триггера.
// d_latch.v module d_latch(
input clk,
input d,
7
output q,
output q_n
);
wire s = d & clk;
wire r = d & clk;
sr_latch sr_latch(s, r, q, q_n);
endmodule
Рис. 4: Логическая схема D-защёлки
Реализуем D-триггер в файле d_flip_flop.v.
// d_flip_flop.v module d_flip_flop(
input clk,
input d,
output q,
output q_n
);
wire n1;
d_latch master(
.clk(clk),
8
.d(d),
.q(n1)
);
d_latch slave(
.clk(clk),
.d(n1),
.q(q),
.q_n(q_n)
);
endmodule
Рис. 5: Логическая схема D-триггера
Построим таблицу переходов T-триггера.
Таблица 1
Таблица переходов T-триггера
CLK
T
Q
0→1 0
Q
prev
0→1 1
Q
prev
9
Реализуем T-триггер с использованием D-триггера в файле t_flip_flop_d.v.
// t_flip_flop_d.v module t_flip_flop_d (
input clk,
input t,
output q,
output q_n
);
wire d = t ^ q;
d_flip_flop d_flip_flop(
.clk(clk),
.d(d),
.q(q),
.q_n(q_n)
);
endmodule
Рис. 6: Логическая схема T-триггера с использованием D-триггера
Реализуем T-триггер с использованием JK-триггера в файле t_flip_flop_jk.v.
10
// t_flip_flop_jk.v module t_flip_flop_jk (
input clk,
input t,
output q,
output q_n
);
jk_flip_flop jk_flip_flop(
.clk(clk),
.j(t),
.k(t),
.q(q),
.q_n(q_n)
);
endmodule
Рис. 7: Логическая схема T-триггера с использованием JK-триггера
Дополнительное задание 3
Найдём в интернете рекомендации по программированию на HDL для ПЛИС производства компании Intel FPGA (рис. 8). Перейдём по первой ссылке.
http://www.gstitt.ece.ufl.edu/courses/spring10/eel4712/lectures/vhdl/qts_qii51007.pdf
11
Рис. 8: Поисковой запрос
Дополнительное задание 4
Отредактируем код D-защёлки так, чтобы входное значение сохранялось при низком уровне тактового сигнала. Для этого в условной конструкции поставим отрицание.
// d_latch.v module d_latch(
input clk,
input d,
output reg q
);
always @(clk or d)
if (!clk)
q <= d;
endmodule
Сравним RTL-представление данного кода (рис. 9) с рисунком 2.23. Отличие заключается в наличие инвертора на входе LATCH_ENABLE.
12
Рис. 9: RTL-представление D-защёлки после редактирования кода
Дополнительное задание 5
Отредактируем код D-триггера так, чтобы он работал под управлением заднего фронта тактового сигнала. Для этого заменим posedge на negedge.
// d_flip_flop.v module d_flip_flop(
input clk,
input d,
output reg q
);
always @ (negedge clk)
q <= d;
endmodule
Сравним RTL-представление данного кода (рис. ) с рисунком 2.25. Отличие заключается в наличие инвертора на входе CLK.
13
Рис. 10: RTL-представление D-триггера после редактирования кода
Дополнительное задание 6
Реализуем аппаратно JK-триггер.
// de10_lite.v module de10_lite(
input ADC_CLK_10,
input MAX10_CLK1_50,
input MAX10_CLK2_50,
input [ 1:0] KEY,
input [ 9:0] SW,
output [ 9:0] LEDR
);
assign LEDR[9:1] = 8'b0;
JKK JKK(
.CLK ( KEY [0] ),
.J ( KEY [1] ),
.K ( SW [0] ),
.Q ( LEDR[0] )
14
);
endmodule
Рис. 11: RTL-представление JK-триггера
Отредактируем код JK-триггера так, чтобы он работал под управлением заднего фронта тактового сигнала. Для этого заменим posedge на negedge.
// JKK.v module JKK(
input J,
input K,
input CLK,
output reg Q
);
always @(negedge CLK)
begin if (J && K)
Q <= Q;
else if (J && K)
Q <= 1;
else if (J && K)
Q <= 0;
end endmodule
Проведём моделирование отредактированного кода, имитируя всевозможные комбинации входных сигналов, приведённых в таблице переходов на рис 2.16.
15
Рис. 12: Временная диаграмма JK-триггера под управлением заднего фронта тактового сигнала
Из рисунка 12 видно, что JK-триггер работает в соответствии с таблицей переходов за исключением того, что переключение происходит по заднему фронту тактового сигнала.
Проверим работоспособность JK-триггера, наблюдая за состоянием светодиода,
подключённого к выходу. Для больше наглядности, светодиоды LEDR[1], LEDR[2] и LEDR[3]
подключены к сигналам CLK, J и K, соответственно.
Рис. 13: Проверка работоспособности JK-триггера CLK=0, J=1, K=1, Q=1 16
Рис. 14: Проверка работоспособности JK-триггера CLK=1, J=1, K=1, Q=1
Рис. 15: Проверка работоспособности JK-триггера CLK=0, J=1, K=1, Q=0 (Q_prev = 1)
17
Из рисунков 10 и 11 видно, что затраты ресурсов, необходимых для создания JK-триггера больше, чем для D-триггера, на 8 элементов (2 НЕ, 3 И, 3 мультиплексора). D-триггер, в свою очередь, не требует дополнительной комбинационной схемы.
Дополнительное задание 7
Изменим пример в листинге 2.20 для реализации D-триггера с сигналом очистки. Для этого уберём отрицание в условной конструкции.
// dff_sync_rst_n.v module dff_sync_rst_n (
input clk,
input rst_n,
input d,
output reg q
);
always @(posedge clk)
if (rst_n)
q <= 0;
else q <= d;
endmodule
Сравним RTL-представление данной реализации с рисунком 2.29. Из рисунка 16 видно, что единственное отличие заключется в мультиплексоре. В данном случае сигнал d передается при rst_n=0, иначе 0.
Рис. 16: Реализация D-триггера с синхронной очисткой
18
Дополнительное задание 8
Добавим в D-триггер асинхронный сброс (rst_n) и синхронный сигнал очистки (clr).
// dff_async_rst_n_clr.v module dff_async_rst_n_clr(
input clk,
input rst_n,
input clr,
input d,
output reg q
);
always @(posedge clk or negedge rst_n)
if (!rst_n)
q <= 0;
else if (clr)
q <= 0;
else q <= d;
endmodule
Запишем аппаратную реализацию D-триггера с асинхронныи сбросом и синхронным сигналом очистки.
// de10_lite.v module de10_lite(
input ADC_CLK_10,
input MAX10_CLK1_50,
input MAX10_CLK2_50,
input [ 1:0] KEY,
input [ 9:0] SW,
output [ 9:0] LEDR
);
assign LEDR[9:1] = 8'b0;
dff_async_rst_n_clr dff_async_rst_n_clr(
.clk ( KEY [0] ),
.rst_n ( SW [0] ),
.clr ( SW [1] ),
19
.d ( KEY [1] ),
.q ( LEDR[0] )
);
endmodule
Рис. 17: RTL-представление D-триггера с асинхронным сигналом сброса и синхронным сигналом очистки
Из рисунка 17 видно, что для реализации синхронного сигнала очистки необходим дополнительный элемент (мультиплексор), в отличие от реализации асинхронного сигнала сброса.
Дополнительное задание 9
Добавим синхронный положительный сигнал очистки и асинхронный сигнал n_rst.
// dff_with_en_clr_rst_n.v module dff_with_en_clr_rst_n(
input clk,
input en,
input clr,
input rst_n,
input d,
output reg q
);
always @(posedge clk or negedge rst_n)
if (!rst_n)
q <= 0;
else if (clr)
q <= 0;
else if (en)
q <= d;
endmodule
20
Рис. 18: RTL-представление активируемого D-триггера с синхронным положительным сигналом очистки и асинхронным сигналом сброса
Из рисунка 18 видно, что при добавлении синхронного сигнала очистки, для реализация активируемого D-триггер необходимо два мультиплексора: один для очистки, второй для активации.
Дополнительное задание 10
Добавим положительный сигнал синхронной очистки (clr), асинхронный сброс rst_n и сигнал разрешения работы en.
// dff_with_en_clr_rst_n_param.v module dff_with_en_clr_rst_n_param #(
parameter WIDTH = 8,
RESET = 8'b0
)(
input clk,
input en,
input clr,
input rst_n,
input [WIDTH - 1:0] d,
output reg [WIDTH - 1:0] q
);
always @(posedge clk or negedge rst_n)
if (!rst_n)
q <= RESET;
21
else if (clr)
q <= RESET;
else if (en)
q <= d;
endmodule
Рис. 19: RTL-представление параметризированного активирующегося D-триггера с положительным сигналом синхронного сброса, асинхронным сбросом и сигналом разрешения работы
Из рисунка 19 видно, что как и в случае с непараметризированным триггером, при добавлении синхронного сигнала очистки, для реализации необходимо два мультиплексора.
Выводы
Бла-бла.
Контрольные вопросы
22
ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ АВТОНОМНОЕ
ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ОБРАЗОВАНИЯ
«НАЦИОНАЛЬНЫЙ ИССЛЕДОВАТЕЛЬСКИЙ УНИВЕРСИТЕТ
«ВЫСШАЯ ШКОЛА ЭКОНОМИКИ»
Московский институт электроники и математики им. А.Н.Тихонова
«Основы последовательностной логики. Управление энергопотреблением цифровой схемы»
Практическая работа №2
по направлению 09.03.01 Информатика и вычислительная техника студента образовательной программы бакалавриата
«Информатика и вычислительная техника»
Проверил:
Лежнев Евгений Владимирович
Выполнил:
Степченко Александр Сергеевич
Корчагин Илья Александрович
БИВ196
Москва 2022 г.
Содержание
Задания..........................................................................................................................................................3
Основное задание....................................................................................................................................3
Дополнительное задание 1.....................................................................................................................3
Дополнительное задание 2.....................................................................................................................3
Дополнительное задание 3.....................................................................................................................3
Дополнительное задание 4.....................................................................................................................3
Дополнительное задание 5.....................................................................................................................3
Дополнительное задание 6.....................................................................................................................3
Дополнительное задание 7.....................................................................................................................4
Дополнительное задание 8.....................................................................................................................4
Дополнительное задание 9.....................................................................................................................4
Дополнительное задание 10...................................................................................................................4
Выполнение работы.....................................................................................................................................4
Дополнительное задание 1.....................................................................................................................4
Дополнительное задание 2.....................................................................................................................7
Дополнительное задание 3...................................................................................................................11
Дополнительное задание 4...................................................................................................................12
Дополнительное задание 5...................................................................................................................13
Дополнительное задание 6...................................................................................................................14
Дополнительное задание 7...................................................................................................................18
Дополнительное задание 8...................................................................................................................19
Дополнительное задание 9...................................................................................................................20
Дополнительное задание 10.................................................................................................................21
Выводы........................................................................................................................................................22
Контрольные вопросы...............................................................................................................................22 2
Задания
Основное задание
Выполните все дополнительные задания данной главы.
Дополнительное задание 1
Используя опыт, полученный при создании двухступенчатого RS-триггера, самостоятельно разработайте на языке Verilog модуль, описывающий структуру JK-триггера, приведённую на рисунке 2.17.
Дополнительное задание 2
Используя созданные ранее D-триггер и JK-триггер, опишите Verilog-модули T-триггера
в соответствии с рис. 2.18 и самостоятельное постройте таблицу переходов данного триггера.
Дополнительное задание 3
Найти в сети интернет документ с рекомендациями по программированию на языке HDL
для ПЛИС производства компании Intel FPGA.
Дополнительное задание 4
Отредактируйте код D-защелки (листинг 2.16) так, чтобы входное значение сохранялось при низком уровне тактового сигнала. Скомпилируйте код и сравните его RTL-представление с рис. 2.23.
Дополнительное задание 5
Измените D-триггер, код которого приведён в листинге 2.17, так, чтобы он работал под управлением заднего фронта тактового сигнала. Для этого необходимо заменить ключевое слово
posedge на negedge. Скомпилируйте проект и сравните его RTL-представление с предыдущей реализацией на рисунке 2.25.
Дополнительное задание 6
Используя опыт, полученный при реализации D-триггера, самостоятельно отредактируйте код листинга 2.19. Проведите его моделирование, иммитируя все возможные комбинации входных
3
Аналогичным образом отредактируйте код листинга 2.18, добавив ещё одну кнопку.
Проверьте работоспособность JK-триггера, наблюдая за состоянием светодиода, подключённого к выходу. Сравните затраты ресурсов, необходимых для создания D-триггера и JK-триггера в RTL
Viewer.
Дополнительное задание 7
Неинвертированный синхронный сигнал сброса часто называют сигналом очистки.
Измените пример в листинге 2.20 для реализации D-триггера с сигналом очистки. Сравните его
RTL-представление с рис. 2.29.
Дополнительное задание 8
Добавьте в D-триггер асинхронный сброс с сигналом очистки, реализованным на предыдущем шаге. Модуль должен иметь положительный синхронный сигнал очистки и в тоже время асинхронный вход n_rst. Сравните его аппаратную реализацию (RTL-представление) с рис.
2.31.
Дополнительное задание 9
Измените активируемый триггер в листинге 2.24. Необходимо добавить синхронный положительный сигнал очистки и асинхронный сигнал n_rst. Сравните аппаратную реализацию
(RTL View) с рис. 2.35.
Дополнительное задание 10
Измените реализацию тригерра, приведённую в листинге 2.28. Добавьте положительный сигнал синхронной очистки, асинхронный сброс rst_n и сигнал разрешения работы en. Сравните аппаратную реализацию (RTL View) с рис. 2.37.
Выполнение работы
Дополнительное задание 1
Создадим проект в Quartus под названием lab_02. JK-триггер строиться на основе RS- триггера, поэтому сначала реализуем RS-триггер на элементах И-НЕ в файле sr_latch.v.
Получившаяся схема представлена на рисунке 1.
// sr_latch.v module sr_latch (
4
input r,
output q,
output q_n
);
assign q = (s & q_n);
assign q_n = (r & q);
endmodule
Рис. 1: Логическая схема RS-триггера в RTL Viewer
Разработаем модуль, описывающий структуру JK-триггера на рисунке 2.17 (а) типа защёлка.
// jk_latch.v module jk_latch (
input clk,
input j,
input k,
output q,
output q_n
);
wire nand1 = (clk & j & q_n);
wire nand2 = (clk & k & q);
5
endmodule
На рисунке 2 представлена логическая схема данной реализации триггера, открытая в RTL
Viewer для файла jk_latch.v, которая совпадает со схемой на рисунке 2.17 (а).
Рис. 2: Логическая схема, построенная по рисунку 2.17 (а)
Разработаем модуль, описывающий структуру JK-триггера на рисунке 2.17 (б) типа триггер.
// jk_flip_flop.v module jk_flip_flop (
input clk,
input j,
input k,
output q,
output q_n
);
wire g1 = (clk & j & q_n);
wire g2 = (clk & k & q);
6
sr_latch master(g1, g2, q1, q1_n);
wire g5 = (g1 & q1);
wire g6 = (g2 & q1_n);
sr_latch slave(g5, g6, q, q_n);
endmodule
На рисунке 3 представлена логическая схема данной реализации триггера, открытая в RTL
Viewer для файла jk_flip_flop.v, которая совпадает со схемой на рисунке 2.17 (б).
Рис. 3: Логическая схема JK-триггера, построенная по рис 2.17 (б)
Дополнительное задание 2
Реализуем D-защёлку в файле d_latch.v на основе RS-триггера.
// d_latch.v module d_latch(
input clk,
input d,
7
output q_n
);
wire s = d & clk;
wire r = d & clk;
sr_latch sr_latch(s, r, q, q_n);
endmodule
Рис. 4: Логическая схема D-защёлки
Реализуем D-триггер в файле d_flip_flop.v.
// d_flip_flop.v module d_flip_flop(
input clk,
input d,
output q,
output q_n
);
wire n1;
d_latch master(
.clk(clk),
8
.d(d),
.q(n1)
);
d_latch slave(
.clk(clk),
.d(n1),
.q(q),
.q_n(q_n)
);
endmodule
Рис. 5: Логическая схема D-триггера
Построим таблицу переходов T-триггера.
Таблица 1
Таблица переходов T-триггера
CLK
T
Q
0→1 0
Q
prev
0→1 1
Q
prev
9
Реализуем T-триггер с использованием D-триггера в файле t_flip_flop_d.v.
// t_flip_flop_d.v module t_flip_flop_d (
input clk,
input t,
output q,
output q_n
);
wire d = t ^ q;
d_flip_flop d_flip_flop(
.clk(clk),
.d(d),
.q(q),
.q_n(q_n)
);
endmodule
Рис. 6: Логическая схема T-триггера с использованием D-триггера
Реализуем T-триггер с использованием JK-триггера в файле t_flip_flop_jk.v.
10
// t_flip_flop_jk.v module t_flip_flop_jk (
input clk,
input t,
output q,
output q_n
);
jk_flip_flop jk_flip_flop(
.clk(clk),
.j(t),
.k(t),
.q(q),
.q_n(q_n)
);
endmodule
Рис. 7: Логическая схема T-триггера с использованием JK-триггера
Дополнительное задание 3
Найдём в интернете рекомендации по программированию на HDL для ПЛИС производства компании Intel FPGA (рис. 8). Перейдём по первой ссылке.
http://www.gstitt.ece.ufl.edu/courses/spring10/eel4712/lectures/vhdl/qts_qii51007.pdf
11
Рис. 8: Поисковой запрос
Дополнительное задание 4
Отредактируем код D-защёлки так, чтобы входное значение сохранялось при низком уровне тактового сигнала. Для этого в условной конструкции поставим отрицание.
// d_latch.v module d_latch(
input clk,
input d,
output reg q
);
always @(clk or d)
if (!clk)
q <= d;
endmodule
Сравним RTL-представление данного кода (рис. 9) с рисунком 2.23. Отличие заключается в наличие инвертора на входе LATCH_ENABLE.
12
Рис. 9: RTL-представление D-защёлки после редактирования кода
Дополнительное задание 5
Отредактируем код D-триггера так, чтобы он работал под управлением заднего фронта тактового сигнала. Для этого заменим posedge на negedge.
// d_flip_flop.v module d_flip_flop(
input clk,
input d,
output reg q
);
always @ (negedge clk)
q <= d;
endmodule
Сравним RTL-представление данного кода (рис. ) с рисунком 2.25. Отличие заключается в наличие инвертора на входе CLK.
13
Рис. 10: RTL-представление D-триггера после редактирования кода
Дополнительное задание 6
Реализуем аппаратно JK-триггер.
// de10_lite.v module de10_lite(
input ADC_CLK_10,
input MAX10_CLK1_50,
input MAX10_CLK2_50,
input [ 1:0] KEY,
input [ 9:0] SW,
output [ 9:0] LEDR
);
assign LEDR[9:1] = 8'b0;
JKK JKK(
.CLK ( KEY [0] ),
.J ( KEY [1] ),
.K ( SW [0] ),
.Q ( LEDR[0] )
14
);
endmodule
Рис. 11: RTL-представление JK-триггера
Отредактируем код JK-триггера так, чтобы он работал под управлением заднего фронта тактового сигнала. Для этого заменим posedge на negedge.
// JKK.v module JKK(
input J,
input K,
input CLK,
output reg Q
);
always @(negedge CLK)
begin if (J && K)
Q <= Q;
else if (J && K)
Q <= 1;
else if (J && K)
Q <= 0;
end endmodule
Проведём моделирование отредактированного кода, имитируя всевозможные комбинации входных сигналов, приведённых в таблице переходов на рис 2.16.
15
Рис. 12: Временная диаграмма JK-триггера под управлением заднего фронта тактового сигнала
Из рисунка 12 видно, что JK-триггер работает в соответствии с таблицей переходов за исключением того, что переключение происходит по заднему фронту тактового сигнала.
Проверим работоспособность JK-триггера, наблюдая за состоянием светодиода,
подключённого к выходу. Для больше наглядности, светодиоды LEDR[1], LEDR[2] и LEDR[3]
подключены к сигналам CLK, J и K, соответственно.
Рис. 13: Проверка работоспособности JK-триггера CLK=0, J=1, K=1, Q=1 16
Рис. 14: Проверка работоспособности JK-триггера CLK=1, J=1, K=1, Q=1
Рис. 15: Проверка работоспособности JK-триггера CLK=0, J=1, K=1, Q=0 (Q_prev = 1)
17
Из рисунков 10 и 11 видно, что затраты ресурсов, необходимых для создания JK-триггера больше, чем для D-триггера, на 8 элементов (2 НЕ, 3 И, 3 мультиплексора). D-триггер, в свою очередь, не требует дополнительной комбинационной схемы.
Дополнительное задание 7
Изменим пример в листинге 2.20 для реализации D-триггера с сигналом очистки. Для этого уберём отрицание в условной конструкции.
// dff_sync_rst_n.v module dff_sync_rst_n (
input clk,
input rst_n,
input d,
output reg q
);
always @(posedge clk)
if (rst_n)
q <= 0;
else q <= d;
endmodule
Сравним RTL-представление данной реализации с рисунком 2.29. Из рисунка 16 видно, что единственное отличие заключется в мультиплексоре. В данном случае сигнал d передается при rst_n=0, иначе 0.
Рис. 16: Реализация D-триггера с синхронной очисткой
18
Дополнительное задание 8
Добавим в D-триггер асинхронный сброс (rst_n) и синхронный сигнал очистки (clr).
// dff_async_rst_n_clr.v module dff_async_rst_n_clr(
input clk,
input rst_n,
input clr,
input d,
output reg q
);
always @(posedge clk or negedge rst_n)
if (!rst_n)
q <= 0;
else if (clr)
q <= 0;
else q <= d;
endmodule
Запишем аппаратную реализацию D-триггера с асинхронныи сбросом и синхронным сигналом очистки.
// de10_lite.v module de10_lite(
input ADC_CLK_10,
input MAX10_CLK1_50,
input MAX10_CLK2_50,
input [ 1:0] KEY,
input [ 9:0] SW,
output [ 9:0] LEDR
);
assign LEDR[9:1] = 8'b0;
dff_async_rst_n_clr dff_async_rst_n_clr(
.clk ( KEY [0] ),
.rst_n ( SW [0] ),
.clr ( SW [1] ),
19
.d ( KEY [1] ),
.q ( LEDR[0] )
);
endmodule
Рис. 17: RTL-представление D-триггера с асинхронным сигналом сброса и синхронным сигналом очистки
Из рисунка 17 видно, что для реализации синхронного сигнала очистки необходим дополнительный элемент (мультиплексор), в отличие от реализации асинхронного сигнала сброса.
Дополнительное задание 9
Добавим синхронный положительный сигнал очистки и асинхронный сигнал n_rst.
// dff_with_en_clr_rst_n.v module dff_with_en_clr_rst_n(
input clk,
input en,
input clr,
input rst_n,
input d,
output reg q
);
always @(posedge clk or negedge rst_n)
if (!rst_n)
q <= 0;
else if (clr)
q <= 0;
else if (en)
q <= d;
endmodule
20
Рис. 18: RTL-представление активируемого D-триггера с синхронным положительным сигналом очистки и асинхронным сигналом сброса
Из рисунка 18 видно, что при добавлении синхронного сигнала очистки, для реализация активируемого D-триггер необходимо два мультиплексора: один для очистки, второй для активации.
Дополнительное задание 10
Добавим положительный сигнал синхронной очистки (clr), асинхронный сброс rst_n и сигнал разрешения работы en.
// dff_with_en_clr_rst_n_param.v module dff_with_en_clr_rst_n_param #(
parameter WIDTH = 8,
RESET = 8'b0
)(
input clk,
input en,
input clr,
input rst_n,
input [WIDTH - 1:0] d,
output reg [WIDTH - 1:0] q
);
always @(posedge clk or negedge rst_n)
if (!rst_n)
q <= RESET;
21
q <= RESET;
else if (en)
q <= d;
endmodule
Рис. 19: RTL-представление параметризированного активирующегося D-триггера с положительным сигналом синхронного сброса, асинхронным сбросом и сигналом разрешения работы
Из рисунка 19 видно, что как и в случае с непараметризированным триггером, при добавлении синхронного сигнала очистки, для реализации необходимо два мультиплексора.
Выводы
Бла-бла.
Контрольные вопросы
22