2016-12-08 2 views
0

Я пытаюсь сделать сервоработу на своей ПЛИС на базе Spartan-6.Серво на FPGA

мой код выглядит следующим образом:

`timescale 1ns/1ps 


/* 
1 pin for servo--ORANGE CABLE 
red cable-- 5V, brown cable-- GND. 
Position "0" (1.5 ms pulse) is middle, 
"90" (~2ms pulse) is all the way to the right, 
"-90" (~1 ms pulse) is all the way to the left. 
servo stuff: 
http://www.micropik.com/PDF/SG90Servo.pdf 
*/ 


//All i need to do is set SERVOPWM to 1 and 0 with delays i think 
module ServoTestNShit(input M_CLOCK, 
          output [7:0] IO_LED, // IO Board LEDs 
          output reg SERVOPWM);  

    assign IO_LED = 7'b1010101; // stagger led lights just cause 

    reg [15:0] counter; 

    //use counter to have a 1ms or 2ms or 1.5ms duty cycle for a while inorder to actually run 
    //because run it this way is asking the servo to move for 1.5ms so it cant atually move that fast 
    always @* 
    begin 

     for(counter = 0; counter < 3000; counter = counter + 1) 
     begin 
     SERVOPWM = 1; 
     #2; 
     SERVOPWM = 0; 
     #2; 
     SERVOPWM = 1; 
     #2; 
     SERVOPWM = 0; 
     #2; 
     SERVOPWM = 1; 
     #2; 
     SERVOPWM = 0; 
     #2; 
     end 

     for(counter = 0; counter < 3000; counter = counter + 1) 
     begin 
     SERVOPWM = 1; 
     #1; 
     SERVOPWM = 0; 
     #2; 
     SERVOPWM = 1; 
     #1; 
     SERVOPWM = 0; 
     #2; 
     SERVOPWM = 1; 
     #1; 
     SERVOPWM = 0; 
     #2; 
     end 

    end 


endmodule 

и мой файл UCF довольно много всего:

# Clock signal 

NET "M_CLOCK" LOC = P123; 


NET "SERVOPWM" LOC = P121 ;//0P1 

Так что в моей голове, мой код будет создавать импульсную волну первым на всем пути справа, установив высоту на 2 мс, затем низкий, затем высокий на 2 мс и т. д. и повторяя. Затем, весь путь влево с высоким значением для 1 мс и т. Д. Я думал, что эта проблема будет относительно простой, поскольку все, что я делаю, это отправить 1 или 0 на вывод IO, и у меня есть сервопривод, подключенный к 5v , земля и контакт ввода-вывода.

Есть ли что-то глупое/очевидное/легкое, что мне не хватает? Или есть какая-то часть концепции, которую я пропускаю?

Спасибо за любую помощь заранее! Cody

ответ

0

Операторы задержки (#) не синтезируются в verilog. Таким образом, он выдает только окончательное значение. Вы должны синхронизировать выходы с часами.

То, как я бы это

always @ (posedge clk) 
begin 
    counter <= counter+1; 
end 

always @ (negedge clk) 
begin 
    SERVOPWM <= (counter <= pwm_value); 
end 
+0

Спасибо! Это определенно привело меня к правильному пути. Я понятия не имел, что заявления о задержке не синтезировали. –

+0

Добро пожаловать. Пожалуйста, подтвердите ответ, если он решит ваш вопрос. –

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