2 use ieee.std_logic_1164.all;
3 use ieee.numeric_std.all;
5 entity servo_led_ps2_v1_0 is
7 -- Users to add parameters here
9 -- User parameters ends
10 -- Do not modify the parameters beyond this line
13 -- Parameters of Axi Slave Bus Interface S00_AXI
14 C_S00_AXI_DATA_WIDTH : integer := 32;
15 C_S00_AXI_ADDR_WIDTH : integer := 5
18 -- Users to add ports here
19 SERVO1 : out std_logic;
20 SERVO2 : out std_logic;
21 SERVO3 : out std_logic;
22 SERVO4 : inout std_logic;
24 -- Do not modify the ports beyond this line
27 -- Ports of Axi Slave Bus Interface S00_AXI
28 s00_axi_aclk : in std_logic;
29 s00_axi_aresetn : in std_logic;
30 s00_axi_awaddr : in std_logic_vector(C_S00_AXI_ADDR_WIDTH-1 downto 0);
31 s00_axi_awprot : in std_logic_vector(2 downto 0);
32 s00_axi_awvalid : in std_logic;
33 s00_axi_awready : out std_logic;
34 s00_axi_wdata : in std_logic_vector(C_S00_AXI_DATA_WIDTH-1 downto 0);
35 s00_axi_wstrb : in std_logic_vector((C_S00_AXI_DATA_WIDTH/8)-1 downto 0);
36 s00_axi_wvalid : in std_logic;
37 s00_axi_wready : out std_logic;
38 s00_axi_bresp : out std_logic_vector(1 downto 0);
39 s00_axi_bvalid : out std_logic;
40 s00_axi_bready : in std_logic;
41 s00_axi_araddr : in std_logic_vector(C_S00_AXI_ADDR_WIDTH-1 downto 0);
42 s00_axi_arprot : in std_logic_vector(2 downto 0);
43 s00_axi_arvalid : in std_logic;
44 s00_axi_arready : out std_logic;
45 s00_axi_rdata : out std_logic_vector(C_S00_AXI_DATA_WIDTH-1 downto 0);
46 s00_axi_rresp : out std_logic_vector(1 downto 0);
47 s00_axi_rvalid : out std_logic;
48 s00_axi_rready : in std_logic
50 end servo_led_ps2_v1_0;
52 architecture arch_imp of servo_led_ps2_v1_0 is
54 -- component declaration
55 component servo_led_ps2_v1_0_S00_AXI is
57 servo_pwm_width : integer := 24;
58 C_S_AXI_DATA_WIDTH : integer := 32;
59 C_S_AXI_ADDR_WIDTH : integer := 5
62 S_REG0 : out std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0);
63 servo_pwm_period: out std_logic_vector(servo_pwm_width-1 downto 0);
64 servo1_pwm_duty: out std_logic_vector(servo_pwm_width-1 downto 0);
65 servo2_pwm_duty: out std_logic_vector(servo_pwm_width-1 downto 0);
66 servo3_pwm_duty: out std_logic_vector(servo_pwm_width-1 downto 0);
67 servo4_pwm_duty: out std_logic_vector(servo_pwm_width-1 downto 0);
69 S_AXI_ACLK : in std_logic;
70 S_AXI_ARESETN : in std_logic;
71 S_AXI_AWADDR : in std_logic_vector(C_S_AXI_ADDR_WIDTH-1 downto 0);
72 S_AXI_AWPROT : in std_logic_vector(2 downto 0);
73 S_AXI_AWVALID : in std_logic;
74 S_AXI_AWREADY : out std_logic;
75 S_AXI_WDATA : in std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0);
76 S_AXI_WSTRB : in std_logic_vector((C_S_AXI_DATA_WIDTH/8)-1 downto 0);
77 S_AXI_WVALID : in std_logic;
78 S_AXI_WREADY : out std_logic;
79 S_AXI_BRESP : out std_logic_vector(1 downto 0);
80 S_AXI_BVALID : out std_logic;
81 S_AXI_BREADY : in std_logic;
82 S_AXI_ARADDR : in std_logic_vector(C_S_AXI_ADDR_WIDTH-1 downto 0);
83 S_AXI_ARPROT : in std_logic_vector(2 downto 0);
84 S_AXI_ARVALID : in std_logic;
85 S_AXI_ARREADY : out std_logic;
86 S_AXI_RDATA : out std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0);
87 S_AXI_RRESP : out std_logic_vector(1 downto 0);
88 S_AXI_RVALID : out std_logic;
89 S_AXI_RREADY : in std_logic
91 end component servo_led_ps2_v1_0_S00_AXI;
95 cnt_width_g : natural := 4
99 clk_i : in std_logic; --clk to divide
100 en_i : in std_logic; --enable bit?
101 reset_i : in std_logic; --asynch. reset
102 ratio_i : in std_logic_vector(cnt_width_g-1 downto 0);--initial value
103 q_out_o : out std_logic --generates puls when counter underflows
107 component pulse_gen is
109 duration_width_g : natural := 4
112 clk_i : in std_logic; --clk to divide
113 en_i : in std_logic; --enable bit?
114 reset_i : in std_logic; --asynch. reset
115 trigger_i : in std_logic; --start to generate pulse
116 duration_i : in std_logic_vector(duration_width_g-1 downto 0);--duration/interval of the pulse
117 q_out_o : out std_logic --generates pulse for given duration
121 constant servo_pwm_width : integer := 24;
123 signal servo_pwm_period: std_logic_vector(servo_pwm_width-1 downto 0);
124 signal servo1_pwm_duty: std_logic_vector(servo_pwm_width-1 downto 0);
125 signal servo2_pwm_duty: std_logic_vector(servo_pwm_width-1 downto 0);
126 signal servo3_pwm_duty: std_logic_vector(servo_pwm_width-1 downto 0);
127 signal servo4_pwm_duty: std_logic_vector(servo_pwm_width-1 downto 0);
129 signal fsm_clk : std_logic;
130 signal fsm_rst : std_logic;
132 signal pwm_cycle_start : std_logic;
134 signal s_reg0 : std_logic_vector(32-1 downto 0);
136 signal servo1_pwm: std_logic;
137 signal servo2_pwm: std_logic;
138 signal servo3_pwm: std_logic;
139 signal servo4_pwm: std_logic;
142 -- Instantiation of Axi Bus Interface S00_AXI
143 servo_led_ps2_v1_0_S00_AXI_inst : servo_led_ps2_v1_0_S00_AXI
145 servo_pwm_width => servo_pwm_width,
146 C_S_AXI_DATA_WIDTH => C_S00_AXI_DATA_WIDTH,
147 C_S_AXI_ADDR_WIDTH => C_S00_AXI_ADDR_WIDTH
151 servo_pwm_period => servo_pwm_period,
152 servo1_pwm_duty => servo1_pwm_duty,
153 servo2_pwm_duty => servo2_pwm_duty,
154 servo3_pwm_duty => servo3_pwm_duty,
155 servo4_pwm_duty => servo4_pwm_duty,
157 S_AXI_ACLK => s00_axi_aclk,
158 S_AXI_ARESETN => s00_axi_aresetn,
159 S_AXI_AWADDR => s00_axi_awaddr,
160 S_AXI_AWPROT => s00_axi_awprot,
161 S_AXI_AWVALID => s00_axi_awvalid,
162 S_AXI_AWREADY => s00_axi_awready,
163 S_AXI_WDATA => s00_axi_wdata,
164 S_AXI_WSTRB => s00_axi_wstrb,
165 S_AXI_WVALID => s00_axi_wvalid,
166 S_AXI_WREADY => s00_axi_wready,
167 S_AXI_BRESP => s00_axi_bresp,
168 S_AXI_BVALID => s00_axi_bvalid,
169 S_AXI_BREADY => s00_axi_bready,
170 S_AXI_ARADDR => s00_axi_araddr,
171 S_AXI_ARPROT => s00_axi_arprot,
172 S_AXI_ARVALID => s00_axi_arvalid,
173 S_AXI_ARREADY => s00_axi_arready,
174 S_AXI_RDATA => s00_axi_rdata,
175 S_AXI_RRESP => s00_axi_rresp,
176 S_AXI_RVALID => s00_axi_rvalid,
177 S_AXI_RREADY => s00_axi_rready
180 -- Add user logic here
181 cnt_div_inst: cnt_div
183 cnt_width_g => servo_pwm_width
189 ratio_i =>servo_pwm_period,
190 q_out_o => pwm_cycle_start
193 servo1_pwm_inst: pulse_gen
195 duration_width_g => servo_pwm_width
201 trigger_i => pwm_cycle_start,
202 duration_i => servo1_pwm_duty,
203 q_out_o => servo1_pwm
206 servo2_pwm_inst: pulse_gen
208 duration_width_g => servo_pwm_width
214 trigger_i => pwm_cycle_start,
215 duration_i => servo2_pwm_duty,
216 q_out_o => servo2_pwm
219 servo3_pwm_inst: pulse_gen
221 duration_width_g => servo_pwm_width
227 trigger_i => pwm_cycle_start,
228 duration_i => servo3_pwm_duty,
229 q_out_o => servo3_pwm
232 servo4_pwm_inst: pulse_gen
234 duration_width_g => servo_pwm_width
240 trigger_i => pwm_cycle_start,
241 duration_i => servo4_pwm_duty,
242 q_out_o => servo4_pwm
245 SERVO1 <= s_reg0(0) xor servo1_pwm;
246 SERVO2 <= s_reg0(1) xor servo2_pwm;
247 SERVO3 <= s_reg0(2) xor servo3_pwm;
248 SERVO4 <= s_reg0(3) xor servo4_pwm when s_reg0(8) = '1'
251 fsm_clk <= s00_axi_aclk;
252 fsm_rst <= not s00_axi_aresetn;