www.pudn.com > newlin-pwm.rar > pwm.vhd
-- -- pwm.vhd -- -- PWM DA converter -- -- -- -- 100k -- ___ -- sdo o--|___|--o----------o uout -- | -- --- -- --- 100n -- | -- | -- --- -- - -- -- -- Author: Martin Schoeberl martin@good-ear.com -- -- -- resources on ACEX1K30-3 -- -- xx LCs, max xx MHz -- -- -- todo: -- -- -- 2003-09-27 creation -- library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; entity pwm is generic (io_addr : integer; clk_freq : integer); port ( clk : in std_logic; reset : in std_logic; addr : in std_logic_vector(3 downto 0); din : in std_logic_vector(31 downto 0); wr : in std_logic; dout : out std_logic_vector(31 downto 0); rd : in std_logic; sdo : out std_logic; nsdo : out std_logic ); end pwm; architecture rtl of pwm is signal clksd : unsigned(3 downto 0); signal clkint : unsigned(7 downto 0); signal sd_dout : std_logic_vector(15 downto 0); signal val : unsigned(7 downto 0); signal serdata : std_logic; begin sdo <= serdata; nsdo <= not serdata; -- -- io write processing -- process(clk, reset, wr, addr, din) begin if (reset='1') then val <= (others => '0'); elsif rising_edge(clk) then if addr=std_logic_vector(to_unsigned(io_addr, 4)) and wr='1' then val <= unsigned(din(7 downto 0)); end if; end if; end process; dout <= (others => 'Z'); -- -- sigma delta converter -- process(clk, reset) begin if (reset='1') then clksd <= "0000"; clkint <= (others => '0'); serdata <= '0'; elsif rising_edge(clk) then clksd <= clksd+1; if clksd="0000" then -- with 20 MHz => 1.25 MHz if clkint