我试图制作能够从0:00.0到9:99.9以秒(1/10)精度计数的秒表。
我的秒表的工作原理是为每个数字提供自己的二进制计数器(由Vivado的IP目录提供),该计数器可用于时钟和启用信号。当一个特定的数字重置为零时(例如从9转换为0),它会向下一个数字发送一个脉冲,告诉它数一个。
我为每个数字提供了自己的模块,并通过顶层模块将端口相互连接。
问题是deci-seconds点完美计数,但下面的数字保持为零。在模拟设计之后,我发现第一个数字发送的信号没有被下一个数字接收。
我已经检查了我的模块实例化sytax和端口连接,但没有看到错误。我甚至将第一个数字的输出脉冲映射到某些LED上,它们点亮得非常好。所以我假设错误在第二个数字的接收端。我不知道为什么会这样。
DIGIT 1 MODULE:
// 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
DIGIT 2 MODULE:
// 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:
// 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.
答案 0 :(得分:0)
首先,由于计数器是由posedge触发的,因此你需要在预期的上升沿周围从negedge到negedge激活你的使能信号,以避免潜在的时序违规。 (见下面的评论)
其次,为了确保你的计数器“勾选”同步,你需要对齐这些使能 - 这就是:
if (Q_1 == 9 && Q_1_Enable)
Q_2_Enable = 1;
else
Q_2_Enable = 0;
这样,计数器2在相同的周期计数器上递增,从9-> 0转换。
最后,除非你的10Hz时钟占空比为10%,否则你的“deci-second”计数器实际上会加速5次/秒,而不是1次/秒。无论如何,如果你必须选择 - 对所有计数器只使用10Hz时钟,那么你的使能信号就会变得简单。
/* always @ (negedge clk_10_Hz) *No need for edge-triggered* */
always @ (*)
begin
// Q_1_Enable is always 1(true) if using a 10 Hz clock
if (Q_1 == 9)
Q_2_Enable = 1;
else
Q_2_Enable = 0;
if (Q_2 == 9 && Q_2_Enable)
Q_3_Enable = 1;
else
Q_3_Enable = 0;
if (Q_3 == 9 && Q_3_Enable)
...