首页 > 解决方案 > Verilog:“未指定的 I/O 标准”和“IO 引脚和 BUFG 之间的布线位置不佳”错误

问题描述

我对 Verilog 和 FPGA 开发相当陌生。我目前正在研究一个使用 Basys 3 板和 H 桥控制两个电机的项目。

该模块当前构建为使用 PWM 控制电机速度,将输出发送到 H 桥上的 ena 和 enb 引脚。为了测试 PWM 控制,H 输入当前是恒定的。

长话短说,我遇到了各种 I/O 错误,我无法完全理解这些错误。

这是我的主要模块:

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}]

我得到的第一个错误(在实施过程中发生)是这样的:

错误:[Place 30-574] IO 引脚和 BUFG 之间的布线位置不佳。

我做了一些研究,我认为问题是由于总是@(posedge BUTTON)没有与时钟完全同步。所以我将此行添加到约束以忽略错误:

set_property CLOCK_DEDICATED_ROUTE FALSE [get_nets BUTTON_IBUF]

这使我能够成功运行实施。但是,我在尝试生成比特流时遇到了以下错误:

错误:[DRC NSTD-1] 未指定的 I/O 标准:4 个逻辑端口中有 1 个使用 I/O 标准 (IOSTANDARD) 值“DEFAULT”,而不是用户分配的特定值。

据我了解,当输入/输出未分配初始值时会发生此错误,因此它们假定“默认”值是什么。我摆弄了列出的每个“问题引脚”的初始值和值类型。我能够修复其中的大部分,但目前“时钟”是唯一剩下的问题引脚。我一直在尝试修复时钟一段时间,但没有运气。

一些帮助将不胜感激,谢谢!

标签: verilogvivadopwm

解决方案


1/ 你不应该使用@ (posedge BUTTON)有两个原因:

  • 您尚未解除按钮的弹跳,因此单次按下即可触发多个速度增量。

  • 在这样的简单设计中,一切都应该运行在一个时钟上。

您应该将按钮输入与时钟同步,然后添加一个计数器 + 逻辑以检查信号是否稳定(弹跳已停止)。

2/ 错误信息非常清楚具体:

未指定的 I/O 标准:4 个逻辑端口中的 1 个......

我所做的只是检查您所有的 I/O 端口并检查您的引脚约束。我看不到ena信号的限制。


推荐阅读