我对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之间的路由布置不当。
我做了一些研究,我认为问题是由于 总是@(posege按钮) 时钟不准时。 所以我将这一行添加到约束中以忽略该错误:
set_property CLOCK_DEDICATED_ROUTE FALSE [get_nets BUTTON_IBUF]
这使我能够成功运行实施。但是,在尝试生成位流时遇到了以下错误:
错误:[DRC NSTD-1]未指定I / O标准:4个逻辑端口中有1个使用I / O标准(IOSTANDARD)值'DEFAULT',而不是用户分配的特定值。
据我了解,当没有为输入/输出分配初始值时,就会发生此错误,因此它们会假定“ DEFAULT”值是什么。我摆弄了列出的每个“问题引脚”的初始值和值类型。我能够修复其中的大多数问题,但目前“时钟”是唯一剩下的问题引脚。我一直在尝试修复时钟,但是没有运气。
一些帮助将不胜感激,谢谢!
答案 0 :(得分:0)
1 /您不应使用@ (posedge BUTTON)
有两个原因:
您尚未取消按钮的反跳操作,因此单按一次即可触发多个速度增量。
在像这样的简单设计中,所有内容都应运行一个时钟。
您应该将按钮输入与时钟同步,然后添加一个计数器+逻辑以检查信号是否稳定(弹跳已停止)。
2 /错误消息非常明确且具体:
未指定的I / O标准:4个逻辑端口中的1个。...
我所做的就是检查所有I / O端口并检查引脚约束。我认为ena
信号没有任何限制。