Ja, ist keine PWM. PFM aber auch nicht, weil der Abstand der Pulse nicht
konstant ist (Bsp: PWM_IN=255 gibt 0-0-1-0-1-0...-1-0-0-1...). Also eher
eine Pulse Distribution Modulation... PDM ist an sich nicht verkehrt,
weil zB. der Ripple nach einem RC-Glied bei vielen PWM-Werten kleiner
wird. Aber mit der Methode habe ich es auch noch nicht gesehen...
Der Code ist aber ohnehin nicht so toll. In der Entity gibts eine
Default-Zuweisung an PWM_in, dabei ist das doch grad der wichtigste
Eingang... Dafür fehlt eine Initialisierung vom Akku, entweder per
explizitem Reset oder := in der Deklaration. Damit ist der Akku
undefiniert ('U'). Geht zwar in echt, aber nur da. Obiges wird im
Simulator nach einem Takt lauter nette rote 'X'e produzieren, weil
'U'+irgendwas immer 'X' gibt...
Weiterhin will man "IEEE.STD_LOGIC_UNSIGNED.ALL" nicht mehr verwenden.
Trotz des Namens ist das kein Standard. Nimm den Typ unsigned von
"IEEE.NUMERIC_STD.all" (hätte auch signed). Vermutlich ist das auch der
Grund, warum es bei dir nichts geworden ist. Normale Vektoren sind reine
Aneinanderreihung von Bits ohne arithmetische Interpretation. D.h. +/-
oder Grössenvergleiche ausser = Gleichheit sind eigentlich nicht
definiert. Synopsys hat ein paar Bibliotheken verbrochen (u.a. obige),
die das mit diversen Nebenwirkungen reingewürgt haben.
Wenn man numeric_std nimmt, kann man als Typen zB. unsigned(7 downto 0)
definieren und die ganze Arithmetik geht ohne grösseren Aufwand, soweit
Overloading und Typprüfung in VHDL das zulassen...
Mit numeric_std und passend definierten Signalen würde der innere Teil
einer PWM zB so aussehen:
pwm_acc<=pwm_acc+1;
pwm_out<='0';
if pwm_acc<pwm_in then
pwm_out<'1';
end if;
Ist aber nicht ganz optimal, da das < eine Subtraktion produziert. Man
kann auch nur bei Gleichheit das Bit setzen und nur beim Wraparound
wieder auf 0 zwingen. Aber viel bringts nicht und ist bei heutigen FPGAs
auch recht egal.