BCD и 7-сегментный декодер показывают странный результат

Я пытаюсь создать соединение от BCD к 7-сегментному декодеру.
Когда я нажимаю кнопку 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

Изображение моделирования:
Результат изображения моделирования — нажмите здесь

Есть предложения?


person user3110542    schedule 18.12.2013    source источник
comment
Почему ты заворачиваешь if (BCD1 == 4'b1001) внутрь if (BCD0 == 4'b1001) ??   -  person benathon    schedule 18.12.2013
comment
@portforwardpodcast, потому что ограничение составляет 99, что будет использовать два 7-сегментных дисплея для A и два 7-сегментных дисплея для B   -  person user3110542    schedule 18.12.2013
comment
Решение состоит в том, чтобы смотреть на сигналы внутри ваших модулей и отлаживать свой код. Отладка кода путем проверки ни к чему не приведет, и ваша симуляция рассматривает только сигналы верхнего уровня. Кстати, где твой timespec? Похоже, что ваши единицы времени - пикосекунды, а не наносекунды.   -  person    schedule 18.12.2013
comment
@JoeHass, я уже пытаюсь изменить тестовый стенд, но ничего не работает. Я уже установил временную характеристику на 1 нс/1 нс, но ничего не происходит. не могли бы вы дать еще какую-нибудь подсказку...   -  person user3110542    schedule 18.12.2013


Ответы (3)


Общая процедура отладки начального уровня

  1. Всегда запускайте код в моделировании перед его загрузкой в ​​ПЛИС.
  2. Determiner which module has a bug(s):
    1. Make sure the stimulus for the module matches your intentions.
    2. Убедитесь, что вывод модуля имеет смысл для его ввода.
  3. Step through line-by-line:
    1. Make sure each branch is reachable and executing as intended.
    2. Сбросить все в области отладки в сигнал.
    3. Добавьте отладочные сообщения, используя $display.
    4. Добавьте в дизайн небольшие задержки, такие как #0.1. Это может потребовать изменения точности шкалы времени.
  4. After the potential bug is found:
    1. Correct it and add a note on the same line with a searchable keyword (ex: //FIXED). Run simulation to validate the fix.
    2. Если ошибка кажется исправленной. Закомментируйте (не удалите) отладочные сообщения и введенные задержки. Запустите симуляцию снова.
  5. Повторяйте шаг 4, пока все ошибки не будут устранены.
  6. Теперь безопасно удалять закомментированные сообщения и задержки.
  7. ЗАПУСТИ СИМУЛЯЦИЮ СНОВА!

Намекать:

Есть одна конструктивная ошибка и одна потенциальная проблема с тестовым стендом.

person Greg    schedule 18.12.2013
comment
@ Грег, я уже исправил ошибку дизайна. Но не могу найти проблему с тестовым стендом. Я пытаюсь изменить временную шкалу, но ничего не работает. Я совершенно новичок в этом деле. какую проблему с тестовым стендом вы имели в виду? - person user3110542; 19.12.2013
comment
@ Грег, есть еще подсказка? - person user3110542; 19.12.2013
comment
@ user3110542, вы можете получить еще одну подсказку после того, как покажете, что вы пробовали. В чем была ошибка в дизайне? Куда вы поместили $display сообщений. Сообщение имеет смысл? - person Greg; 19.12.2013

Используемый вами стимул не соответствует тому, как вы разработали свой модуль для работы. Проблема в вашем тестовом стенде. Так как это домашнее задание, я позволю вам взять его оттуда.

РЕДАКТИРОВАТЬ: Я собираюсь предположить, что крайний срок выполнения домашнего задания прошел. В интересах будущих читателей обратите внимание, что модуль Verilog использует сигнал Clear с активным низким уровнем, который сбрасывает все, когда он находится на логическом уровне 0. Тестовый стенд неправильно предполагает активный высокий сигнал Reset, поэтому Reset (и, следовательно, Clear) удерживается на низком уровне почти на протяжении всего тестового стенда. Модуль Verilog не может сделать ничего полезного... он постоянно очищается.

person Community    schedule 18.12.2013
comment
Я уже пытаюсь изменить тестовый стенд, но ничего не работает. Я уже установил временную характеристику на 1 нс/1 нс, но ничего не происходит. не могли бы вы дать еще какую-нибудь подсказку... - person user3110542; 18.12.2013
comment
есть еще предложения? - person user3110542; 19.12.2013

На самом деле я уже реализовал такое соединение, вы могли видеть это в моем проекте github: https://github.com/MossbauerLab/RomChipReader Работает не только в симуляции, но и в железе (я снял короткое видео с демонстрацией). Вы можете увидеть мою реализацию вывода на 7 сегментов в https://github.com/MossbauerLab/RomChipReader/blob/master/RomReader/src/address_display.v не забудьте также посмотреть тестбенчи и важно использовать debouncer (https://github.com/MossbauerLab/RomChipReader/blob/master/RomReader/src/debouncer.v), если вы планируете менять коды кнопок.

person Michael Ushakov    schedule 20.08.2020