Я довольно новичок в разработке Verilog и FPGA.В настоящее время я работаю над проектом по управлению двумя двигателями с использованием платы Basys 3 и моста H.
В настоящее время модуль построен для использования ШИМ для управления скоростью двигателя, посылая вывод на контакты 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] Плохое размещение для маршрутизации между выводом ввода-вывода и BUFG.
Я сделал несколькоисследования, и я думаю, что проблема была результатом того, что всегда @ (заданная КНОПКА) не точно в срок с часами.Поэтому я добавил эту строку в ограничения, чтобы игнорировать ошибку:
set_property CLOCK_DEDICATED_ROUTE FALSE [get_nets BUTTON_IBUF]
Это позволило мне успешно запустить реализацию.Однако при попытке создать поток битов я столкнулся со следующей ошибкой:
ОШИБКА: [DRC NSTD-1] Неуказанный стандарт ввода-вывода: 1 из 4 логических портов использует значение стандарта ввода-вывода (IOSTANDARD) 'ПО УМОЛЧАНИЮ »вместо назначенного пользователем конкретного значения.
Насколько я понимаю, эта ошибка возникает, когда входам / выходам не назначается начальное значение, поэтому они принимают любое значение« ПО УМОЛЧАНИЮ ».Я возился с начальными значениями и типами значений каждого из «проблемных выводов», которые были перечислены.Я смог исправить большинство из них, но в настоящее время «часы» - единственный оставшийся проблемный штифт.Я уже некоторое время пытаюсь починить часы, но безуспешно.
Некоторая помощь будет принята с благодарностью, спасибо!