0

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

仿真图片:
仿真图片结果-点击这里

有什么建议么?

4

3 回答 3

0

一般入门级调试程序

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

暗示:

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

于 2013-12-18T20:18:57.763 回答
0

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

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

于 2013-12-18T12:16:55.873 回答
0

实际上我已经实现了这样的连接,你可以在我的 github 项目中看到它:https ://github.com/MossbauerLab/RomChipReader它不仅适用于模拟,而且适用于硬件(我制作了带有演示的短视频)。您可以在https://github.com/MossbauerLab/RomChipReader/blob/master/RomReader/src/address_display.v中看到我对 7-seg 的输出的 impl 也不要忘记查看测试台,使用 debouncer 很重要( https://github.com/MossbauerLab/RomChipReader/blob/master/RomReader/src/debouncer.v ) 如果您打算从按钮更改代码。

于 2020-08-20T18:11:13.963 回答