با VHDL راحت با چند خط میشه درستش کرد، کلاک اوسیلاتور رو میدی به یه GCLOCK و میاریش تو یه Process وروی rising_edge اون کلاک شروع به شمردن میکنی و هر موقع شمارنده به عدد دلخواهت رسید اون I/O که برای PWM استفاده کردی رو صفر و یک میکنی. DCO خیلی از PWM بهتر ودقیق تره ولی تو CPLD جا نمیگیره، اما اگه دقت بالا نمیخوای همون کافیه که بتونی چند بار ازش Instance بگیری و چند خروجی PWM روی CPLD بگیری.
اقا خیلی ممنون
ولی راستش من مثل شما خیلی حرفه ای نیستم
میشه یه کد vhdl نمونه برام معرفی کنی؟
من توی سایت ها گشتم و sampel code پیدا نکردم
ممنون میشم
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity PWM_Generator is
port (
CLOCK_IN : IN STD_LOGIC;--Input Clock Pin
PWM_OUT : OUT STD_LOGIC;--Output PWM Pin
DIVISION_FACTOR_IN : IN STD_LOGIC_VECTOR (7 downto 0)--8-bit Division factor x2 Zero means PWM = 1/2*Clock
);
end PWM_Generator;
architecture PWM_Generator_Function of PWM_Generator is
signal PWM : STD_LOGIC := '0';
signla Division :Unsigned (7 downto 0);
begin
PWM_OUT <= PWM;
process(CLOCK_IN)
variable Timeout : unsigned(7 downto 0) := x"00";
begin
if rising_edge(CLOCK_IN) then
if(Timeout < Division)then
Timeout := Timeout + 1;
else
PWM <= not PWM;
Timeout := x"00";
end if;
end if;
end process;
end PWM_Generator_Function;
دیدگاه