Hi Leute, ich bin Einsteiger in FPGA. Ich will PWM Signal aus FPGA(by VHDL) erzeugen aber ich weiß nicht,was ich machen soll.Mein PWM SIgnal hat 3,3 V Level(positiv Flanken). Es wäre sehr nett,wenn jemand mir helfen kann. Danke im Voraus. Milan
Man implementiert einen Zähler. Am Anfang wird der Zähler auf 0 gesetzt und das PWM Signal geht auf '1'. Bei einem bestimmten Zählerstand wird das PWM Signal auf '0' zurückgesetzt. Bei einem weiteren bestimmten Zählerstand wird der Zähler wieder auf 0 gesetzt und das PWM-Signal wieder auf '1'. Das Spiel beginnt von vorne. Die Frequenz mit der der Zähler arbeitet, die Zählerstände usw. hängen von davon ab, wie Du das PWM Signal brauchst.
> Es wäre sehr nett,wenn jemand mir helfen kann. Sieh mal dort: http://www.lothar-miller.de/s9y/categories/47-PWM
Danke Klaus für schnelle Antwort. Ich will die PWM Signal aus 2 Signale erzeugen. - erste ist dreieck Signal(ich kann erzeugen) - zweite ist 3 sinus Signal(die Spannung-und zur Zeit weiße ich noch nicht,wie ich erzeugen kann). Danke im Voraus dür die Antworten Viel Grüße Michael
> - erste ist dreieck Signal > - zweite ist 3 sinus Signal Wo hast du die Signale? Im FPGA? Mit welcher Vektrobreite? > sinus Signal(die Spannung-und zur Zeit weiße ich noch > nicht,wie ich erzeugen kann). Am einfachsten über eine Tabelle wie bei einer DDFS. Siehe auch dazu: http://www.lothar-miller.de/s9y/categories/31-DDFS ;-)
Danke Lothar, Ihre Code helfen mir sehr viel.Aber ich hab noch eine Frage über der Erzeugung des Sinus Signals. Dies Code hab ich nicht verstanden -- Sinus von 0° bis 90° (0 bis PI/2) constant Sinus_Rom : Rom64x8 := ( x"00", x"03", x"06", x"09", x"0c", x"0f", x"12", x"15", x"18", x"1b", x"1e", x"21", x"24", x"27", x"2a", x"2d", x"30", x"33", x"36", x"39", x"3b", x"3e", x"41", x"43", x"46", x"49", x"4b", x"4e", x"50", x"52", x"55", x"57", x"59", x"5b", x"5e", x"60", x"62", x"64", x"66", x"67", x"69", x"6b", x"6c", x"6e", x"70", x"71", x"72", x"74", x"75", x"76", x"77", x"78", x"79", x"7a", x"7b", x"7b", x"7c", x"7d", x"7d", x"7e", x"7e", x"7e", x"7f", x"7f"); Wie können Sie den Wert in Tabelle geben? Vielen Dank VG Michael
Den Hexwert in die Tabelle zu initialisieren ist möglich, genauso wie z.B. ein einzelnes Signal zu initialisieren:
1 | signal wert : std_logic := '1'; |
Welche Hexwerte in welcher Reihenfolge in die Tabelle kommen, das war der Output eines C-Programms. Das ganz einfach den Sinus berechnet, und das dann als Hex-Zahl in VHDL-Style formatiert hat.
Erstmal braucht man einen Sinusgenerator, dann einen PWM Integrator und einen Entscheider, ob der Integrator über dem erregenden Signal liegt oder darunter. Damit wird die Richtung des Integrators ermittelt, diese ist zugleich PWM-Ausgang.
Ich klemme da einfach meine DDFS (http://www.lothar-miller.de/s9y/categories/31-DDFS) vor meine PWM (http://www.lothar-miller.de/s9y/categories/47-PWM) und fertig ist die Laube ;-)
1 | library IEEE; |
2 | use IEEE.std_logic_1164.ALL; |
3 | use IEEE.numeric_std.ALL; |
4 | |
5 | entity SinusPWM is |
6 | Port ( clk : in STD_LOGIC; |
7 | pwmout : out STD_LOGIC); |
8 | end SinusPWM; |
9 | |
10 | architecture Behavioral of SinusPWM is |
11 | component DDFS is |
12 | Port ( CLK : in std_logic; |
13 | Freq_Data : in std_logic_vector (7 downto 0); |
14 | Dout : out std_logic_vector (7 downto 0)); |
15 | end component; |
16 | |
17 | component PWM is |
18 | Port ( clk : in std_logic; |
19 | pwmvalue : in std_logic_vector (7 downto 0); |
20 | pwmout : out std_logic); |
21 | end component; |
22 | |
23 | signal sinus : std_logic_vector(7 downto 0); |
24 | signal sinusplusoffset : std_logic_vector(7 downto 0); |
25 | |
26 | begin
|
27 | I_ddfs : DDFS |
28 | port map ( CLK => clk, Freq_Data => x"bb", Dout => sinus); |
29 | |
30 | sinusplusoffset <= std_logic_vector(unsigned(sinus)+to_unsigned(128,8)); |
31 | |
32 | I_pwm : PWM |
33 | port map ( CLK => clk, pwmvalue => sinusplusoffset, pwmout => pwmout); |
34 | |
35 | end Behavioral; |
Die Waveform ist als Screenshot angehängt.
Damit baust du genau das, was ich oben beschrieben habe, mit dem Unterschied, dass Dein "wait-until" Konstrukt nicht synthetisierbar ist.
Harald schrieb: > ... dass Dein "wait-until" Konstrukt nicht synthetisierbar ist. Doch, ist er. Probiers aus. ;-) Die Synthesetools können zwischenzeitlich noch ganz andere Dinge: http://www.lothar-miller.de/s9y/categories/6-Clock-Enable und http://www.lothar-miller.de/s9y/categories/34-Getakteter-Prozess
Deine Beispiele sind schon plausibel, speziell das mit den enable hätte ich auch so codiert, wenn ich ein Synthesetool wäre. Aber der Vorschlag mit der Sensitivityliste bietet nicht wirklich eine Vereinfachung. Folgendes Misverständnis sehe ich: [vhdl] process (reset,clk) begin -- Sesitivity-List unvollständig, -- weil "and clk'event" fehlt, -- müsste inp für eine korrekte Simulation mit aufgenommen werden if (reset='1') then outp <= '0'; elsif (clk='1') then -- hier fehlt "and clk'event" outp <= inp; end if; end process; [/hdl] Du unsterstellst, dass clk ein Talt sein soll. Solange Du das nicht hinschreibst, ist es keiner und die Schaltung kombiniert vollkommen korrekt und zwar so wie Synthese und Sensitivy zu interpretieren sind. Die Sache stimmt vollkommen so. Es ist nur Deine Idee, das clk ein Clock sein soll. Schreib es hin und es wird gehen,
Harald schrieb: > Solange Du das nicht hinschreibst, ist es keiner ... > Es ist nur Deine Idee, das clk ein Clock sein soll. > Schreib es hin und es wird gehen, Richtig, aber weil ich etwas vergessen habe ("and clk'event" beim elsif), scheint die Simulation korrekt zu sein, die synthetisierte Hardware ist aber ein Latch und verhält sich ganz anders. Für eine korrekte Simulation der falschen Beschreibung fehlt "inp" in der Sensitivliste... Mit einem
1 | wait until clk='1'; |
wird das nie passieren, weil es keine Sensitivliste gibt.
Du unterstellst aber immer noch, dass CLK ein Takt ist. Wenn Du das tust und korrekt beschreibst, arbeitet SIM und SYN korrekt. Wenn aber CLK kein Takt ist (und dann sähe das VHDL ja auch so aus) dann währe waituntil falsch! Das Problem ist, dass Du bei Deiner Betrachtung einseitig darauf fokussierst, dass Du diesen einen Fall hast und nur die Sens nicht gefüllt hast. Im anderen Fall, in dem Das VHDl so korrekt formuliert ist, liegt die Idee daneben! Im Übrigen sind fehlende Signale in der der Sens nicht zwingend ein Fehler sondern oft gewollte ereignisgesteurtes Verhaltensbeschreibung in SIMS.
> Du unterstellst aber immer noch, dass CLK ein Takt ist. Richtig, "clk" soll ein Takt sein. Aber ich habe in der Beschreibung das "and clk'event" vergessen (hast du noch nie was vergessen?). Und wenn ich das Ganze simuliere, sieht es aus, wie wenn alles korrekt beschreiben wäre: der Ausgang ändert sich nur in Abhängigkeit von "reset" und "clk". Also, denke ich mir, alles gut, Simulation passt. Aber in der Hardware taucht dann auf einmal ein Latch auf... > Das Problem ist, dass Du bei Deiner Betrachtung einseitig darauf > fokussierst, dass Du diesen einen Fall hast und nur die Sens nicht > gefüllt hast. Der Fall kommt aus der Realität (wie auch die anderen Beispiele auf meiner HP), ist allerdings zur Veranschaulichung hier deutlich abgespeckt. In einem schönen großen Prozess siehst du das vergessene "and clk'event" nicht so leicht. > Im Übrigen sind fehlende Signale in der der Sens nicht zwingend ein > Fehler sondern oft gewollte ereignisgesteurtes Verhaltensbeschreibung in > SIMS. WOW. Das ist allerdings ein übler Stil, den ich meinem Nachfolger nicht zumuten würde. Der weiß nichts von meinen (damaligen) Gedankengängen, und denkt sich: Hoppla, da fehlt ein Signal... :-o
> Das Problem ist, dass Du bei Deiner Betrachtung einseitig darauf > fokussierst, dass Du diesen einen Fall hast und nur die Sens nicht > gefüllt hast. Das Problem ist, das VHDL Compiler für die Synthese MUSTER und STRUKTUREN erkennen, um daraus FFs, Latsches, usw. zu erkennen. Das dahinterstehende VHDL interessiert sie überhaupt nicht, weil im FPGA nicht Prozesse laufen, sondern FFs schalten. Wenn jetzt in der Sensitivity List Signale fehlen, dann werden diese vom Compiler (LEIDER) stillschweigend ergänzt, im besten Fall kommt eine Warnung. Sythese und Simulation stimmen dann nicht überein. Im obigen Beispiel fehlt entweder das clk'event, dann wirds die Beschreibung eines FF's, oder es fehlt das Signal inp, dann wirds ein Latch. So wie es da steht, ist es zwar VHDL für die Simulation, entspricht aber keiner möglichen Hardware.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.