2013-12-18 2 views
0

Я пытаюсь создать соединение с BCD с 7-сегментным декодером.
Когда я нажимаю кнопку UP_ * или DOWN_ *, он должен подсчитывать или подсчитывать. Но моя симуляция отображает 0000001, даже когда я нажимаю кнопку UP или DOWN.BCD и 7сегментный декодер показывают странный результат

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 

Sim авляет картина:
Simulation Picture Result-Click Here

Любые предложения?

+0

Почему вы обертываете 'if (BCD1 == 4'b1001)' inside 'if (BCD0 == 4'b1001)' ?? – portforwardpodcast

+0

@portforwardpodcast, потому что предел равен 99. Он будет использовать два 7-сегментных дисплея для A и двух 7-сегментных дисплеев для B – user3110542

+0

Решение состоит в том, чтобы смотреть сигналы внутри ваших модулей и отлаживать ваш код. Отладка кода путем проверки не приведет вас никуда, и ваша симуляция только смотрит на сигналы верхнего уровня. Где, кстати, ваш «размах»? Похоже, что ваши единицы времени представляют собой пикосекунды вместо наносекунд. –

ответ

0

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

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

+0

Я уже пытаюсь изменить testbench, но никто не работает. Я уже установил timepec в 1ns/1ns, но ничего не произошло. не могли бы вы дать еще несколько подсказок ... – user3110542

+0

больше предложений? – user3110542

0

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

  1. Всегда запускать код моделирования перед загрузкой его на FPGA.
  2. Определитель, у которого есть ошибка (-а):
    1. Убедитесь, что стимул для модуля соответствует вашим намерениям.
    2. Убедитесь, что выход для модуля имеет смысл для его ввода.
  3. Шаг через линию за линией:
    1. Убедитесь, что каждая ветвь является достижимым и выполнения, как предполагалось.
    2. Сбросьте все в области отладки в форму волны.
    3. Добавить отладочные сообщения, используя $display.
    4. Добавить небольшие задержки, такие как #0.1 в дизайн. Это может потребовать изменения временной шкалы временного масштаба.
  4. После потенциал ошибка найдена:
    1. Правильно это и добавить примечание на той же линии, с возможностью поиска ключевых слов (например: //FIXED). Запустите симуляцию для проверки исправления.
    2. Если ошибка решена. Комментировать (не удалять) отладочные сообщения и вводить задержки. Запустите симуляцию снова.
  5. Повторите шаг 4 до тех пор, пока все ошибки не будут устранены.
  6. Теперь можно безопасно удалить прокомментированные сообщения и задержки.
  7. СНОВА МОДЕЛИРОВАНИЯ СНОВА!

Подсказка:

Существует один дизайн ошибки и один потенциальный вопрос испытательного стенда.

+0

Хорошо сыграл, сэр. –

+0

@Greg, я уже исправляю ошибку дизайна. Но не может найти проблему testbench. Я пытаюсь изменить timepec, но никто не работает. Я совершенно новый об этом. что вы имели в виду? – user3110542

+0

@Greg, больше намек? – user3110542

Смежные вопросы