19 / 37 · Теория
parameter, localparam,$clog2 и граничные конфигурации
Разделите входы выполнения и настройку, проектируя ширину и завершение для N=1 и не степеней двойки.
Уроки доступны бесплатно. Запишитесь, чтобы сохранять прогресс.
Параметры фиксируются при elaboration
Порт меняется во время работы; parameter настраивает до построения; localparam именует производную константу, не переопределяемую экземпляром. Это не переменные каждого цикла. Счётчик по модулю N использует 0..N−1. Для N≥2 ширина $clog2(N); при N=1 получается ноль, поэтому выделите хотя бы бит. N=0 вне контракта.
Завершение на разрешённом фронте
Переход старого count с N−1 на ноль регистрирует pulse. Запрещённый фронт удерживает count и очищает pulse. Синхронный сброс очищает оба и важнее enable. N — положительное целое в поддерживаемом диапазоне.
module modulo_tick #(
parameter integer N = 5,
parameter integer CW = (N <= 1) ? 1 : $clog2(N)
) (
input logic clk, rst, enable,
output logic [CW-1:0] count,
output logic pulse
);
localparam logic [CW-1:0] LAST = CW'(N-1);
always_ff @(posedge clk) begin
if (rst) begin
count <= '0;
pulse <= 1'b0;
end else begin
pulse <= 1'b0;
if (enable) begin
if (count >= LAST) begin
count <= '0;
pulse <= 1'b1;
end else count <= count + 1'b1;
end
end
end
endmoduleCW входит в порты и открыт для настройки. Оставьте стандарт либо ≥max(1,$clog2(N)). Меньший размер обрезает LAST; больший создаёт неиспользуемые коды, возвращаемые к нулю условием >= на разрешённом фронте. CW'(N-1) задаёт размер, но не исправляет неверные параметры. Проверяйте до elaboration: динамическое утверждение не исправляет ошибочную декларацию.
Матрица конфигураций
| N | Стандарт CW | count после разрешённых фронтов от сброса | pulse после |
|---|---|---|---|
| 1 | 1 | 0,0,0 | 1,1,1 |
| 2 | 1 | 1,0,1 | 0,1,0 |
| 5 | 3 | 1,2,3,4,0 | 0,0,0,0,1 |
| 8 | 3 | 1,2,3,4,5,6,7,0 | 0,0,0,0,0,0,0,1 |
Бит хранения не делает два состояния допустимыми для N=1. N=5 обычно не посещает 5,6,7. Проверка только степеней двойки скрывает отсутствие явного сравнения для возврата.
Практика: поведение и отклонение
Создайте N=1,2,5,8, проверьте хотя бы два периода, приостановите у последнего значения и сбросьте одновременно с enable. Сравните каждый count/pulse. Целочисленный эталон очищается по сбросу, обнуляет pulse и при enable повышает счёт по модулю N с обнаружением возврата, без CW или внутренних состояний. Проверьте отклонение N=0 и недостаточного CW. Повторное использование подтверждено для заявленного и проверенного диапазона, а не одного успешного стандарта.