Я пытаюсь написать простой код Verilog по практическим соображениям. Я использую FPGA Cyclone 4. Мой 8-битный счетчик отлично работает с встроенными часами (50 МГц), но это слишком быстро, чтобы увидеть светодиоды на такой скорости, поэтому я сначала попытался замедлить часы с помощью этого:
module enableCounter(
input clock_5,
input reset,
output reg enable_out);
reg [3:0] counter;
always @(posedge clock_5) begin
if (reset) begin
counter <= 4'b0000;
end
else begin
counter <= counter + 1;
if (counter == 4'b0000)
enable_out <= 1;
else
enable_out <= 0;
end
end
endmodule
Технически это установило бы выход enable_out на 1 только 8-ю часть времени clock_5. Для подсчета вверх и вниз я также написал эту функцию:
module updown_counter(
input up_down,
input clk,
input enable,
input reset,
output reg [7:0] count_out);
always @ (posedge clk) begin
if (up_down == 0) begin // Count UP
if (reset)
count_out <= 8'b0000_0000;
else if (enable && count_out == 8'b1111_1111)
count_out <= 8'b0000_0000;
else if (enable && count_out != 8'b1111_1111)
count_out <= count_out + 8'b0000_0001;
else
count_out <= count_out;
end
else if (up_down == 1) begin // Count DOWN
if (reset)
count_out <= 8'b1111_1111;
else if (enable && count_out == 8'b0000_0000)
count_out <= 8'b1111_1111;
else if (enable && count_out != 8'b0000_0000)
count_out <= count_out - 8'b0000_0001;
else
count_out <= count_out;
end
end
endmodule
Ошибки компиляции нет. 8 светодиодов (подключенных к count_out) выключены и включаются, когда я нажимаю кнопку для сброса. Я также попытался изменить какое-то значение, например, направление вверх_вниз, просто чтобы проверить, не является ли это ошибкой кнопки, но получилось наоборот, что указывает на ошибку в моей программе (наверное?)
Отредактировано: Используя .bdf в Quartus, здесь показано подключение бортовых часов к pll-блоку, а затем к модулям:





из личного опыта: каждый раз, когда я пытаюсь пропустить часть testbench/sim, я дорого плачу. Просто так случилось на прошлой неделе.
В любом случае, даже 50/16 = 3,125 МГц все равно довольно быстро. Если у вас есть 8-битный счетчик, это даст 50 МГц/16/256 ≈ 12 кГц для самого медленного бита, если я не ошибаюсь. По крайней мере, мое зрение ограничено в лучшем случае несколькими изменениями Гц. Кстати, ваши полученные часы будут сильно несбалансированными (время включения-выключения от 20 до 300 нс), что часто нежелательно.
TL;DR: проверьте полученные частоты. Скорее всего, вам придется разделить часы еще дальше, чтобы увидеть изменения. Прямо сейчас текущие частоты обновления приведут только к затемнению светодиодов.
Обновлено:
здесь зашифрованный сим и результат - светодиоды должны переключаться, но слишком быстро, чтобы увидеть это, за исключением эффекта затемнения.
`timescale 1 ns / 1 ns
// Define Module for Test Fixture
module main_tf();
reg clock_in;
reg nrst;
wire clock_en;
// Instantiate the UUT - normally the main
updown_counter updown_counter_inst0(
.reset(~nrst),
.clk(clock_in),
.up_down(1'b1),
.enable(clock_en)
);
enableCounter enableCounter_inst1(
.reset(~nrst),
.clock_5(clock_in),
.enable_out(clock_en)
);
// Initialize Inputs
initial begin
clock_in = 0;
nrst = 1;
#5 nrst = 0;
#20 nrst = 1;
end
always begin
#20 clock_in = ~clock_in; //magic happens here
end
endmodule // main_tf
Эй, спасибо! Я попробовал, как вы сказали, и получил гораздо лучший результат после деления частоты на 5e6, поэтому я получил 1 цикл / с с блоком PLL 50 МГц. Я также только учусь писать свои собственные тестовые стенды. Я сделал такой же, как ваш, и включил файлы в top_module точно так же, как вы определили его в своем тестовом стенде. Еще раз спасибо :)
@Mikef Я сделал это, используя файл .bdf в Quartus. Я отредактировал свой вопрос, если вы хотите взглянуть на это