-
Notifications
You must be signed in to change notification settings - Fork 28
Problem 02: Clock divider
В этом задании мы сделаем параметризуемый делитель частоты.
Выберите какое-нибудь число X
в интервале [10; 16]. В этом задании мы будем делать делитель частоты на 2^X
.
Перейдите в каталог problems/02_clock_div
в вашей локальной копии репозитория.
Создайте файл clk_div.v
с модулем clk_div
. Этот модуль должен иметь один вход для тактового сигнала и один выход для тактового сигнала с частотой в 2^X
раз меньше. Например, вот так:
module clk_div(
input clk,
output clk_out
);
Напоминание: для того чтобы поделить частоту на 2^X
, используйте регистр шириной X
и увеличивайте его на 1 внутри always
-блока.
Создайте экземпляр модуля и нужные для его работы соединения опишите в файле testbench.v
.
В модуле testbench
принимается, что период тактового сигнала clk
- 2 нс. Подсчитайте, через сколько наносекунд симуляция должна остановиться, чтобы прошло хотя бы несколько тактов поделенной частоты. С помощью директивы $finish
реализуйте это.
Скомпилируйте код с помощью make pset02
. Запустите симуляцию командой make test
. С помощью GTKwave проверьте, что делитель частоты работает.
Попробуйте превратить модуль clk_div
в параметризованный модуль.
Предположим, что заголовок модуля выглядел следующим образом:
module clk_div(
input clk,
output clk_out
);
Измените первую строку объявления таким образом:
module clk_div #(parameter X = 12)(
input clk,
output clk_out
);
Теперь внутри модуля можно пользоваться параметром X
. Например, можно сделать разрядность счетчика параметризуемой:
reg [X-1:0]cnt;
Таким образом, можно на этапе создания экземпляра делителя частоты определять, на сколько будет делиться частота:
clk_div #(.X(16)) clk_div(.clk(clk), .clk1(clk_out));
Если создавать экземпляр как раньше, то параметр X
будет иметь значение по умолчанию, в данном случае - 12.
Перекомпилируйте код несколько раз с разными значениями делителя, посмотрите на получившиеся сигналы в GTKWave и проверьте, что всё работает.
Вопрос: какой коэффициент заполнения получился у сигнала clk_out
при разных значениях параметра?