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

时间:2013-12-18 04:33:22

标签: verilog xilinx system-verilog bcd

我正在尝试创建从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

有任何建议吗?

3 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

常规入门级调试过程

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

      

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

答案 2 :(得分:0)

实际上我已经实现了这种连接,您可以在我的github项目中看到它:https://github.com/MossbauerLab/RomChipReader它不仅适用于仿真,而且适用于硬件(我通过演示制作了简短的视频)。您可以在https://github.com/MossbauerLab/RomChipReader/blob/master/RomReader/src/address_display.v中看到我的输出为7段的印象 不要忘记也看到测试平台,如果您打算从按钮更改代码,请使用去抖动器(https://github.com/MossbauerLab/RomChipReader/blob/master/RomReader/src/debouncer.v)。