2 use ieee.std_logic_1164.all;
3 use ieee.std_logic_arith.all;
4 use ieee.std_logic_unsigned.all;
6 --------------------------------------------------------------------------------
10 IRF_ADR_W : integer := 5;
11 PWM_W : integer := 10;
13 PWMMIN_OFF : integer := 6;
14 P_BASE : integer := 16;
15 P_SIZE : integer := 4;
16 PWM_OFF : integer := 1);
18 -- Primary Slave interface
19 ACK_O : out std_logic;
23 -- Shared dual-port memory
24 IRF_ACK_I : in std_logic;
25 IRF_ADR_O : out std_logic_vector (IRF_ADR_W-1 downto 0);
26 IRF_DAT_I : in std_logic_vector (15 downto 0);
27 IRF_DAT_O : out std_logic_vector (15 downto 0);
28 IRF_STB_O : out std_logic;
29 IRF_WE_O : out std_logic);
32 --------------------------------------------------------------------------------
34 architecture behavioral of pwm_min is
36 type state_t is (ready, phase1, phase2, phase3, done);
37 subtype irf_adr_t is std_logic_vector (IRF_ADR_W-1 downto 0);
39 constant PWMMIN : irf_adr_t := conv_std_logic_vector(BASE+PWMMIN_OFF, IRF_ADR_W);
40 constant PWM1 : irf_adr_t := conv_std_logic_vector(P_BASE+PWM_OFF+0*P_SIZE, IRF_ADR_W);
41 constant PWM2 : irf_adr_t := conv_std_logic_vector(P_BASE+PWM_OFF+1*P_SIZE, IRF_ADR_W);
42 constant PWM3 : irf_adr_t := conv_std_logic_vector(P_BASE+PWM_OFF+2*P_SIZE, IRF_ADR_W);
44 signal state : state_t := ready;
46 signal pwm_adr : std_logic_vector (IRF_ADR_W-1 downto 0);
47 --signal pwm_compare : std_logic_vector (PWM_W-1 downto 0);
48 signal pwm_compare : std_logic_vector (PWM_W-1 downto 0);
49 signal pwm_less : std_logic;
50 signal write_min : std_logic;
52 signal ack : std_logic := '0';
53 signal irf_stb : std_logic := '0';
54 signal irf_we : std_logic;
56 --------------------------------------------------------------------------------
60 ACK_O <= ack and STB_I;
62 IRF_ADR_O <= PWMMIN when write_min = '1' else pwm_adr;
63 IRF_DAT_O <= IRF_DAT_I;
64 IRF_STB_O <= irf_stb and (not write_min or irf_we);
67 pwm_less <= '1' when IRF_DAT_I(pwm_compare'RANGE) < pwm_compare else '0';
68 irf_we <= '1' when (pwm_less = '1' or state = phase1) and write_min = '1' else '0';
72 if rising_edge(CLK_I) then
74 pwm_compare <= IRF_DAT_I(pwm_compare'RANGE);
80 FSM : process (CLK_I) is
82 if rising_edge(CLK_I) then
100 if write_min = '1' then
108 if write_min = '1' then
116 if write_min = '1' then