2014-11-07 3 views
1

Я действительно новичок в мире verilog, и я не могу понять, почему моя программа ничего не возвращает. Я пытаюсь сделать простой 6-битный счетчик, который рассчитывает на нажатие кнопки. Код6-битный двоичный счетчик со светодиодным выходом

module top (CLK, BTN_RST, LED, BTN_C); 
    input CLK, BTN_RST, BTN_C; // 
    output [5:0]LED; 
    reg [5:0]LED; 
    always @(posedge CLK or posedge BTN_RST) begin 
     if (BTN_RST) begin 
       LED <= 6'b000000; 
      end 
     else begin: COUNT   
       while (BTN_C) begin 
        LED <= LED + 1'b1; 
        disable COUNT; 
       end 
      end 
    end 
endmodule 

И испытательный стенд является

module top_test; 
    reg CLK; 
    reg BTN_RST; 
    reg BTN_C; 
    reg [5:0]LED; 

    initial begin 
     CLK = 0; 
     BTN_RST = 0; 
     BTN_C = 0; 
     #1 BTN_RST = 1; 
     #5 BTN_RST = 0; 
     #10 BTN_C = 1; 
     #50; 
    end 

    always 
    begin 
    #5 CLK=~CLK; 
    end 

Этот код компилируется и работает (как я могу видеть на Isim), но светодиодный выход дает мне XXXXXX. Я думаю, что здесь есть не только некоторые ошибки, но и не могу понять, как работает тестовый стенд, и как правильно назначать входные и выходные данные. Кто-нибудь может мне помочь, пожалуйста!

+0

Добавить описание светодиодного выхода, который вы ожидаете увидеть. – toolic

ответ

3

Вам необходимо добавить экземпляр вашего дизайна в тестовый стенд. Теперь светодиод больше не X; Я вижу, что подсчитывая от 0.

module top_test; 
    reg CLK; 
    reg BTN_RST; 
    reg BTN_C; 
    wire [5:0]LED; 

    initial begin 
     CLK = 0; 
     BTN_RST = 0; 
     BTN_C = 0; 
     #1 BTN_RST = 1; 
     #5 BTN_RST = 0; 
     #10 BTN_C = 1; 
     #50; 
    end 

    always 
    begin 
    #5 CLK=~CLK; 
    end 

top dut (
     // Inputs: 
    .BTN_C (BTN_C), 
    .BTN_RST (BTN_RST), 
    .CLK  (CLK), 
     // Outputs: 
    .LED  (LED) 
); 

endmodule 

UPDATE: Я изменил рег проволоки для LED в top_test. Я вижу, что светодиод увеличивается с 0, когда я использую VCS в качестве симулятора. Но, когда я переключаюсь на Incisive, светодиод остается на 0.

Я думаю, что ваш код while/disable вызывает проблему. Я перекодировал его, чтобы выглядеть немного более стандартным:

module top (CLK, BTN_RST, LED, BTN_C); 
    input CLK, BTN_RST, BTN_C; // 
    output [5:0]LED; 
    reg [5:0]LED; 
    always @(posedge CLK or posedge BTN_RST) begin 
     if (BTN_RST) begin 
      LED <= 6'b000000; 
     end else if (BTN_C) begin   
      LED <= LED + 1'b1; 
     end 
    end 
endmodule 
+0

просто скопировал этот код - все еще вижу только X в выводе. И что означает «верхняя точка»? – bigbobr

+0

'top' - это имя вашего модуля дизайна, а' dut' - это имя экземпляра, который я составил. Это означает «Design Under Test», который является общим названием. Ознакомьтесь с примерами в IEEE Std 1800-2012, раздел «23. Модули и иерархия». – toolic

+0

ОК, по какой-то причине я назвал 'uut-top', изменил' dut' за 'uut' - все равно никаких изменений – bigbobr

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