Guten Tag miteinander Ich bin absoluter Neuling im VHDL-Programmieren und beschäftige mich seit einigen Tagen mit dem Ansteuern eines Servos. Fast das gesamte habe ich von meinem Lehrer so übernommen. Nun ist aber meine Frage, wie muss ich die Pins der Input: length (0 bis 10) belegen? Muss ich denen eine separate Pulsbreite zuteilen? Stimmt das Programm überhaupt? Herzlichen Dank im Voraus Mein Programm:
1 | library ieee; |
2 | use ieee.std_logic_1164.all; |
3 | use ieee.std_logic_unsigned.all; |
4 | --------------------------------
|
5 | entity Servo is |
6 | PORT ( |
7 | clk50M : in std_logic; --50MHz Sysclk |
8 | length : in std_logic_vector(10 downto 0):= "00010100000"; |
9 | servo : out std_logic); |
10 | end Servo; |
11 | --------------------------------
|
12 | architecture ServoPuls of Servo is |
13 | signal cnt50M: integer range 0 to 500 :=0; |
14 | signal cnt10u: integer range 0 to 2000 := 0; |
15 | signal Takt10u: std_logic; |
16 | signal Len: std_logic_vector(10 downto 0); |
17 | signal ServoTakt: std_logic; |
18 | begin
|
19 | --Erzeugung des 10us Taktes----------------------
|
20 | process (clk50M) |
21 | begin
|
22 | if (cnt50M=0) then |
23 | Len <= Length; |
24 | end if; |
25 | if (clk50M='1' and clk50M'event) then |
26 | if (cnt50M < 500-1) |
27 | then cnt50M<= cnt50M+1; |
28 | else cnt50M<= 0; |
29 | end if; |
30 | if (cnt50M<250) then |
31 | Takt10u<='1'; |
32 | else Takt10u<='0'; |
33 | end if; |
34 | end if; |
35 | end process; |
36 | --Erzeuge Servotakt 1..2ms in 20ms----------------
|
37 | process (Takt10u) |
38 | begin
|
39 | if (Takt10u='1' and Takt10u'event) then |
40 | if (cnt10u < 2000) --Periode 20ms |
41 | then cnt10u<= cnt10u+1; |
42 | else cnt10u<=0; |
43 | end if; |
44 | if (cnt10u < Len) --Servotakt 1..2ms |
45 | then ServoTakt<= '1'; |
46 | else ServoTakt<= '0'; |
47 | end if; |
48 | end if; |
49 | end process; |
50 | Servo<= ServoTakt; |
51 | end ServoPuls; |