Verilog BCD和7段解码器显示奇怪的结果

Verilog BCD和7段解码器显示奇怪的结果,verilog,xilinx,system-verilog,bcd,Verilog,Xilinx,System Verilog,Bcd,我正在尝试创建从BCD到7段解码器的连接。当我按下向上或向下按钮时,它应该向上或向下计数。但我的模拟只显示0000001,即使我按下按钮向上或向下 BCD模块代码: 我的测试台: 模拟图片: 有什么建议吗?您使用的刺激与您设计模块的工作方式不一致。问题出在你的测试台上。既然这是家庭作业,我就让你从那里开始做 编辑:我假设作业期限已经过了。为了方便将来的读者,请注意,Verilog模块使用一个有效的低清晰信号,当其处于逻辑0时,该信号将重置所有内容。测试台错误地假设一个激活的高复位信号,因此几乎

我正在尝试创建从BCD到7段解码器的连接。当我按下向上或向下按钮时,它应该向上或向下计数。但我的模拟只显示0000001,即使我按下按钮向上或向下

BCD模块代码:

我的测试台:

模拟图片:


有什么建议吗?

您使用的刺激与您设计模块的工作方式不一致。问题出在你的测试台上。既然这是家庭作业,我就让你从那里开始做

编辑:我假设作业期限已经过了。为了方便将来的读者,请注意,Verilog模块使用一个有效的低清晰信号,当其处于逻辑0时,该信号将重置所有内容。测试台错误地假设一个激活的高复位信号,因此几乎整个测试台的复位和清除都保持在低状态。Verilog模块无法做任何有用的事情……它正在被不断清除。

常规入门级调试过程 在将代码加载到FPGA之前,始终在模拟中运行代码。 确定哪个模块存在错误: 确保模块的刺激符合您的意图。 确保模块的输出对其输入有意义。 逐行进行: 确保每个分支都可以访问并按预期执行。 将调试范围内的所有内容转储到波形中。 使用$display添加调试消息。 在设计中添加诸如0.1之类的小延迟。这可能需要更改时间刻度的时间精度。 发现潜在错误后: 更正它,并在同一行添加注释,其中包含可搜索关键字ex://FIXED。运行模拟以验证修复。 如果该错误似乎已解决。注释掉不删除调试消息和注入延迟。再次运行模拟。 重复步骤4,直到解决所有错误。 现在可以安全地删除注释掉的消息和延迟。 再次运行模拟! 提示:

存在一个设计缺陷和一个潜在的测试台问题


事实上,我已经实现了这样的连接,你们可以在我的github项目中看到:它不仅可以在模拟中工作,而且可以在硬件中工作,我用demo制作了一段短视频。您可以在中看到我将输出导入7段
不要忘记查看测试台,如果您计划更改按钮的代码,使用debouncer也很重要。

如果BCD1==4'b1001,为什么要将BCD0==4'b1001包装在内部如果BCD0==4'b1001???@portforwardpodcast,因为限制是99。它将使用两个7段显示器来显示A和两个7段显示器来显示B。解决方案是查看模块内的信号并调试代码。通过检查对代码进行调试并不能使您取得任何进展,您的模拟只是查看顶级信号。顺便问一下,你的时间表在哪里?看起来你的时间单位是皮秒而不是纳秒。@JoeHass,我已经尝试过修改测试台,但是没有一个有效。我已经将timespec设置为1ns/1ns,但也没有发生任何事情。你能不能给我一些线索…我已经尝试过修改测试台,但是没有一个有效。我已经将timespec设置为1ns/1ns,但也没有发生任何事情。请你再给我一些线索……还有什么建议吗?@Greg,我已经在修复设计缺陷了。但是找不到测试台问题。我正在尝试更改timespec,但没有一个有效。我对这东西完全陌生。你指的是什么样的测试台问题?@Greg,还有什么提示吗?@user3110542,在你展示了你的尝试之后,你可以得到另一个提示。设计中的错误是什么?您将$display消息放置在何处。这个信息有意义吗?
module BCDcountmod(
  input Clock, Clear, up, down,
  output reg [3:0] BCD1, 
  output reg [3:0] BCD0);
//reg [3:0] BCD1_1, BCD0_0;

  always @(posedge Clock or negedge Clear) begin
    //---- IS IT CLEAR? --------------
    if (~Clear) begin
      BCD1 <= 'b0;
      BCD0 <= 'b0;
    end
    //---- IS IT UP? --------------
    else if (up == 1'b1)  begin
      if (BCD0 == 4'b1001) begin
        BCD0 <= 0;
        if (BCD1 == 4'b1001)
          BCD1 <= 0;
        else
          BCD1 <= BCD1 + 1;
      end
    end
    //---- IS IT DOWN? --------------
    else if (down==1'b1) begin
      if (BCD0 == 4'b0000) begin
        BCD0 <= 4'b1001;
        if (BCD1 == 4'b0000)
          BCD1 <= 4'b1001;
        else
          BCD1 <= BCD1 - 1;
      end
      else
        BCD0 <= BCD0 - 1;
    end
  end

endmodule
module segment7dec (output reg [6:0] display, input [3:0] bcd);
always @* begin
  case(bcd)
  4'b0000: display = 7'b1111110;
  4'b0001: display = 7'b0110000;
  4'b0010: display = 7'b1101101;
  4'b0011: display = 7'b1111001;
  4'b0100: display = 7'b0110011;
  4'b0101: display = 7'b1011011;
  4'b0110: display = 7'b1011111;
  4'b0111: display = 7'b1110000;
  4'b1000: display = 7'b1111111;
  4'b1001: display = 7'b1111011;
  default: display = 7'b0000000; 
  endcase
  display = ~display; 
end
endmodule
module scoreboard_testbench;

    // Inputs
    reg UP_A;
    reg DOWN_A;
    reg UP_B;
    reg DOWN_B;
    reg Reset;
    reg CLK;

    // Outputs
    wire [6:0] disp1A;
    wire [6:0] disp0A;
    wire [6:0] disp1B;
    wire [6:0] disp0B;

    // Instantiate the Unit Under Test (UUT)
    socreboard_top uut (
        .UP_A(UP_A), 
        .DOWN_A(DOWN_A), 
        .UP_B(UP_B), 
        .DOWN_B(DOWN_B), 
        .Reset(Reset), 
        .CLK(CLK), 
        .disp1A(disp1A), 
        .disp0A(disp0A), 
        .disp1B(disp1B), 
        .disp0B(disp0B)
    );

    initial begin
        // Initialize Inputs
        UP_A = 0;
        DOWN_A = 0;
        UP_B = 0;
        DOWN_B = 0;
        Reset = 1;
        CLK = 0;

        // Wait 100 ns for global reset to finish
        #100;
         Reset = 0;
         UP_A = 1'b1;
        #500
         UP_A='b0;
        #500
         UP_A=1'b1;
        #500
         DOWN_A=1'b1;

        #4000 $finish;
        // Add stimulus here


    end
     always #5 CLK=!CLK;
endmodule