NEXYS 4:信号在端口实例化中跨线消失

NEXYS 4: Signal Disappearing Across Wire in Port Instantiation

我正在尝试制作一个秒表,它能够以 (1/10) 秒的精度从 0:00.0 计数到 9:99.9。

我的秒表通过为每个数字提供自己的二进制计数器(由 Vivado 的 IP 目录提供)来工作,该计数器在时钟和启用信号上工作。当一个特定的数字重置为零时(例如从 9 转换为 0),它会向下一个数字发送一个脉冲,告诉它加一。

我给每个数字分配了自己的模块,并通过顶部模块将端口相互连接。

问题是小数秒点计数正确,但后面的数字仍为零。模拟设计后,我发现第一个数字发送的信号没有被下一个数字接收到。

我检查了我的模块实例化语法和端口连接,没有发现错误。我什至将第一个数字的输出脉冲映射到一些 LED 上,它们点亮得非常好。所以我假设错误是在第二个数字的接收端。但是我不确定为什么会这样。

数字 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。

首先,由于计数器是 posedge 触发的,您将希望您的使能信号在预期的上升沿周围从 negedge 到 negedge 处于活动状态,以避免潜在的时序违规。 查看下面的评论

其次,为了确保您的计数器 "tick-up" 同步,您需要对齐使能 - 类似于 :

if (Q_1 == 9 && Q_1_Enable)
  Q_2_Enable = 1;
else
  Q_2_Enable = 0;

这样,计数器 2 在同一个循环计数器 1 从 9->0 转变时递增。

最后,除非您的 10Hz 时钟占空比为 10%,否则您的 "deci-second" 计数器实际上会增加 5 times/second,而不是 1 time/demisecond。无论如何,在所有计数器中仅使用 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)
    ...