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

问题描述 投票:0回答:2

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

BCD模块代码:

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

7段模块:

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

仿真图片: Simulation Picture Result-Click Here

有什么建议?

verilog xilinx system-verilog bcd
2个回答
0
投票

General entry level debugging procedure

  1. 在将模板加载到FPGA之前,始终在模拟中运行代码。
  2. 确定哪个模块有错误: 确保模块的刺激符合您的意图。 确保模块的输出对其输入有意义。
  3. 逐行逐步: 确保每个分支都可以访问并按预期执行。 将调试范围内的所有内容转储为波形。 使用$display添加调试消息。 在设计中添加#0.1等小延迟。这可能需要改变时标的时间精度。
  4. 发现潜在错误后: 纠正它并使用可搜索的关键字在同一行添加注释(例如://FIXED)。运行模拟以验证修复。 如果错误似乎已解决。注释掉(不删除)调试消息和注入的延迟。再次运行模拟。
  5. 重复步骤4,直到所有错误都得到解决。
  6. 现在可以安全地删除已注释掉的消息和延迟。
  7. 再次运行模拟!

暗示:

有一个设计错误和一个潜在的测试平台问题。


0
投票

您使用的刺激与您设计模块的工作方式不一致。问题出在你的测试平台上。既然这是作业,我会让你从那里拿走它。

编辑:我将假设作业截止日期已过。为了未来读者的利益,请注意Verilog模块使用低电平有效Clear信号,当信号处于逻辑0时,它会重置所有信号。测试台错误地假设一个高有效的Reset信号,因此Reset(以及因此Clear)几乎在整个测试平台上保持低位。 Verilog模块无法做任何有用的事情......它会被不断清除。

© www.soinside.com 2019 - 2024. All rights reserved.