2 use ieee.std_logic_1164.all;
3 use ieee.numeric_std.all;
5 entity spi_leds_and_enc_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 := 6
18 -- Users to add ports here
19 spi_led_reset : out std_logic;
20 spi_led_clk : out std_logic;
21 spi_led_cs : out std_logic;
22 spi_led_data : out std_logic;
23 spi_led_encin : in std_logic;
25 -- Do not modify the ports beyond this line
28 -- Ports of Axi Slave Bus Interface S00_AXI
29 s00_axi_aclk : in std_logic;
30 s00_axi_aresetn : in std_logic;
31 s00_axi_awaddr : in std_logic_vector(C_S00_AXI_ADDR_WIDTH-1 downto 0);
32 s00_axi_awprot : in std_logic_vector(2 downto 0);
33 s00_axi_awvalid : in std_logic;
34 s00_axi_awready : out std_logic;
35 s00_axi_wdata : in std_logic_vector(C_S00_AXI_DATA_WIDTH-1 downto 0);
36 s00_axi_wstrb : in std_logic_vector((C_S00_AXI_DATA_WIDTH/8)-1 downto 0);
37 s00_axi_wvalid : in std_logic;
38 s00_axi_wready : out std_logic;
39 s00_axi_bresp : out std_logic_vector(1 downto 0);
40 s00_axi_bvalid : out std_logic;
41 s00_axi_bready : in std_logic;
42 s00_axi_araddr : in std_logic_vector(C_S00_AXI_ADDR_WIDTH-1 downto 0);
43 s00_axi_arprot : in std_logic_vector(2 downto 0);
44 s00_axi_arvalid : in std_logic;
45 s00_axi_arready : out std_logic;
46 s00_axi_rdata : out std_logic_vector(C_S00_AXI_DATA_WIDTH-1 downto 0);
47 s00_axi_rresp : out std_logic_vector(1 downto 0);
48 s00_axi_rvalid : out std_logic;
49 s00_axi_rready : in std_logic
51 end spi_leds_and_enc_v1_0;
53 architecture arch_imp of spi_leds_and_enc_v1_0 is
55 -- component declaration
56 component spi_leds_and_enc_v1_0_S00_AXI is
58 C_S_AXI_DATA_WIDTH : integer := 32;
59 C_S_AXI_ADDR_WIDTH : integer := 6
62 output_led_line : out std_logic_vector(31 downto 0);
63 output_led_rgb1 : out std_logic_vector(23 downto 0);
64 output_led_rgb2 : out std_logic_vector(23 downto 0);
65 output_led_direct : out std_logic_vector(7 downto 0);
66 output_kbd_direct : out std_logic_vector(3 downto 0);
68 in_enc_direct : in std_logic_vector(8 downto 0);
69 in_kbd_direct : in std_logic_vector(3 downto 0);
70 in_enc_8bit : in std_logic_vector(23 downto 0);
71 in_enc_buttons : in std_logic_vector(2 downto 0);
73 S_AXI_ACLK : in std_logic;
74 S_AXI_ARESETN : in std_logic;
75 S_AXI_AWADDR : in std_logic_vector(C_S_AXI_ADDR_WIDTH-1 downto 0);
76 S_AXI_AWPROT : in std_logic_vector(2 downto 0);
77 S_AXI_AWVALID : in std_logic;
78 S_AXI_AWREADY : out std_logic;
79 S_AXI_WDATA : in std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0);
80 S_AXI_WSTRB : in std_logic_vector((C_S_AXI_DATA_WIDTH/8)-1 downto 0);
81 S_AXI_WVALID : in std_logic;
82 S_AXI_WREADY : out std_logic;
83 S_AXI_BRESP : out std_logic_vector(1 downto 0);
84 S_AXI_BVALID : out std_logic;
85 S_AXI_BREADY : in std_logic;
86 S_AXI_ARADDR : in std_logic_vector(C_S_AXI_ADDR_WIDTH-1 downto 0);
87 S_AXI_ARPROT : in std_logic_vector(2 downto 0);
88 S_AXI_ARVALID : in std_logic;
89 S_AXI_ARREADY : out std_logic;
90 S_AXI_RDATA : out std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0);
91 S_AXI_RRESP : out std_logic_vector(1 downto 0);
92 S_AXI_RVALID : out std_logic;
93 S_AXI_RREADY : in std_logic
95 end component spi_leds_and_enc_v1_0_S00_AXI;
97 component spi_leds_and_enc_v1_0_spi_fsm is
99 data_width : integer := 32;
100 spi_clkdiv : integer := 10
103 reset_in : in std_logic;
105 clk_in : in std_logic;
106 clk_en : in std_logic;
108 spi_clk : out std_logic;
109 spi_cs : out std_logic;
110 spi_mosi : out std_logic;
111 spi_miso : in std_logic;
113 tx_data : in std_logic_vector(data_width-1 downto 0);
114 rx_data : out std_logic_vector(data_width-1 downto 0);
116 trasfer_rq : in std_logic;
117 transfer_ready : out std_logic
123 clk_i : in std_logic;
124 clk_en : in std_logic;
127 ch_o : out std_logic;
128 ch_1ck_o : out std_logic
132 component qcounter_nbit is
134 bitwidth: integer := 32
139 a0, b0: in std_logic;
140 qcount: out std_logic_vector (bitwidth - 1 downto 0);
141 a_rise, a_fall, b_rise, b_fall, ab_event: out std_logic;
142 ab_error: out std_logic
148 cnt_width_g : natural := 4
152 clk_i : in std_logic; --clk to divide
153 en_i : in std_logic; --enable bit?
154 reset_i : in std_logic; --asynch. reset
155 ratio_i : in std_logic_vector(cnt_width_g-1 downto 0);--initial value
156 q_out_o : out std_logic --generates puls when counter underflows
160 component pulse_gen is
162 duration_width_g : natural := 4
165 clk_i : in std_logic; --clk to divide
166 en_i : in std_logic; --enable bit?
167 reset_i : in std_logic; --asynch. reset
168 trigger_i : in std_logic; --start to generate pulse
169 duration_i : in std_logic_vector(duration_width_g-1 downto 0);--duration/interval of the pulse
170 q_out_o : out std_logic --generates pulse for given duration
174 constant spi_data_width : integer := 48;
175 constant spi_clk_div : integer := 10;
176 constant enc_number : integer := 3;
177 constant pwm_width : integer := 8;
178 constant pwm_ratio : std_logic_vector(pwm_width-1 downto 0) :=
179 std_logic_vector(to_unsigned(2 ** pwm_width - 1, pwm_width));
181 signal fsm_clk : std_logic;
182 signal fsm_rst : std_logic;
183 signal spi_rx_data : std_logic_vector(spi_data_width-1 downto 0);
184 signal spi_tx_data : std_logic_vector(spi_data_width-1 downto 0);
185 signal spi_transfer_ready : std_logic;
187 signal spi_out_rgb1 : std_logic_vector(2 downto 0);
188 signal spi_out_rgb2 : std_logic_vector(2 downto 0);
190 signal spi_out_led3 : std_logic;
191 signal spi_out_led4 : std_logic;
193 signal output_led_line : std_logic_vector(31 downto 0);
194 signal output_led_rgb1 : std_logic_vector(23 downto 0);
195 signal output_led_rgb2 : std_logic_vector(23 downto 0);
196 signal output_led_direct : std_logic_vector(7 downto 0);
197 signal output_kbd_direct : std_logic_vector(3 downto 0);
199 signal in_enc_direct : std_logic_vector(8 downto 0);
200 signal in_kbd_direct : std_logic_vector(3 downto 0);
201 signal in_enc_8bit : std_logic_vector(23 downto 0);
202 signal in_enc_buttons : std_logic_vector(2 downto 0);
204 signal enc_cha : std_logic_vector(enc_number downto 1);
205 signal enc_chb : std_logic_vector(enc_number downto 1);
206 signal enc_sw : std_logic_vector(enc_number downto 1);
208 signal enc_cha_filt : std_logic_vector(enc_number downto 1);
209 signal enc_chb_filt : std_logic_vector(enc_number downto 1);
210 signal enc_sw_filt : std_logic_vector(enc_number downto 1);
211 signal enc_sw_changed : std_logic_vector(enc_number downto 1);
212 signal enc_pos_changed : std_logic_vector(enc_number downto 1);
214 signal pwm_cycle_start : std_logic;
215 signal pwm_rgb1_sig : std_logic_vector(2 downto 0);
216 signal pwm_rgb2_sig : std_logic_vector(2 downto 0);
220 -- Instantiation of Axi Bus Interface S00_AXI
221 spi_leds_and_enc_v1_0_S00_AXI_inst : spi_leds_and_enc_v1_0_S00_AXI
223 C_S_AXI_DATA_WIDTH => C_S00_AXI_DATA_WIDTH,
224 C_S_AXI_ADDR_WIDTH => C_S00_AXI_ADDR_WIDTH
227 output_led_line => output_led_line,
228 output_led_rgb1 => output_led_rgb1,
229 output_led_rgb2 => output_led_rgb2,
230 output_led_direct => output_led_direct,
231 output_kbd_direct => output_kbd_direct,
233 in_enc_direct => in_enc_direct,
234 in_kbd_direct => in_kbd_direct,
235 in_enc_8bit => in_enc_8bit,
236 in_enc_buttons => in_enc_buttons,
238 S_AXI_ACLK => s00_axi_aclk,
239 S_AXI_ARESETN => s00_axi_aresetn,
240 S_AXI_AWADDR => s00_axi_awaddr,
241 S_AXI_AWPROT => s00_axi_awprot,
242 S_AXI_AWVALID => s00_axi_awvalid,
243 S_AXI_AWREADY => s00_axi_awready,
244 S_AXI_WDATA => s00_axi_wdata,
245 S_AXI_WSTRB => s00_axi_wstrb,
246 S_AXI_WVALID => s00_axi_wvalid,
247 S_AXI_WREADY => s00_axi_wready,
248 S_AXI_BRESP => s00_axi_bresp,
249 S_AXI_BVALID => s00_axi_bvalid,
250 S_AXI_BREADY => s00_axi_bready,
251 S_AXI_ARADDR => s00_axi_araddr,
252 S_AXI_ARPROT => s00_axi_arprot,
253 S_AXI_ARVALID => s00_axi_arvalid,
254 S_AXI_ARREADY => s00_axi_arready,
255 S_AXI_RDATA => s00_axi_rdata,
256 S_AXI_RRESP => s00_axi_rresp,
257 S_AXI_RVALID => s00_axi_rvalid,
258 S_AXI_RREADY => s00_axi_rready
261 -- Add user logic here
263 spi_leds_and_enc_v1_0_spi_fsm_inst: spi_leds_and_enc_v1_0_spi_fsm
265 data_width => spi_data_width,
266 spi_clkdiv => spi_clk_div
273 spi_clk => spi_led_clk,
274 spi_cs => spi_led_cs,
275 spi_mosi => spi_led_data,
276 spi_miso => spi_led_encin,
278 tx_data => spi_tx_data,
279 rx_data => spi_rx_data,
282 transfer_ready => spi_transfer_ready
285 cnt_div_inst: cnt_div
287 cnt_width_g => pwm_width
291 en_i => spi_transfer_ready,
293 ratio_i => pwm_ratio,
294 q_out_o => pwm_cycle_start
297 irc_block: for i in enc_number downto 1 generate
301 clk_en => spi_transfer_ready,
303 q_o => enc_cha_filt(i),
310 clk_en => spi_transfer_ready,
312 q_o => enc_chb_filt(i),
319 clk_en => spi_transfer_ready,
321 q_o => enc_sw_filt(i),
323 ch_1ck_o => enc_sw_changed(i)
325 qcounter: qcounter_nbit
332 a0 => enc_cha_filt(i),
333 b0 => enc_chb_filt(i),
334 qcount => in_enc_8bit((3 - i) * 8 + 7 downto (3 - i) * 8),
339 ab_event => enc_pos_changed(i),
344 pwm_rgb1_block: for i in 2 downto 0 generate
347 duration_width_g => pwm_width
351 en_i => spi_transfer_ready,
353 trigger_i => pwm_cycle_start,
354 duration_i => output_led_rgb1(i * 8 + 7 downto i * 8),
355 q_out_o => pwm_rgb1_sig(i)
359 pwm_rgb2_block: for i in 2 downto 0 generate
362 duration_width_g => pwm_width
366 en_i => spi_transfer_ready,
368 trigger_i => pwm_cycle_start,
369 duration_i => output_led_rgb2(i * 8 + 7 downto i * 8),
370 q_out_o => pwm_rgb2_sig(i)
374 fsm_clk <= s00_axi_aclk;
375 fsm_rst <= not s00_axi_aresetn;
377 data_logic_process :process
379 wait until rising_edge (fsm_clk);
380 if fsm_rst = '1' then
381 spi_led_reset <= '1';
382 elsif spi_transfer_ready = '1' then
383 spi_led_reset <= '0';
387 spi_tx_data(47) <= '0';
388 spi_tx_data(46 downto 44) <= spi_out_rgb1;
389 spi_tx_data(43 downto 42) <= (others => '0');
390 spi_tx_data(41) <= spi_out_led4;
391 spi_tx_data(40) <= spi_out_led3;
392 spi_tx_data(39 downto 8) <= output_led_line;
393 spi_tx_data(7) <= '0';
394 spi_tx_data(6 downto 3) <= not output_kbd_direct;
395 spi_tx_data(2 downto 0) <= spi_out_rgb2;
397 enc_chb(1) <= not spi_rx_data(4);
398 enc_sw(1) <= not spi_rx_data(5);
399 enc_cha(1) <= not spi_rx_data(6);
401 enc_chb(2) <= not spi_rx_data(11);
402 enc_sw(2) <= not spi_rx_data(12);
403 enc_cha(2) <= not spi_rx_data(13);
405 enc_chb(3) <= not spi_rx_data(8);
406 enc_sw(3) <= not spi_rx_data(9);
407 enc_cha(3) <= not spi_rx_data(10);
409 in_kbd_direct <= not spi_rx_data(3 downto 0);
411 in_enc_buttons(2) <= enc_sw_filt(1);
412 in_enc_buttons(1) <= enc_sw_filt(2);
413 in_enc_buttons(0) <= enc_sw_filt(3);
415 -- in_enc_8bit <= (others => '0');
417 in_enc_direct <= (8 => enc_sw(1), 7 => enc_chb(1), 6 => enc_cha(1),
418 5 => enc_sw(2), 4 => enc_chb(2), 3 => enc_cha(2),
419 2 => enc_sw(3), 1 => enc_chb(3), 0 => enc_cha(3));
421 -- output_led_rgb1 : out std_logic_vector(23 downto 0);
422 -- output_led_rgb2 : out std_logic_vector(23 downto 0);
423 -- output_led_direct : out std_logic_vector(7 downto 0);
425 spi_out_rgb1 <= output_led_direct(2 downto 0) or pwm_rgb1_sig;
426 spi_out_rgb2 <= output_led_direct(5 downto 3) or pwm_rgb2_sig;
427 spi_out_led3 <= output_led_direct(6);
428 spi_out_led4 <= output_led_direct(7);