Я пытаюсь сделать секундомер, который может считать от 0:00,0 до 9:99,9 с точностью (1/10) секунды.
Мой секундомер работает, присваивая каждой цифре собственный двоичный счетчик (предоставленный IP-каталогом Vivado), который работает с часами и включает сигнал. Когда конкретная цифра сбрасывается обратно на ноль (например, при переходе от 9 к 0), она посылает импульс следующей цифре, сообщая ей, что нужно считать на единицу.
Я выделил каждой цифре свой модуль и соединил порты друг с другом через верхний модуль.
Проблема в том, что децисекунды считаются идеально, но следующая цифра остается нулем. После моделирования конструкции я обнаружил, что сигнал, посылаемый первой цифрой, не принимается следующей цифрой.
Я проверил синтаксис экземпляров моего модуля и соединения портов и не увидел ошибки. Я даже сопоставил выходной импульс первой цифры с некоторыми светодиодами, и они загорелись отлично. Поэтому я предполагаю, что ошибка связана с получением второй цифры. Однако я не уверен, почему это происходит.
ЦИФРА 1 МОДУЛЬ:
// module that contains both digit 1 counter and decimal converter
module digit_1(
input clk_10_Hz, clk_100_Hz, reset,
output [7:0] digit_1_out,
output [3:0] Q_1
);
c_counter_binary_9_count COUNTER_9 (.CLK(clk_100_Hz),.CE(clk_10_Hz),.SCLR(reset),.Q(Q_1));
digit_1_bcd_to_decimal CONVERTER_DIGIT_1 (.Q_1,.clk_100_Hz,.digit_1_out);
endmodule
ЦИФРОВОЙ 2 МОДУЛЬ:
// module that contains both digit 2 counter and decimal converter
module digit_2(
input clk_100_Hz, reset,
input [3:0] Q_1,
output [7:0] digit_2_out,
output [3:0] Q_2
);
reg THRESH1;
reg test_CE_2;
c_counter_binary_9_count COUNTER_9 (.CLK(clk_100_Hz),.CE(test_CE_2),.SCLR(reset),.Q(Q_2));
digit_2_bcd_to_decimal CONVERTER_DIGIT_2 (.Q_2,.clk_100_Hz,.digit_2_out);
// ensures that clock pulse will only be length of 100 Hz clock pulse
always @ (negedge clk_100_Hz)
if (Q_1 == 4'h9)
THRESH1 = 1;
else
THRESH1 = 0;
always @ (posedge clk_100_Hz)
if (THRESH1)
begin
if (Q_1 == 4'h0)
test_CE_2 = 1;
else
test_CE_2 = 0;
end
else
test_CE_2 = 0;
endmodule
ВЕРХНИЙ МОДУЛЬ:
// TOP module - combines all the other modules with each other
module stop_watch(
input clk_100_MHz, reset, enable,
output [7:0] an, display
);
wire clk_10_Hz, clk_100_Hz, clk_250_Hz;
wire [7:0] digit_1_out ,digit_2_out,digit_3_out,digit_4_out; // connects digit outputs with display selector
wire [3:0] Q_1, Q_2, Q_3; // connects outpus of binary counter with inputs of others
clock CLOCK (.clk_100_MHz,.enable,.clk_10_Hz,.clk_100_Hz,.clk_250_Hz);
digit_1 DIGIT_1 (.clk_10_Hz,.clk_100_Hz,.reset,.Q_1,.digit_1_out);
digit_2 DIGIT_2 (.clk_100_Hz,.reset,.Q_1,.Q_2,.digit_2_out);
digit_3 DIGIT_3 (.clk_100_Hz,.reset,.Q_2,.Q_3,.digit_3_out);
digit_4 DIGIT_4 (.clk_100_Hz,.reset,.Q_3,.digit_4_out);
anode_frequency ANODE_FREQUENCY (.clk_250_Hz,.an);
display_selector DISPLAY_SELECTOR (.an,.digit_1_out,.digit_2_out,.digit_3_out,.digit_4_out,.display);
endmodule
Весь код составляет около 400 строк, поэтому я поместил только те части, которые представляют интерес, но я мог бы поместить весь код, если потребуется.
Я использую Vivado 2014.1, а плата FPGA — NEXYS 4.