Verilog: неуказанный стандарт ввода-вывода и неправильное размещение для маршрутизации между выводом ввода-вывода и ошибками BUFG.

Я новичок в разработке Verilog и FPGA. В настоящее время я работаю над проектом по управлению двумя двигателями с помощью платы Basys 3 и Н-моста.

Модуль в настоящее время создан для использования ШИМ для управления скоростью двигателя, отправляя выходные данные на контакты ena и enb на H-мосте. Входы H в настоящее время являются постоянными для тестирования ШИМ-управления.

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

Вот мой основной модуль:

module RDrive(
    input clock,
    input BUTTON,
    input H1, H2, H3, H4,
    output ena, enb
    );

    wire clock, BUTTON, H1, H2, H3, H4;

    reg[1:0] speed;
    reg[3:0] counter, width;
    reg PWMtemp;

    wire ena, enb;

    // initial values
    initial begin
        counter <= 4'b0000;
        speed = 0;
        PWMtemp <= 0;
        width <= 0;
    end

    // Every button press increments speed value
    always @ (posedge BUTTON)
    begin
        speed <= speed + 1;
        // width adjusted for PWM module
        case (speed)
            2'b00 : width <= 4'b0000;
            2'b01 : width <= 4'b0101;
            2'b10 : width <= 4'b1010;
            2'b11 : width <= 4'b1111;
            default : width <= 4'b0000;
        endcase
    end

    // PWM
    always @ (posedge clock)
    begin
        if (counter < width) PWMtemp <= 1;
        else PWMtemp <= 0;
        counter <= counter + 1;
    end

    assign ena = PWMtemp;
    assign enb = PWMtemp;

endmodule

Вот мой тестовый стенд:

module RDrive_TB(

    );
    reg clock;
    wire ena = 0;
    wire enb = 0;
    reg BUTTON, H1, H2, H3, H4;

    initial begin
        BUTTON = 0;
        clock = 0;
        // H values for testing PWM speed control
        H1 = 1;
        H2 = 0;
        H3 = 1;
        H4 = 0;

        // Simulating button presses
        #1000;
        BUTTON = 1;
        #10;
        BUTTON = 0;

        #1000;
        BUTTON = 1;
        #10;
        BUTTON = 0;

        #1000;
        BUTTON = 1;
        #10;
        BUTTON = 0;

        #1000;
        BUTTON = 1;
        #10;
        BUTTON = 0;

    end

    // clock generator
    always begin
        #1 clock = ~clock;
    end

    RDrive RDriveTest(clock, BUTTON, H1, H2, H3, H4, ena, enb);


endmodule

и вот мои ограничения:

set_property PACKAGE_PIN W5 [get_ports CLK100MH]
set_property IOSTANDARD LVCMOS33 [get_ports CLK100MH]
create_clock -add -name sys_clk_pin -period 10.00 -waveform {0 5} [get_ports 
CLK100MH]

set_property PACKAGE_PIN U18 [get_ports BUTTON]
set_property IOSTANDARD LVCMOS33 [get_ports BUTTON]

##Sch name = JA8
set_property PACKAGE_PIN K2 [get_ports {enb}]
set_property IOSTANDARD LVCMOS33 [get_ports {enb}]

Первая ошибка (произошедшая во время реализации), которую я получил, была такой:

ОШИБКА: [Место 30-574] Плохое расположение для маршрутизации между выводом IO и BUFG.

Я провел некоторое исследование, и я думаю, что проблема была в том, что всегда @ (posege BUTTON) не было точно по времени с часами. Поэтому я добавил эту строку в ограничения, чтобы игнорировать ошибку:

set_property CLOCK_DEDICATED_ROUTE FALSE [get_nets BUTTON_IBUF]

Это позволило мне успешно запустить реализацию. Однако при попытке сгенерировать битовый поток я столкнулся со следующей ошибкой:

ОШИБКА: [DRC NSTD-1] Неопределенный стандарт ввода-вывода: 1 из 4 логических портов используют значение стандарта ввода-вывода (IOSTANDARD) «ПО УМОЛЧАНИЮ» вместо определенного пользователем значения.

Насколько я понимаю, эта ошибка возникает, когда входам/выходам не присвоено начальное значение, поэтому они принимают любое значение «ПО УМОЛЧАНИЮ». Я возился с начальными значениями и типами значений каждого из «проблемных контактов», которые были перечислены. Мне удалось исправить большинство из них, но в настоящее время «часы» — единственный оставшийся проблемный контакт. Я уже некоторое время пытаюсь починить часы, но безуспешно.

Некоторая помощь будет принята с благодарностью, спасибо!


person Dylan Scott    schedule 09.10.2018    source источник


Ответы (1)


1/Вы не должны использовать @ (posedge BUTTON) по двум причинам:

  • Вы не устранили дребезг кнопки, поэтому одно нажатие может вызвать несколько приращений скорости.

  • В таком простом дизайне все должно работать от одних часов.

Вы должны синхронизировать ввод вашей кнопки с часами, а затем добавить счетчик + логику, чтобы проверить, стабилен ли сигнал (отскок прекратился).

2/Сообщение об ошибке очень ясное и конкретное:

Неопределенный стандарт ввода/вывода: 1 из 4 логических портов....

Все, что я сделал, это проверил все ваши порты ввода-вывода и проверил ваши ограничения по контактам. Я не вижу ограничений для сигнала ena.

person Oldfart    schedule 09.10.2018
comment
Спасибо! Я рассмотрю возможность устранения дребезга кнопки, чтобы решить эту проблему. Ограничение эны существует; Я просто забыл скопировать его по ошибке. Появляется ошибка, говорящая о том, что стандарт Unspecified I/O исходит от часов. Часы — мое самое первое ограничение. Я не уверен, как это исправить. - person Dylan Scott; 10.10.2018
comment
Обновление: похоже, я просто забыл изменить имя своих часов в своих ограничениях. Проблема исправлена! - person Dylan Scott; 10.10.2018