nobody schrieb:
> ich bin neu in VHDL Programmieren und habe bei der Frage den Kopf
> zerbrochen, leider funktioniert mein Programm nicht.
Überleg mal, warum es VH-D-L heißt und nicht VH-P-L...
> leider funktioniert mein Programm nicht.
Was funktioniert denn an deiner Beschreibung nicht?
Welche Fehlermeldungen bekommst du?
Was erwartest du?
Was passiert stattdessen?
Wie hast du das festgestellt?
Wie sieht deine Testbench aus?
(gerade so eine PWM ist ja die dankbarste und simpelste Anwendung für
eine Testbench: Takt anlegen und Waveform ansehen...)
> constant duty: integer := 0.39*clock_freq/2;
Ich kann mir gut vorstellen, dass schon das shiefgeht. Denn VHDL hat
eine strenge Typenkontrolle. Ohne die Operatoren zu überladen wirst du
nicht einen integer mit einem float multiplizieren und anschließend
zuweisen können...
> counter = 0;
Und das geht natürlich auch schief. Ein "=" ist der Vergleichsoperator
in VHDL...
> variable counter : integer range 0 to ((clock_freg/2)-1):= 0;
clock_freg?
Sag mal, hast du diese Beschreibung überhaupt mal durch den
Syntax-Check gelassen?
> newClock <= not newClock;
So werden in einem FPGA keine Takte erzeugt. Nimm stattdessen einen
Clock-Enable.
> Ich möchte aber auch nicht blind aus dem Internet irgendetwas
> zusammenbasteln
Ich habe "deine" Beschreibung mal ein wenig angepasst und bekomme damit
die gewünschte PWM raus. Sieh es dir einfach mal an. Du musst es ja
nicht kopieren...
1 | library IEEE;
|
2 | use IEEE.std_logic_1164.all;
|
3 |
|
4 | entity pwm is
|
5 | port( CLK : in std_logic;
|
6 | O : out std_logic);
|
7 | end pwm;
|
8 |
|
9 | architecture behavior of pwm is
|
10 | constant clock_freq : integer := 500;
|
11 | constant duty: integer := 199;
|
12 | signal counter : integer range 0 to clock_freq := 0;
|
13 | begin
|
14 |
|
15 | -- PWM-Rampenzähler
|
16 | process (CLK) begin
|
17 | if CLK = '1' and CLK'event then
|
18 | if (counter = clock_freq) then
|
19 | counter <= 0;
|
20 | else
|
21 | counter <= counter +1;
|
22 | end if;
|
23 | end if;
|
24 | end process;
|
25 |
|
26 | -- PWM Vergleicher
|
27 | O <= '1' when counter<duty else '0';
|
28 |
|
29 | end behavior;
|
Und sieh dir mal meine beiden Kommentare an. Genau das hatte ich im
Kopf, als ich diese PWM beschrieben habe: ich brauche einen Zähler für
die "Rampe" und einen Vergleicher. Und wenn ich mir das bildlich
vorstellen kann, nur dann kann ich es auch beschreiben...
BTW1: was meinst du eigentlich mit "PWM-Takt soll 100kHz sein"? Soll
sich die PWM dann mit 100kHz wiederholen, oder sollen diese "100kHz"
nochmal vom PWM-Zähler heruntergeteilt werden, so dass bei einer
8-Bit-PWM dann am Ausgang 390Hz herauskommen?
BTW2: ein paar Zeilen über jeder Texteingabebox sthet das hier:
1 | Antwort schreiben
|
2 | Wichtige Regeln - erst lesen, dann posten!
|
3 | ...
|
4 | Formatierung (mehr Informationen...)
|
5 | ...
|
6 | [vhdl]VHDL-Code[/vhdl]
|
Probiert das mal aus...