Forum: FPGA, VHDL & Co. Pinbelegung?!


von VHDL_Starter (Gast)


Lesenswert?

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;

von Dieter (Gast)


Lesenswert?

Regel 1:
Der Clock ist heilig.
1
  process (Takt10u)
2
  begin
3
   if (Takt10u='1' and Takt10u'event) then

daraus mach mal ganz schnell:
1
  process (clkM)
2
  begin
3
   if rising_edge(clkM) then
4
      if Takt10u = '1' then

2. cnt10u kann überlaufen, bei einem unsigned kein Problem, bei einem 
Integer nicht schön

3. wo werden die FF initiert. Kein Reset vorhanden. cnt10u kann im 
synthetisierten Code auf '0' stehen, muss es aber nicht. Das kommt auf 
den Synthetisierer an

4. wenn length Vektor von außen kommt einsynchronisieren!

5. nutze CONSTANTS mit sinnvollen Namen, bei den ganzen Werten blickt 
doch keiner durch

&. SIMULIEREN der Funktion... geht in Xilinx WebPack, ModelSim oder GHDL

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Angehängte Dateien:

Lesenswert?

VHDL_Starter schrieb:
1.
> if (cnt50M=0) then
>     Len <= Length;
>     end if;
Du hast keine Angst vor Glitches? Das ist ein kombinatorischer 
Vergleich, der zum asynchronen Setzen von Len führt. Was, wenn der 
Zähler cnt50M von 255 auf 256 hochzählt, und die Flipflops ein wenig 
schneller zurückgesetzt als gesetzt werden? Dann ist der Zählerwert für 
einen glitchigen Augenblick lang Null.

2.
>  process (clk50M)
>  begin
>    if (cnt50M=0) then
>       Len <= Length;
>    end if;
>    if (clk50M='1' and clk50M'event) then
Deine Simulation wird nicht zur Realität passen, weil cnt50M nicht in 
der Sensitivliste ist, aber kombinatorisch (=ausserhalb des Taktes) 
abgefragt wird.

3. sieh dir mal den Screenshot an und ersetze das 'c' in den eckigen 
Klammern durch 'vhdl'

4.
> length   : in std_logic_vector(10 downto 0):= "00010100000";
Es macht keinen Sinn, einen Eingang auf einen Wert zu initialisieren. 
Sowas gibt es in der realen Hardware auch nicht.

5.
> Mein Programm:
Du programmierst hier nicht, sondern du beschreibst Was. Deshalb 
besser so:
> Meine Beschreibung:

6.
> use ieee.std_logic_1164.all;
> use ieee.std_logic_unsigned.all;
Siehe den Beitrag "IEEE.STD_LOGIC_ARITH.ALL obsolete"

7.
> Fast das gesamte habe ich von meinem Lehrer so übernommen.
DAS ist natürlich böse...   :-o


Dieter schrieb:
> 4. wenn length Vektor von außen kommt einsynchronisieren!
Wobei das nur asynchrone Signale betrifft, und Einsynchronisieren von 
Vektoren sowieso nicht klappt. Da müsste dann mit einem 
Datenübernahmesignal (oder Handshakesignal[en]) gearbeitet werden...

Zum Takt: der ist wie der "Highlander". Es kann nur einen geben!

Siehe da meine Postulate:
Beitrag "vhdl-richtlinien f. synthese?"

von VHDL_Starter (Gast)


Lesenswert?

Herzlichen Dank für die schnelle Antwort. :)

Mir ist immer noch nicht ganz klar, für was denn die Length inputs 
überhaupt gebraucht werden? Kann ich damit das Programm "starten"?
Weil meine eigentliche Aufgabe, die ich realisieren will ist, dass ich 
einen bestimmten Taster drücken will und sich dann der Servo auf den 
darauf zugewiesenen "Wert", den ich bestimme(z.B. Tast1-> 10°), stellt. 
Das sollte grundsätzlich doch schon irgendwie möglich sein? Oder bin ich 
jetzt völlig auf dem Holzweg?!

Dieter schrieb:
> 2. cnt10u kann überlaufen, bei einem unsigned kein Problem, bei einem
> Integer nicht schön

Was bedeutet überlaufen genau und wie kann ich dies umgehen?

Grüsse

von Uwe (Gast)


Lesenswert?


von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

VHDL_Starter schrieb:
> Kann ich damit das Programm "starten"?
Hast du meinen Post eigentlich gelesen?

> Was bedeutet überlaufen genau
Was passiert bei einem 8-Bit Zähler, wenn er auf 255 steht und ein 
Zählimpuls kommt?
>  und wie kann ich dies umgehen?
Du verwendest einen sättigenden Zähler.

Dieter schrieb:
> 2. cnt10u kann überlaufen
Kann er nicht. Sieh mal den Quelltext sauber formatiert:
1
   if (Takt10u='1' and Takt10u'event) then
2
     if (cnt10u < 2000) then     --Periode 20ms
3
       cnt10u <= cnt10u+1;
4
     else 
5
       cnt10u <= 0;
6
     end if;
Allerdings zählt der Zähler 2001 Schritte. Die PWM ist also ein bisschen 
ungenau...

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.