Mit einer DDFS-Einheit und einer PWM-Einheit lässt sich einfach eine PWM-Sinus-Ausgabe realisieren.
Dazu nehme ich die DDFS und die PWM und verbinde sie in der SinusPWM Entity zur gewünschten Funktion:
library IEEE;
use IEEE.std_logic_1164.ALL;
use IEEE.numeric_std.ALL;
entity SinusPWM is
Port ( clk : in STD_LOGIC;
pwmout : out STD_LOGIC);
end SinusPWM;
architecture Behavioral of SinusPWM is
component DDFS is
Port ( CLK : in std_logic;
Freq_Data : in std_logic_vector (7 downto 0);
Dout : out std_logic_vector (7 downto 0));
end component;
component PWM is
Port ( clk : in std_logic;
pwmvalue : in std_logic_vector (7 downto 0);
pwmout : out std_logic);
end component;
signal sinus : std_logic_vector(7 downto 0);
signal sinusplusoffset : std_logic_vector(7 downto 0);
begin
I_ddfs : DDFS
port map( CLK => clk,
Freq_Data => x"cc",
Dout => sinus);
sinusplusoffset <= std_logic_vector(unsigned(sinus)+to_unsigned(128,8));
I_pwm : PWM
port map( CLK => clk,
pwmvalue => sinusplusoffset,
pwmout => pwmout);
end Behavioral;
Zusammen mit der recht übersichtlichen Testbench
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
USE ieee.numeric_std.ALL;
ENTITY tb_sinusPWM_vhd IS
END tb_sinusPWM_vhd;
ARCHITECTURE behavior OF tb_sinusPWM_vhd IS
COMPONENT SinusPWM
PORT( clk : IN std_logic; pwmout : OUT std_logic);
END COMPONENT;
SIGNAL clk : std_logic := '0';
SIGNAL pwmout : std_logic;
BEGIN
uut: SinusPWM PORT MAP(clk => clk, pwmout => pwmout);
clk <= not clk after 10 ns;
END;
ergibt das dann diese Waveform
"Sinusausgabe mit PWM" vollständig lesen »