OpenCores
URL https://opencores.org/ocsvn/rs232_syscon/rs232_syscon/trunk

Subversion Repositories rs232_syscon

Compare Revisions

  • This comparison shows the changes necessary to convert path
    /
    from Rev 8 to Rev 7
    Reverse comparison

Rev 8 → Rev 7

/rs232_syscon/trunk/verilog/b13c_environment.zip Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream
rs232_syscon/trunk/verilog/b13c_environment.zip Property changes : Deleted: svn:mime-type ## -1 +0,0 ## -application/octet-stream \ No newline at end of property Index: rs232_syscon/trunk/verilog_doc/rs232_syscon.doc =================================================================== Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream Index: rs232_syscon/trunk/verilog_doc/rs232_syscon.doc =================================================================== --- rs232_syscon/trunk/verilog_doc/rs232_syscon.doc (revision 8) +++ rs232_syscon/trunk/verilog_doc/rs232_syscon.doc (nonexistent)
rs232_syscon/trunk/verilog_doc/rs232_syscon.doc Property changes : Deleted: svn:mime-type ## -1 +0,0 ## -application/octet-stream \ No newline at end of property Index: rs232_syscon/trunk/VHDL/syscon_vhdl_LED_strobe_2_with_ADC_altera_project.qar =================================================================== Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream Index: rs232_syscon/trunk/VHDL/syscon_vhdl_LED_strobe_2_with_ADC_altera_project.qar =================================================================== --- rs232_syscon/trunk/VHDL/syscon_vhdl_LED_strobe_2_with_ADC_altera_project.qar (revision 8) +++ rs232_syscon/trunk/VHDL/syscon_vhdl_LED_strobe_2_with_ADC_altera_project.qar (nonexistent)
rs232_syscon/trunk/VHDL/syscon_vhdl_LED_strobe_2_with_ADC_altera_project.qar Property changes : Deleted: svn:mime-type ## -1 +0,0 ## -application/octet-stream \ No newline at end of property Index: rs232_syscon/trunk/VHDL/uart_sqclk_pack.vhd =================================================================== --- rs232_syscon/trunk/VHDL/uart_sqclk_pack.vhd (revision 8) +++ rs232_syscon/trunk/VHDL/uart_sqclk_pack.vhd (nonexistent) @@ -1,716 +0,0 @@ --------------------------------------------------------------------------- --- Package of UART components --- --- This UART uses a squarewave input for the BAUDRATE clock. In other --- words, the BAUD rate is exactly the same as the frequency of the --- incoming clock. This is in contrast to other UARTs which need a --- Baud rate clock which is some multiple of the actual Baud rate --- desired. Because of the 1x nature of the Baud clock, the receiver --- needs at least one Baud Clock interval in which to measure the --- Baud clock versus the system clock, before it can start working. --- Also, the system clock must be somewhat higher than the Baud clock --- in order for the receiver to work. --- --- This package contains the UART, plus individual async_tx and async_rx --- modules, which are the transmit and receive sections of the UART. --- --- - -library IEEE; -use IEEE.STD_LOGIC_1164.ALL; -use IEEE.NUMERIC_STD.ALL; - -package uart_sqclk_pack is - - component uart_sqclk - port ( - - sys_rst_n : in std_logic; - sys_clk : in std_logic; - sys_clk_en : in std_logic; - - -- rate and parity - parity_i : in unsigned(1 downto 0); -- 0=none, 1=even, 2 or 3=odd - rate_clk_i : in std_logic; - - -- serial I/O - tx_stream : out std_logic; - rx_stream : in std_logic; - - --control and status - tx_wr_i : in std_logic; -- Starts Transmit - tx_dat_i : in unsigned(7 downto 0); - tx_done_o : out std_logic; - rx_restart_i : in std_logic; -- High clears error flags, clears rx_done_o - rx_dat_o : out unsigned(7 downto 0); - rx_wr_o : out std_logic; -- High pulse means store rx_dat_o. - rx_done_o : out std_logic; -- Remains high after receive, until clk edge with rx_restart_i=1 - frame_err_o : out std_logic; -- High = error. Reset when rx_restart_i asserted. - parity_err_o : out std_logic -- High = error. Reset when rx_restart_i asserted. - ); - end component; - - component async_tx_sqclk - port ( - - sys_rst_n : in std_logic; - sys_clk : in std_logic; - sys_clk_en : in std_logic; - - -- rate and parity - tx_parity_i : in unsigned(1 downto 0); -- 0=none, 1=even, 2 or 3=odd - tx_clk_i : in std_logic; - - -- serial output - tx_stream : out std_logic; - - -- control and status - tx_wr_i : in std_logic; -- Starts Transmit - tx_dat_i : in unsigned(7 downto 0); - tx_done_o : out std_logic - ); - end component; - - - component async_rx_sqclk - port ( - - sys_rst_n : in std_logic; - sys_clk : in std_logic; - sys_clk_en : in std_logic; - - -- rate and parity - rx_parity_i : in unsigned(1 downto 0); -- 0=none, 1=even, 2 or 3=odd - rx_clk_i : in std_logic; - - -- serial input - rx_stream : in std_logic; - - -- control and status - rx_restart_i : in std_logic; -- High clears error flags, clears rx_done_o - rx_dat_o : out unsigned(7 downto 0); - rx_wr_o : out std_logic; -- High pulse means store rx_dat_o. - rx_done_o : out std_logic; -- Remains high after receive, until rx_restart_i - frame_err_o : out std_logic; -- High = error. Reset when rx_restart_i asserted. - parity_err_o : out std_logic -- High = error. Reset when rx_restart_i asserted. - ); - end component; - -end uart_sqclk_pack; - -package body uart_sqclk_pack is -end uart_sqclk_pack; - - --------------------------------------------------------------------- --- UART. Variable Speed, RX Buffer, but no TX buffer --- High Speed Asynchronous Receiver & Transmitter --- --- Description: --- This block receives and transmits asynchronous serial bytes. The Baudrate --- and parity are selectable through inputs, but the number of bits per character --- is fixed at eight. --- --- NOTES: --- Transmit starts when tx_wr_i is detected high at a rising clock edge. --- Once the transmit operation is completed, tx_done_o latches high. --- --- The receive input is passed through two layers of synchronizing flip-flops --- to help mitigate metastability issues, since this signal can come from --- outside of the sys_clk clock domain. All other logic connecting to inputs --- of this function are assumed to be within the same clock domain. --- --- The receiver looks for a new start bit immediately following the rx_wr_o --- pulse, but rx_done_o is delayed until the expected end of the received --- character. If a new start bit is detected just prior to the expected end --- of the received character, then rx_done_o is not asserted. --- --- Receive begins when the falling edge of the start bit is detected. --- Then after 10 or 11 bit times have passed (depending on the parity setting) --- the rx_wr_o signal will pulse high for one clock period, indicating rx_dat_o --- contains valid receive data. The rx_wr_o pulse is only issued if there is --- no parity error, and the stop bit is actually detected high at the sampling --- time. --- The rx_dat_o outputs will hold the received data until the next rx_wr_o pulse. --- The rx_dat_o output provides the received data, even in the presence of a --- parity or stop-bit error. --- Error flags are valid during rx_wr_o, but they remain latched, until --- rx_restart_i. --- --- The Baud rate is equal to the frequency of the rate_clk_i input. --- It should be, as nearly as possible, a square wave of the desired --- communications rate. --- -library IEEE; -use IEEE.STD_LOGIC_1164.ALL; -use IEEE.NUMERIC_STD.ALL; - -entity uart_sqclk is - port ( - - sys_rst_n : in std_logic; - sys_clk : in std_logic; - sys_clk_en : in std_logic; - - -- rate and parity - parity_i : in unsigned(1 downto 0); -- 0=none, 1=even, 2 or 3=odd - rate_clk_i : in std_logic; - - -- serial I/O - tx_stream : out std_logic; - rx_stream : in std_logic; - - --control and status - tx_wr_i : in std_logic; -- Starts Transmit - tx_dat_i : in unsigned(7 downto 0); - tx_done_o : out std_logic; - rx_restart_i : in std_logic; -- High clears error flags, clears rx_done_o - rx_dat_o : out unsigned(7 downto 0); - rx_wr_o : out std_logic; -- High pulse means store rx_dat_o. - rx_done_o : out std_logic; -- Remains high after receive, until clk edge with rx_restart_i=1 - frame_err_o : out std_logic; -- High = error. Reset when rx_restart_i asserted. - parity_err_o : out std_logic -- High = error. Reset when rx_restart_i asserted. - ); -end uart_sqclk; - -library work; -use work.uart_sqclk_pack.all; - -architecture beh of uart_sqclk is - --- Components - -begin - - tx1: async_tx_sqclk - port map ( - sys_rst_n => sys_rst_n, - sys_clk => sys_clk, - sys_clk_en => sys_clk_en, - - -- rate and parity - tx_parity_i => parity_i, -- 0=none, 1=even, 2 or 3=odd - tx_clk_i => rate_clk_i, - - -- serial output - tx_stream => tx_stream, - - -- control and status - tx_wr_i => tx_wr_i, -- Starts Transmit - tx_dat_i => tx_dat_i, - tx_done_o => tx_done_o - ); - - rx1: async_rx_sqclk - port map ( - sys_rst_n => sys_rst_n, - sys_clk => sys_clk, - sys_clk_en => sys_clk_en, - - -- rate and parity - rx_parity_i => parity_i, -- 0=none, 1=even, 2 or 3=odd - rx_clk_i => rate_clk_i, - - -- serial input - rx_stream => rx_stream, - - -- control and status - rx_restart_i => rx_restart_i, -- High clears error flags, clears rx_done_o - rx_dat_o => rx_dat_o, - rx_wr_o => rx_wr_o, -- High pulse means store rx_dat_o. - rx_done_o => rx_done_o, -- Remains high after receive, until rx_restart_i - frame_err_o => frame_err_o, -- High = error. Reset when rx_restart_i asserted. - parity_err_o => parity_err_o -- High = error. Reset when rx_restart_i asserted. - ); - -end beh; - - -------------------------------------------------------------------------------- --- Asynchronous Receiver With Output Buffer -------------------------------------------------------------------------------- --- --- Author: John Clayton --- Date : Aug 05, 2013 Added this change log header, which was missing. --- Added first_edge signal to avoid erroneous initial --- baud interval measurement (John Clayton & Philip --- Kasavan) --- Jan. 2, 2014 Added output buffer, changed idle_prep to include --- the actual transition to IDLE state. Added --- POST_RECV state, so that the rx_done_o signal will --- reflect the true end of the received character. --- This helps in applications where a received --- asynchronous input is "echoed back" directly, --- as the rx_wr_o signal can be used to switch the --- signal at the correct time. --- Feb. 6, 2014 Added requirement for half_baud to be non-zero --- before leaving IDLE state. This prevents leaving --- IDLE due to falling edges prior to the first Baud --- interval measurement. --- --- Description -------------------------------------------------------------------------------- --- Squarewave tx_clk_i input determines rate. --- (tx_clk_i does not really need to be a squarewave. Only the rising edges --- are measured and used.) --- --- Description: --- This block receives asynchronous serial bytes. The Baudrate and parity --- are determined by inputs, but the number of bits per character is --- fixed at eight. --- --- NOTES: --- The receive input and baudrate clock are passed through two layers of --- synchronizing flip-flops to mitigate metastability, since those signals can --- originate outside of the sys_clk clock domain. All other logic connecting to --- input of this function are assumed to be within the same clock domain. --- --- The receiver looks for a new start bit immediately following the rx_wr_o --- pulse, but rx_done_o is delayed until the expected end of the received --- character. If a new start bit is detected just prior to the expected end --- of the received character, then rx_done_o is not asserted. --- --- Receive begins when the falling edge of the start bit is detected. --- Then after 10 or 11 bit times have passed (depending on the parity setting) --- the rx_wr_o signal will pulse high for one clock period, indicating rx_dat_o --- contains valid receive data. The rx_wr_o pulse is only issued if there is --- no parity error, and the stop bit is actually detected high at the sampling --- time. --- The rx_dat_o outputs will hold the received data until the next rx_wr_o pulse. --- The rx_dat_o output provides the received data, even in the presence of a --- parity or stop-bit error. --- Error flags are valid during rx_wr_o, but they remain latched, until --- rx_restart_i. --- --- Although the receiver immediately restarts itself to receive the next --- character, the rx_restart_i input can clear the error indicators. The rx_restart_i --- input is like a synchronous reset in this respect since it will cause a receive --- operation to abort. --- - -library IEEE; -use IEEE.STD_LOGIC_1164.ALL; -use IEEE.NUMERIC_STD.ALL; - -entity async_rx_sqclk is - port ( - - sys_rst_n : in std_logic; - sys_clk : in std_logic; - sys_clk_en : in std_logic; - - -- rate and parity - rx_parity_i : in unsigned(1 downto 0); -- 0=none, 1=even, 2 or 3=odd - rx_clk_i : in std_logic; - - -- serial input - rx_stream : in std_logic; - - -- control and status - rx_restart_i : in std_logic; -- High clears error flags, synchronously resets receiver - rx_dat_o : out unsigned(7 downto 0); - rx_wr_o : out std_logic; -- High pulse means store rx_dat_o. - rx_done_o : out std_logic; -- Indicates receiver is idle - frame_err_o : out std_logic; -- High = error. Reset when rx_restart_i asserted. - parity_err_o : out std_logic -- High = error. Reset when rx_restart_i asserted. - ); -end async_rx_sqclk; - -architecture beh of async_rx_sqclk is - - --- RX signals - -- rx_clk_i synchronizing flip-flops and rising edge detector -signal rx_clk_r1 : std_logic; -signal rx_clk_r2 : std_logic; - -- RX input synchronizing flip flops -signal rx_stream_r1 : std_logic; -signal rx_stream_r2 : std_logic; - -- RX signals - -- RX State Machine -type RX_STATE_TYPE is (IDLE, CHECK_START_1, CHECK_START_2, RECV_DATA, POST_RECV); -signal rx_state : RX_STATE_TYPE; -signal start_bit_start : std_logic; -- Signals falling edge of rx_stream_i -signal rx_sr : unsigned(8 downto 0); -- Shift register -signal rx_bcnt : unsigned(3 downto 0); -- Number of bits left, counts down -signal rx_bcnt_start : unsigned(3 downto 0); -- Total number of bits -signal rx_parity_good : std_logic; - -- Timers have been sized to hold baud interval for speeds as slow as 9600 bps at 100MHz sys_clk -signal rx_timer : unsigned(13 downto 0); -- Elapsed sys_clks from last bit time start -signal half_baud : unsigned(13 downto 0); -- One half of full_baud -signal full_baud : unsigned(13 downto 0); -- Baud interval, as measured from rx_clk_i -signal baud_timer : unsigned(13 downto 0); -- Used to measure baud interval -signal bit_sampled : std_logic; -- High indicates bit is already sampled, don't allow resampling. - -signal first_edge : std_logic; - -begin - - -- Synchronizing flip flops to avoid metastability issues... - rx_stream_syncproc: Process(sys_rst_n,sys_clk) - BEGIN - if (sys_rst_n = '0') then - rx_stream_r1 <= '1'; - rx_stream_r2 <= '1'; - elsif (sys_clk'event AND sys_clk='1') then - if (sys_clk_en='1') then - rx_stream_r2 <= rx_stream_r1; - rx_stream_r1 <= rx_stream; - end if; - end if; - END PROCESS rx_stream_syncproc; --- start_bit_start <= rx_stream_r2 and not rx_stream_r1; - -- This signal has been rewritten carefully to avoid "artifacts" which occur - -- during simulation, when rx_stream_r1 is 'X', in a manner reminiscent of - -- metastability. - start_bit_start <= '1' when rx_stream_r2='1' and rx_stream_r1/='1' else '0'; - - -- Synchronizing flip flops to avoid metastability issues... - rx_clk_syncproc: Process(sys_rst_n,sys_clk) - BEGIN - if (sys_rst_n = '0') then - rx_clk_r1 <= '0'; - rx_clk_r2 <= '0'; - elsif (sys_clk'event AND sys_clk='1') then - if (sys_clk_en='1') then - rx_clk_r2 <= rx_clk_r1; - rx_clk_r1 <= rx_clk_i; - end if; - end if; - END PROCESS rx_clk_syncproc; - - -- This is the baud interval measuring process. - -- Measurements are only made between rising edges - baud_measure_proc: Process(sys_rst_n,sys_clk) - BEGIN - if (sys_rst_n = '0') then - full_baud <= (others=>'0'); - baud_timer <= (others=>'0'); - first_edge <= '0'; - elsif (sys_clk'event AND sys_clk='1') then - if (sys_clk_en='1') then - if(first_edge = '1')then - if (rx_clk_r1='1' and rx_clk_r2='0') then - full_baud <= baud_timer; - baud_timer <= (others=>'0'); - else - baud_timer <= baud_timer+1; - end if; - elsif(rx_clk_r1='1' and rx_clk_r2='0') then - first_edge <= '1'; - end if; - end if; - end if; - END PROCESS baud_measure_proc; - - - -- This process handles the incoming bits - uart_rx_bits: Process(sys_rst_n,sys_clk) - - procedure idle_prep is - begin - rx_done_o <= '1'; - bit_sampled <= '0'; - rx_bcnt <= (others=>'0'); - rx_timer <= (others=>'0'); - rx_state <= IDLE; - end idle_prep; - - begin - if (sys_rst_n = '0') then - idle_prep; - rx_sr <= (others=>'0'); - frame_err_o <= '0'; - parity_err_o <= '0'; - rx_wr_o <= '0'; - rx_dat_o <= (others=>'0'); - elsif (sys_clk'event AND sys_clk='1') then - if (sys_clk_en='1') then - -- Default values - rx_wr_o <= '0'; -- Default to no data write - -- Handle incrementing the sample timer - rx_timer<=rx_timer+1; - -- State transitions - case rx_state is - - when IDLE => - rx_done_o <= '1'; -- Indicate receive is done. - bit_sampled <= '0'; -- Indicate bit is not yet sampled. - if (rx_restart_i='1') then - idle_prep; - frame_err_o <= '0'; -- At rx_restart, also clear error flags - parity_err_o <= '0'; - elsif (half_baud/=0 and start_bit_start='1') then - rx_timer <= (others=>'0'); -- Reset timer back to zero - rx_bcnt <= rx_bcnt_start; -- Initialize bit counter - rx_done_o <= '0'; - rx_state <= CHECK_START_1; - end if; - - when CHECK_START_1 => - if (rx_restart_i='1') then -- Restart has very high priority - idle_prep; - elsif (rx_stream_r2='1') then -- High during this time is an error - frame_err_o <= '1'; - idle_prep; - elsif (rx_timer>=half_baud) then -- Must use >= since threshold may change downward - rx_state <= CHECK_START_2; - end if; - - when CHECK_START_2 => -- During second half of start bit, don't verify low level - if (rx_restart_i='1') then -- Restart has very high priority - idle_prep; - elsif (rx_timer>=full_baud or rx_stream_r2='1') then -- Wait for end of start bit - rx_timer <= (others=>'0'); -- Reset timer back to zero - rx_state <= RECV_DATA; - end if; - - when RECV_DATA => - if (rx_restart_i='1') then -- Restart has very high priority - idle_prep; - elsif (rx_timer>=full_baud) then -- Must use >= since threshold may change downward - rx_timer <= (others=>'0'); -- Reset timer back to zero - bit_sampled <= '0'; - elsif (rx_timer>=half_baud and bit_sampled='0') then -- Must use >= since threshold may change downward - bit_sampled <= '1'; - if (rx_bcnt="0000") then - rx_state <= POST_RECV; - rx_dat_o <= rx_sr(7 downto 0); - if (rx_parity_good='1' and rx_stream_r2='1') then - rx_wr_o <= '1'; -- If all is correct, create a one clock long pulse to store rx_dat_o. - else - if (rx_stream_r2='0') then - frame_err_o <= '1'; -- Record error if there is a bad stop bit - end if; - if (rx_parity_good='0') then - parity_err_o <= '1'; -- Record error if there is bad parity - end if; - end if; - else -- Process a new bit - rx_sr(7 downto 0) <= rx_sr(8 downto 1); - if (rx_parity_i = "00") then - rx_sr(7) <= rx_stream_r2; -- Store the new incoming bit - else - rx_sr(8) <= rx_stream_r2; - end if; - rx_bcnt <= rx_bcnt-1; - end if; - end if; - - when POST_RECV => -- Wait out latter half of stop bit, checking for start bits... - if (rx_restart_i='1') then - bit_sampled <= '0'; - frame_err_o <= '0'; -- At rx_restart, also clear error flags - parity_err_o <= '0'; - idle_prep; - elsif (start_bit_start='1') then - bit_sampled <= '0'; - rx_timer <= (others=>'0'); -- Reset timer back to zero - rx_bcnt <= rx_bcnt_start; -- Initialize bit counter - rx_done_o <= '0'; - rx_state <= CHECK_START_1; - elsif (rx_timer>=full_baud) then -- Wait for end of start bit - bit_sampled <= '0'; -- Indicate bit is not yet sampled. - idle_prep; -- Asserts rx_done_o to indicate completion - end if; - - when others => null; - - end case; - end if; - end if; - end process uart_rx_bits; - - ------------------------- - -- Assign number of bits to shift in. - rx_bcnt_start <= "1000" when (rx_parity_i="00") else "1001"; - - ------------------------- - -- Assign half baud period - half_baud <= ('0' & full_baud(13 downto 1)); - - ------------------------- - -- Parity check process - rx_parity_check: process(rx_sr, rx_parity_i) - begin - if (rx_parity_i="00") then -- No parity... - rx_parity_good <= '1'; -- (always good.) - elsif (rx_parity_i="01") then -- Even parity... - rx_parity_good <= not (rx_sr(0) XOR rx_sr(1) XOR rx_sr(2) XOR rx_sr(3) XOR rx_sr(4) - XOR rx_sr(5) XOR rx_sr(6) XOR rx_sr(7) XOR rx_sr(8)); - else -- Odd parity... - rx_parity_good <= (rx_sr(0) XOR rx_sr(1) XOR rx_sr(2) XOR rx_sr(3) XOR rx_sr(4) - XOR rx_sr(5) XOR rx_sr(6) XOR rx_sr(7) XOR rx_sr(8)); - end if; - end process; - -end beh; - - -------------------------------------------------------------------------------- --- Asynchronous Transmitter With No Buffering -------------------------------------------------------------------------------- --- --- Author: John Clayton --- Date : Aug 08, 2013 Added this change log header, which was missing. --- Changed tx_done_o signal so that it pulses after --- the stop bit is finished. How could this have --- remained so woefully incorrect for so long?! --- Jan 02, 2014 Fixed a latent bug in the logic for asserting --- tx_done_o. Prior to this fix, it was possible --- for a write that was coincident with do_txbit to --- be ignored! Once again, how could this have --- remained so woefully incorrect all this time?! --- Jan 07, 2014 Rewrote the startup logic to allow for cases --- when tx_wr_i='1' and tx_bcnt="0000" and do_txbit='1' --- Also rewrote the tx_done_o signal so that it is --- asserted earlier - when "tx_almost_done" is high. --- This is all calculated to allow the transmitter --- to send characters back-to-back using its own --- tx_done_o signal as a tx_wr_i signal. This is --- actually getting pretty neat. The unit sends out --- asynchronous characters, but insists on doing it --- in synchronism with the tx_clk_i input... so it --- isn't really very asynchronous in that sense! --- --- Description -------------------------------------------------------------------------------- --- Squarewave tx_clk_i input determines rate. --- (tx_clk_i need not be a squarewave for this module, since only the rising --- edge is used. In the accompanying receiver, however, both edges are used.) --- --- Description: --- This block transmits asynchronous serial bytes. The Baudrate and parity --- are determined by inputs, but the number of bits per character is --- fixed at eight. --- --- NOTES: --- Transmit starts when the transmitter is idle and tx_wr_i is detected high --- at a rising sys_clk edge. --- --- Once the transmit operation is completed, done_o latches high. --- --- Since the baud clock might be asynchronous to the sys_clk, there are --- syncronizing flip-flops on it inside this module. - -library IEEE; -use IEEE.STD_LOGIC_1164.ALL; -use IEEE.NUMERIC_STD.ALL; - -entity async_tx_sqclk is - port ( - - sys_rst_n : in std_logic; - sys_clk : in std_logic; - sys_clk_en : in std_logic; - - -- rate and parity - tx_parity_i : in unsigned(1 downto 0); -- 0=none, 1=even, 2 or 3=odd - tx_clk_i : in std_logic; - - -- serial output - tx_stream : out std_logic; - - -- control and status - tx_wr_i : in std_logic; -- Starts Transmit - tx_dat_i : in unsigned(7 downto 0); - tx_done_o : out std_logic - ); -end async_tx_sqclk; - -architecture beh of async_tx_sqclk is - --- TX signals - -- TX clock synchronizing flip-flops and rising edge detection -signal tx_clk_r1 : std_logic; -signal tx_clk_r2 : std_logic; - -- TX clock enable, shift register and bit count -signal do_txbit : std_logic; -signal tx_sr : unsigned(9 downto 0); -signal tx_bcnt : unsigned(3 downto 0); -- Number of bits -signal tx_almost_done : std_logic; -signal tx_done : std_logic; - -begin - - -- This process detects the rising edge of tx_clk_i - tx_clk_edge_proc: Process(sys_rst_n,sys_clk) - BEGIN - if (sys_rst_n = '0') then - tx_clk_r1 <= '0'; - tx_clk_r2 <= '0'; - elsif (sys_clk'event AND sys_clk='1') then - if (sys_clk_en='1') then - tx_clk_r1 <= tx_clk_i; - tx_clk_r2 <= tx_clk_r1; - end if; - end if; - END PROCESS tx_clk_edge_proc; - do_txbit <= (tx_clk_r1 and not tx_clk_r2); -- rising edge detect - - -- This process loads the shift register, then counts as the bits transmit out. - byte_tx: Process(sys_rst_n,sys_clk) - BEGIN - if (sys_rst_n = '0') then - tx_sr <= (others=>'0'); - tx_bcnt <= (others=>'0'); - tx_stream <= '1'; - tx_done <= '1'; - elsif (sys_clk'event and sys_clk='1') then - if (sys_clk_en='1') then - -- Start a new transmission when ready - -- Case 1 is starting while do_txbit is high - if tx_bcnt="0000" and do_txbit='1' and tx_wr_i='1' then - tx_stream <= '0'; -- Provide start bit - tx_sr(7 downto 0) <= tx_dat_i; -- Load the TX data - tx_sr(8) <= '1'; -- Default the parity bit to one - if(tx_parity_i = "00") then --If no parity... - tx_bcnt <= "1001"; -- send start, 8 data bits, and stop - elsif (tx_parity_i = "01") then --If even parity... - tx_bcnt <= "1010"; -- send start, 8 data bits, parity, and stop - tx_sr(8) <= tx_dat_i(0) XOR tx_dat_i(1) XOR tx_dat_i(2) XOR tx_dat_i(3) XOR - tx_dat_i(4) XOR tx_dat_i(5) XOR tx_dat_i(6) XOR tx_dat_i(7); - else --If odd parity... - tx_bcnt <= "1011"; --send start, 8 data bits, parity, and stop - tx_sr(8) <= NOT (tx_dat_i(0) XOR tx_dat_i(1) XOR tx_dat_i(2) XOR tx_dat_i(3) XOR - tx_dat_i(4) XOR tx_dat_i(5) XOR tx_dat_i(6) XOR tx_dat_i(7)); - end if; - tx_done <= '0'; - -- Case 2 is starting while do_txbit is low - elsif tx_done='1' and tx_wr_i='1' then -- Only allow loads when transmitter is idle - tx_sr(0) <= '0'; -- Load start bit - tx_sr(8 downto 1) <= tx_dat_i; -- Load the TX data - tx_sr(9) <= '1'; -- Default the parity bit to one - if(tx_parity_i = "00") then --If no parity... - tx_bcnt <= "1010"; -- send start, 8 data bits, and stop - elsif (tx_parity_i = "01") then --If even parity... - tx_bcnt <= "1011"; -- send start, 8 data bits, parity, and stop - tx_sr(9) <= tx_dat_i(0) XOR tx_dat_i(1) XOR tx_dat_i(2) XOR tx_dat_i(3) XOR - tx_dat_i(4) XOR tx_dat_i(5) XOR tx_dat_i(6) XOR tx_dat_i(7); - else --If odd parity... - tx_bcnt <= "1011"; --send start, 8 data bits, parity, and stop - tx_sr(9) <= NOT (tx_dat_i(0) XOR tx_dat_i(1) XOR tx_dat_i(2) XOR tx_dat_i(3) XOR - tx_dat_i(4) XOR tx_dat_i(5) XOR tx_dat_i(6) XOR tx_dat_i(7)); - end if; - tx_done <= '0'; - -- Process through the remaining data - elsif(tx_bcnt>"0000" and do_txbit='1') then -- Still have bits to send? - tx_bcnt <= tx_bcnt-1; - tx_sr(8 downto 0) <= tx_sr(9 downto 1); -- Right shift the data (send LSB first) - tx_sr(9) <= '1'; - tx_stream <= tx_sr(0); - end if; - -- Assert tx_done when truly finished. - if tx_almost_done='1' and tx_wr_i='0' then - tx_done <= '1'; - end if; - end if; -- sys_clk_en - end if; -- sys_clk'event... - END PROCESS byte_tx; - - tx_almost_done <= '1' when (tx_done='0' and tx_bcnt="0000" and do_txbit='1') else '0'; - tx_done_o <= '1' when tx_done='1' or tx_almost_done='1' else '0'; - -end beh; - - Index: rs232_syscon/trunk/VHDL/async_syscon_pack.vhd =================================================================== --- rs232_syscon/trunk/VHDL/async_syscon_pack.vhd (revision 8) +++ rs232_syscon/trunk/VHDL/async_syscon_pack.vhd (nonexistent) @@ -1,1240 +0,0 @@ --------------------------------------------------------------------------- --- Package of async_syscon components --- - -library IEEE; -use IEEE.STD_LOGIC_1164.ALL; -use IEEE.NUMERIC_STD.ALL; - -package async_syscon_pack is - - -- A system controller with an 8-bit parallel ASCII interface - component ascii_syscon - generic ( - ADR_DIGITS : natural; -- # of hex digits for address - DAT_DIGITS : natural; -- # of hex digits for data - QTY_DIGITS : natural; -- # of hex digits for quantity - CMD_BUFFER_SIZE : natural; -- # of chars in the command buffer - WATCHDOG_VALUE : natural; -- # of sys_clks before ack is expected - DISPLAY_FIELDS : natural -- # of fields/line - ); - port ( - - sys_rst_n : in std_logic; - sys_clk : in std_logic; - sys_clk_en : in std_logic; - - -- Parallel ASCII I/O - cmd_char_i : in unsigned(7 downto 0); - cmd_we_i : in std_logic; - cmd_ack_o : out std_logic; - cmd_echo_o : out std_logic; - resp_char_o : out unsigned(7 downto 0); - resp_cyc_o : out std_logic; - resp_ack_i : in std_logic; - cmd_done_o : out std_logic; - - -- Master Bus IO - master_bg_i : in std_logic; - master_adr_i : in unsigned(4*ADR_DIGITS-1 downto 0); - master_dat_i : in unsigned(4*DAT_DIGITS-1 downto 0); - master_dat_o : out unsigned(4*DAT_DIGITS-1 downto 0); - master_stb_i : in std_logic; - master_we_i : in std_logic; - master_br_o : out std_logic; - - -- System Bus IO - ack_i : in std_logic; - err_i : in std_logic; - dat_i : in unsigned(4*DAT_DIGITS-1 downto 0); - dat_o : out unsigned(4*DAT_DIGITS-1 downto 0); - rst_o : out std_logic; - stb_o : out std_logic; - cyc_o : out std_logic; - adr_o : out unsigned(4*ADR_DIGITS-1 downto 0); - we_o : out std_logic - ); - end component; - - -- ascii_syscon mounted with a UART interface - component async_syscon - generic ( - ECHO_COMMANDS : natural; -- set nonzero to echo back command characters - ADR_DIGITS : natural; -- # of hex digits for address - DAT_DIGITS : natural; -- # of hex digits for data - QTY_DIGITS : natural; -- # of hex digits for quantity - CMD_BUFFER_SIZE : natural; -- # of chars in the command buffer - WATCHDOG_VALUE : natural; -- # of sys_clks before ack is expected - DISPLAY_FIELDS : natural -- # of fields/line - ); - port ( - - sys_rst_n : in std_logic; - sys_clk : in std_logic; - sys_clk_en : in std_logic; - - -- rate and parity - parity_i : in unsigned(1 downto 0); -- 0=none, 1=even, 2=odd - baud_clk_i : in std_logic; -- At 1x the desired baud rate, can be squarewave or pulses. - baud_lock_i : in std_logic; -- '1' Indicates baud clock is stable and ready. - - -- Serial IO - cmd_i : in std_logic; - resp_o : out std_logic; - cmd_done_o : out std_logic; - - -- Master Bus IO - master_bg_i : in std_logic; - master_adr_i : in unsigned(4*ADR_DIGITS-1 downto 0); - master_dat_i : in unsigned(4*DAT_DIGITS-1 downto 0); - master_dat_o : out unsigned(4*DAT_DIGITS-1 downto 0); - master_stb_i : in std_logic; - master_we_i : in std_logic; - master_br_o : out std_logic; - - -- System Bus IO - ack_i : in std_logic; - err_i : in std_logic; - dat_i : in unsigned(4*DAT_DIGITS-1 downto 0); - dat_o : out unsigned(4*DAT_DIGITS-1 downto 0); - rst_o : out std_logic; - stb_o : out std_logic; - cyc_o : out std_logic; - adr_o : out unsigned(4*ADR_DIGITS-1 downto 0); - we_o : out std_logic - ); - end component; - -end async_syscon_pack; - -package body async_syscon_pack is -end async_syscon_pack; - ---------------------------------------------------------------------------------------- --- --- Author: John Clayton --- Date : Dec. 27, 2013 --- Update: 12/27/13 copied async_syscon module, removed the serial interface. --- 02/05/14 Added line feed as a whitespace character, to --- char_is_whitespace. --- 02/06/14 Made resp_cyc a direct function of the state machine state. --- This allows it to be asserted even when resp_ack_i is tied --- to '1' all the time... --- 02/13/14 Made a slight enhancement to the processing of comments. --- Previously, all comments were treated as "full line" --- comments, causing any valid commands preceding the --- comment to be ignored, since the entire line was being --- ignored. I realized that a very small value --- check on cmd_ptr could differentiate between full line --- comments, and ones for which there might actually be --- a valid command. The enhanced design can process the --- valid commands. --- 02/14/14 Happy Valentine's Day! Fixed a "wacky" bug which caused --- an extra digit to be displayed for address and data fields. --- Added "0" command suffix, which prevents the bus address --- from incrementing during read, write and fill operations. --- It's useful for working with FIFOs that have read/write --- ports mapped to a single address, instead of a whole --- range of addresses. --- 02/27/14 Refined the CHECK_SUFFICES state by adding a jump to --- START_EXECUTION when ENTER_CHAR is found in the suffix --- position, thus preserving the "repeat last read with --- previous address and quantity" function. --- --- Description ---------------------------------------------------------------------------------------- --- This is an 8-bit parallel ASCII character driven interface to a system --- controller driving a "Wishbone" type of parallel system bus. --- --- Specifically, the unit allows the user to send text commands to the --- "ascii_syscon" unit, in order to generate read and write cycles on the --- Wishbone compatible bus. The command structure is quite terse and spartan --- in nature, this is for the sake of the logic itself. --- --- The command line buffer is small enough to be implemented without the use --- of dedicated BRAM memory blocks, and the menus and command responses were --- kept as small as possible. In most cases, the responses from the unit to --- the user consist of a "newline" and one or two visible characters. The --- command structure consists of the following commands and responses: --- --- Command Syntax Purpose --- --------------- --------------------------------------- --- w aaaa dddd dddd dddd... Write data items "dddd" starting at address "aaaa" --- using sequential addresses. --- (If the data field is missing, nothing is done). --- w0 aaaa dddd dddd dddd... Write data items "dddd" at address "aaaa" --- without incrementing the address. --- (If the data field is missing, nothing is done). --- f aaaa dddd xx "Fill": Write data "dddd" starting at address "aaaa" --- perform this "xx" times at sequential addresses. --- (The quantity field is optional, default is 1). --- f0 aaaa dddd xx "Fill": Write data "dddd" starting at address "aaaa" --- perform this "xx" times at the same address. --- (The quantity field is optional, default is 1). --- r aaaa xx Read data starting from address "aaaa." --- Perform this "xx" times at sequential addresses. --- (The quantity field is optional, default is 1). --- r0 aaaa xx Read data from address "aaaa." --- Perform this "xx" times, using the same address. --- (The quantity field is optional, default is 1). --- i Send a reset pulse to the system. (initialize). --- --- "Single Line" type Comment token. Characters --- after the token are ignored until . --- This enables applications which send --- files to the unit to include comments for --- display and as an aid to understanding. --- The comment token is a constant, change it --- to be whatever makes sense! --- --- Response from async_syscon Meaning --- -------------------------- --------------------------------------- --- OK Command received and performed. No errors. --- ? Command buffer full, without receiving "enter." --- C? Command not recognized. --- A? Address field syntax error. --- D? Data field syntax error. --- Q? Quantity field syntax error. --- ! No "ack_i", or else "err_i" received from bus. --- B! No "bg_i" received from master. --- --- NOTES on the operation of this unit: --- --- - The unit generates a command prompt which is "-> ". --- - Capitalization is not important. --- - Each command is terminated by the "enter" key (0x0d character). --- Commands are executed as soon as "enter" is received. --- - Trailing parameters need not be re-entered. Their values will --- remain the same as their previous settings. --- - Use of the backspace key is supported, so mistakes can be corrected. --- - The length of the command line is limited to a fixed number of --- characters, as configured by parameter. --- - Fields are separated by white space, including "tab" and/or "space" --- - All numerical fields are interpreted as hexadecimal numbers. --- Decimal is not supported. --- - Numerical field values are retained between commands. If a "r" is issued --- without any fields following it, the previous values will be used. A --- set of "quantity" reads will take place at sequential addresses. --- If a "f" is issued without any fields following it, the previous data --- value will be written "quantity" times at sequential addresses, starting --- from the next location beyond where the last command ended. --- - If the user does not wish to use "ack" functionality, simply tie the --- "ack_i" input to logic 1, and then the ! response will never be generated. --- - The data which is read in by the "r" command is displayed using lines --- which begin with the address, followed by the data fields. The number --- of data fields displayed per line (following the address) is adjustable --- by setting a parameter. No other display format adjustments can be made. --- - There is currently only a single watchdog timer. It begins to count at --- the time the "enter" is received to execute a command. If the bus is granted --- and the ack is received before the expiration of the timer, then the --- cycle will complete normally. Therefore, the watchdog timeout value --- needs to include time for the request and granting of the bus, in --- addition to the time needed for the actual bus cycle to complete. --- --- --- Currently, there is only a single indicator (stb_o) generated during bus --- output cycles which are generated from this unit. --- The user can easily implement decoding logic based upon adr_o and stb_o --- which would serve as multiple "stb_o" type signals for different cores --- which would be sharing the same bus. --- --- The data bus supported by this module is separate input/output type of bus. --- However, if a single tri-state dat_io bus is desired, it can be added --- to the module without too much trouble. Supposedly the only difference --- between the two forms of data bus is that one of them avoids using tri-state --- at the cost of doubling the number of interconnects used to carry data back --- and forth... Some people say that tri-state should be avoided for use --- in internal busses in ASICs. Maybe they are right. --- But in FPGAs tri-state seems to work pretty well, even for internal busses. --- --- Parameters are provided to configure the width of the different command --- fields. To simplify the logic for binary to hexadecimal conversion, these --- parameters allow adjustment in units of 1 hex digit, not anything smaller. --- If your bus has 10 bits, for instance, simply set the address width to 3 --- which produces 12 bits, and then just don't use the 2 msbs of address --- output. --- --- No support for the optional Wishbone "retry" (rty_i) input is provided at --- this time. --- No support for "tagn_o" bits is provided at this time, although a register --- might be added external to this module in order to implement to tag bits. --- No BLOCK or RMW cycles are supported currently, so cyc_o is equivalent to --- stb_o... --- The output busses are not tri-stated. The user may add tri-state buffers --- external to the module, using "stb_o" to enable the buffer outputs. --- ---------------------------------------------------------------------------------------- - -library IEEE; -use IEEE.STD_LOGIC_1164.ALL; -use IEEE.NUMERIC_STD.ALL; - -library work; -use work.function_pack.all; -use work.async_syscon_pack.all; - -entity ascii_syscon is - generic ( - ADR_DIGITS : natural := 4; -- # of hex digits for address - DAT_DIGITS : natural := 4; -- # of hex digits for data - QTY_DIGITS : natural := 2; -- # of hex digits for quantity - CMD_BUFFER_SIZE : natural := 32; -- # of chars in the command buffer - WATCHDOG_VALUE : natural := 200; -- # of sys_clks before ack is expected - DISPLAY_FIELDS : natural := 8 -- # of fields/line - ); - port ( - - sys_rst_n : in std_logic; - sys_clk : in std_logic; - sys_clk_en : in std_logic; - - -- Parallel ASCII I/O - cmd_char_i : in unsigned(7 downto 0); - cmd_we_i : in std_logic; - cmd_ack_o : out std_logic; - cmd_echo_o : out std_logic; - resp_char_o : out unsigned(7 downto 0); - resp_cyc_o : out std_logic; - resp_ack_i : in std_logic; - cmd_done_o : out std_logic; - - -- Master Bus IO - master_bg_i : in std_logic; - master_adr_i : in unsigned(4*ADR_DIGITS-1 downto 0); - master_dat_i : in unsigned(4*DAT_DIGITS-1 downto 0); - master_dat_o : out unsigned(4*DAT_DIGITS-1 downto 0); - master_stb_i : in std_logic; - master_we_i : in std_logic; - master_br_o : out std_logic; - - -- System Bus IO - ack_i : in std_logic; - err_i : in std_logic; - dat_i : in unsigned(4*DAT_DIGITS-1 downto 0); - dat_o : out unsigned(4*DAT_DIGITS-1 downto 0); - rst_o : out std_logic; - stb_o : out std_logic; - cyc_o : out std_logic; - adr_o : out unsigned(4*ADR_DIGITS-1 downto 0); - we_o : out std_logic - ); -end ascii_syscon; - -library IEEE; -use IEEE.STD_LOGIC_1164.ALL; -use IEEE.NUMERIC_STD.ALL; - -architecture beh of ascii_syscon is - --- Constants -constant CMD_PTR_BITS : natural := bit_width(CMD_BUFFER_SIZE); -constant DISPLAY_FIELD_COUNT_BITS : natural := bit_width(DISPLAY_FIELDS); -constant DISPLAY_ADR_DIGIT_COUNT_BITS : natural := bit_width(ADR_DIGITS); -constant DISPLAY_DAT_DIGIT_COUNT_BITS : natural := bit_width(DAT_DIGITS); -constant WATCHDOG_TIMER_BITS : natural := timer_width(WATCHDOG_VALUE); - -constant BACKSPACE_CHAR : unsigned := "00001000"; -constant ENTER_CHAR : unsigned := "00001101"; -constant COMMENT_CHAR : unsigned := "00100011"; -- '#' character ---constant COMMENT_CHAR : unsigned := "00101101"; -- '-' character - --- Internal signal declarations - -- For the state machine -type FSM_STATE_TYPE is (IDLE, SEND_WELCOME_STRING, SEND_OK, SEND_PROMPT, - CHECK_NEW_CHAR, SEND_CRLF, PARSE_ERR_INDICATOR_CRLF, - ERR_INDICATOR, BG_ERR_INDICATOR, SEND_QUESTION, - SCAN_CMD, CHECK_SUFFICES, SCAN_ADR_WHITESPACE, - GET_ADR_FIELD, SCAN_DAT_WHITESPACE, GET_DAT_FIELD, - SCAN_QTY_WHITESPACE, GET_QTY_FIELD, START_EXECUTION, - REQUEST_BUS, EXECUTE, DISPLAY_PREP, DISPLAY_ADR, - DISPLAY_SEPARATOR, DISPLAY_DAT, DISPLAY_SPACE, - DISPLAY_CRLF, POST_FILL_CYCLE); - -signal fsm_state : FSM_STATE_TYPE; - -signal watchdog_timer_done : std_logic; -- High when watchdog timer is expired -signal char_is_whitespace : std_logic; -- High when cmd_buffer[char_count] is whitespace. -signal char_is_num : std_logic; -- High when cmd_buffer[char_count] is 0..9 -signal char_is_a_f : std_logic; -- High when cmd_buffer[char_count] is a..f -signal char_is_hex : std_logic; -- High when cmd_buffer[char_count] is a hex char. -signal msg_pointer : unsigned(4 downto 0); -- Determines message position or address. -signal msg_select : unsigned(4 downto 0); -- selection of msg_pointer or display value -signal hex_digit : unsigned(3 downto 0); -- This is the digit to be stored. - -signal msg_char : unsigned(7 downto 0); -- Selected response message character. -signal comment_area : std_logic; - - -- For the buses -signal adr_ptr : unsigned(4*ADR_DIGITS-1 downto 0); -- = adr_sr + adr_offset - -signal stb_l : std_logic; -- "local" stb signal (to distinguish from stb_o) -signal we_l : std_logic; -- "local" we signal (to distinguish from we_o) - -signal display_adr_sr : unsigned(4*ADR_DIGITS-1 downto 0); -- sr for printing addresses -signal adr_sr : unsigned(4*ADR_DIGITS-1 downto 0); -- "nibble" shift register -signal dat_sr : unsigned(4*DAT_DIGITS-1 downto 0); -- "nibble" shift register -signal qty_sr : unsigned(4*QTY_DIGITS-1 downto 0); -- "nibble" shift register - --- The command register has these values -type CMD_REG_TYPE is (INIT, READ, FILL, WRITE); -signal command : CMD_REG_TYPE; - - -- For the command buffer -signal cmd_ptr : unsigned(CMD_PTR_BITS-1 downto 0); -- Offset from start of command. ---signal rd_cmd_ptr : unsigned(CMD_PTR_BITS-1 downto 0); -- Latched cmd_ptr, use to infer BRAM. -type cmd_array_type is - array (integer range 0 to CMD_BUFFER_SIZE-1) of unsigned(7 downto 0); - -signal cmd_buffer : cmd_array_type; -signal cmd_char : unsigned(7 downto 0); -signal lc_cmd_char : unsigned(7 downto 0); -- Lowercase version of cmd_char -signal adr_offset : unsigned(4*QTY_DIGITS-1 downto 0); -- counts from 0 to qty_sr -signal adr_freeze : std_logic; -- When set, prevents adr_offset from incrementing - -signal resp_cyc : std_logic; -- high for response type states -signal resp_cyc_l : std_logic; -signal resp_cyc_mask : std_logic; -- Used to lower resp_cyc_o for one clock cycle, upon acknowledgement. - - -- For various counters -signal display_field_count : unsigned(DISPLAY_FIELD_COUNT_BITS-1 downto 0); -- "fields displayed" -signal display_adr_digit_count : unsigned(DISPLAY_ADR_DIGIT_COUNT_BITS-1 downto 0); -- "digits displayed" -signal display_dat_digit_count : unsigned(DISPLAY_DAT_DIGIT_COUNT_BITS-1 downto 0); -- "digits displayed" -signal watchdog_timer_count : unsigned(WATCHDOG_TIMER_BITS-1 downto 0); - ----------------------------------------------------------------------------- --- Component Declarations ----------------------------------------------------------------------------- - ----------------------------------------------------------------------------- -begin - --- In this module, command characters are accepted immediately but only when in the CHECK_NEW_CHAR state. -cmd_ack_o <= '1' when cmd_we_i='1' and fsm_state=CHECK_NEW_CHAR else '0'; - --- Provide response character cycle active signal -resp_cyc <= '1' when fsm_state=DISPLAY_CRLF or - fsm_state=DISPLAY_SPACE or - fsm_state=DISPLAY_DAT or - fsm_state=DISPLAY_SEPARATOR or - fsm_state=DISPLAY_ADR or - fsm_state=SEND_QUESTION or - fsm_state=ERR_INDICATOR or - fsm_state=PARSE_ERR_INDICATOR_CRLF or - fsm_state=BG_ERR_INDICATOR or - fsm_state=SEND_CRLF or - fsm_state=SEND_PROMPT or - fsm_state=SEND_OK or - fsm_state=SEND_WELCOME_STRING else - '0'; --- Implement the "courtesy" of lowering resp_cyc_o for one cycle after resp_ack_i is recognized. --- This increases the amount of time needed for data transfer, and some would say it is needless, --- since a "burst" type transfer also can work. Since burst transfers were not intended here, --- this is being done anyway. You see, burst transfers can "tie up" bus arbiters for the entire --- burst, which is not desirable in this design. -resp_cyc_l <= '1' when resp_cyc='1' and resp_cyc_mask='0' else '0'; -resp_cyc_o <= resp_cyc_l; - -resp_cyc_mask_proc : process(sys_clk,sys_rst_n) -variable i : natural; -begin - if (sys_rst_n='0') then - resp_cyc_mask <= '0'; - elsif (sys_clk'event and sys_clk='1') then - if (sys_clk_en='1') then - resp_cyc_mask <= '0'; -- Default value - if (resp_cyc_l='1' and resp_ack_i='1') then - resp_cyc_mask <= '1'; - end if; - end if; - end if; -end process; - - --- Provide command echo indication, to allow ASCII response data to be --- echoed or not, as desired. -cmd_echo_o <= '1' when fsm_state=CHECK_NEW_CHAR else '0'; - --- Provide parallel ASCII response data -resp_char_o <= msg_char; - --- Select which bus signals get used on the system bus -adr_o <= adr_ptr when (master_bg_i='1') else master_adr_i; -we_o <= we_l when (master_bg_i='1') else master_we_i; -stb_o <= stb_l when (master_bg_i='1') else master_stb_i; -cyc_o <= stb_l when (master_bg_i='1') else master_stb_i; -- Separate cyc_o is not yet supported! - -dat_o <= dat_sr when (master_bg_i='1' and we_l='1' and stb_l='1') else master_dat_i; -master_dat_o <= dat_i; - --- This forms the adress pointer which is used on the bus. -adr_ptr <= adr_sr + adr_offset when adr_freeze='0' else adr_sr; - --- This is the ROM for the ASCII characters to be transmitted. --- Choose which value to use -msg_select <= '0' & display_adr_sr(4*ADR_DIGITS-1 downto 4*(ADR_DIGITS-1)) when fsm_state=DISPLAY_ADR else - '0' & dat_sr(4*DAT_DIGITS-1 downto 4*(DAT_DIGITS-1)) when fsm_state=DISPLAY_DAT else - msg_pointer; -with (msg_select) select - msg_char <= - "00110000" when "00000", -- "0"; -- Hexadecimal characters - "00110001" when "00001", -- "1"; - "00110010" when "00010", -- "2"; - "00110011" when "00011", -- "3"; - "00110100" when "00100", -- "4"; - "00110101" when "00101", -- "5"; - "00110110" when "00110", -- "6"; - "00110111" when "00111", -- "7"; - "00111000" when "01000", -- "8"; - "00111001" when "01001", -- "9"; - "01000001" when "01010", -- "A"; -- Address error indication - "01000010" when "01011", -- "B"; - "01000011" when "01100", -- "C"; -- Command error indication - "01000100" when "01101", -- "D"; -- Data error indication - "01000101" when "01110", -- "E"; - "01000110" when "01111", -- "F"; - "00100000" when "10000", -- " "; -- Space - "00111010" when "10001", -- ":"; -- Colon - "00100000" when "10010", -- " "; -- Space - "00111111" when "10011", -- "?"; -- Parse error indication - "00100001" when "10100", -- "!"; -- ack_i/err_i error indication - "01001111" when "10101", -- "O"; -- "All is well" message - "01001011" when "10110", -- "K"; - "00001101" when "10111", -- Carriage Return - "00001010" when "11000", -- Line Feed - "00101101" when "11001", -- "-"; -- Command Prompt - "00111110" when "11010", -- ">"; - "00100000" when "11011", -- " "; - "01010001" when "11100", -- "Q"; -- Quantity error indication - "01011000" when others; -- "X"; - --- This is state machine m1. It handles receiving the command line, including --- backspaces, and prints error/response messages. It also parses and --- executes the commands. - --- State register -fsm_proc : process(sys_clk, sys_rst_n) - - procedure exec_prep is - begin - if (adr_offset=qty_sr) then - msg_pointer <= "10101"; -- Address of message - fsm_state <= SEND_OK; - else - watchdog_timer_count <= (others=>'0'); -- Reset the timer. - fsm_state <= EXECUTE; - end if; - end exec_prep; - -begin - if (sys_rst_n='0') then -- asynchronous reset - rst_o <= '0'; - fsm_state <= IDLE; - command <= INIT; - msg_pointer <= (others=>'0'); - cmd_ptr <= (others=>'0'); - adr_offset <= (others=>'0'); - adr_freeze <= '0'; - adr_sr <= (others=>'0'); - dat_sr <= (others=>'0'); - qty_sr <= to_unsigned(1,qty_sr'length); -- Set qty = 1 default. - display_field_count <= (others=>'0'); - display_adr_digit_count <= (others=>'0'); - display_dat_digit_count <= (others=>'0'); - watchdog_timer_count <= (others=>'0'); - display_adr_sr <= (others=>'0'); - cmd_done_o <= '0'; - comment_area <= '0'; - elsif (sys_clk'event and sys_clk='1') then - if (sys_clk_en='1') then - - -- Handle the Watchdog timer - if (watchdog_timer_done='0') then - watchdog_timer_count <= watchdog_timer_count+1; - end if; - - -- Default values for outputs. The individual states can override these. - rst_o <= '0'; - cmd_done_o <= '0'; - - case (fsm_state) is - - when IDLE => - msg_pointer <= (others=>'0'); - fsm_state <= SEND_WELCOME_STRING; - - when SEND_WELCOME_STRING => - if (resp_cyc_l='1' and resp_ack_i='1') then - if (msg_pointer=15) then -- Send initial string ("0123456789ABCDEF") - msg_pointer <= "10111"; -- Address of the message - fsm_state <= SEND_PROMPT; - else - msg_pointer <= msg_pointer+1; - end if; - end if; - - when SEND_OK => - if (resp_cyc_l='1' and resp_ack_i='1') then - if (msg_pointer=22) then -- Send 2 characters... - msg_pointer <= "10111"; -- Address of the message - fsm_state <= SEND_PROMPT; - else - msg_pointer <= msg_pointer+1; - end if; - end if; - - when SEND_PROMPT => - if (resp_cyc_l='1' and resp_ack_i='1') then - if (msg_pointer=27) then -- Send 5 characters... - cmd_ptr <= (others=>'0'); - cmd_done_o <= '1'; - fsm_state <= CHECK_NEW_CHAR; - else - msg_pointer <= msg_pointer+1; - end if; - end if; - - -- This state always leads to activating the parser... - when SEND_CRLF => - if (resp_cyc_l='1' and resp_ack_i='1') then - if (msg_pointer=24) then -- Send 2 characters... - cmd_ptr <= (others=>'0'); - fsm_state <= SCAN_CMD; - else - msg_pointer <= msg_pointer+1; - end if; - end if; - - when CHECK_NEW_CHAR => - if (cmd_we_i='1') then - if (cmd_char_i=BACKSPACE_CHAR) then - cmd_ptr <= cmd_ptr-1; -- This effectively eliminates the last char - elsif (comment_area='0' and cmd_char_i=ENTER_CHAR) or (cmd_ptr=CMD_BUFFER_SIZE-1) then - if (cmd_char_i=ENTER_CHAR) then - msg_pointer <= "10111"; -- Address of the message - fsm_state <= SEND_CRLF; - end if; - if (cmd_ptr=CMD_BUFFER_SIZE-1) then - msg_pointer <= "10111"; -- Address of the message. - cmd_ptr <= (others=>'0'); - fsm_state <= PARSE_ERR_INDICATOR_CRLF; - end if; - elsif (cmd_char_i=COMMENT_CHAR) then - comment_area <= '1'; -- Activate comment area, which stores characters, but does not advance cmd_ptr. - elsif (comment_area='0') then - cmd_ptr <= cmd_ptr+1; - end if; - -- Deactivate comment area at end of line - if (comment_area='1' and cmd_char_i=ENTER_CHAR) then - comment_area <= '0'; - -- Check if a valid command might have preceded the comment - if (cmd_ptr>1) then - msg_pointer <= "10111"; -- Address of the message - fsm_state <= SEND_CRLF; - else - msg_pointer <= "10111"; -- Address of the message - fsm_state <= SEND_PROMPT; - end if; - end if; - end if; - - when BG_ERR_INDICATOR => - if (resp_cyc_l='1' and resp_ack_i='1') then - msg_pointer <= "10100"; -- Address of the error message - fsm_state <= ERR_INDICATOR; - end if; - - -- This state is used when the line is too long... - when PARSE_ERR_INDICATOR_CRLF => - if (resp_cyc_l='1' and resp_ack_i='1') then - if (msg_pointer=24) then -- Send 2 characters... - msg_pointer <= "10011"; -- Address of the message. - fsm_state <= ERR_INDICATOR; - else - msg_pointer <= msg_pointer+1; - end if; - end if; - - when ERR_INDICATOR => - if (resp_cyc_l='1' and resp_ack_i='1') then - msg_pointer <= "10111"; -- Address of the message - fsm_state <= SEND_PROMPT; - end if; - - when SEND_QUESTION => - if (resp_cyc_l='1' and resp_ack_i='1') then - msg_pointer <= "10011"; -- Address of the message. - fsm_state <= ERR_INDICATOR; - end if; - - -- The following states are for parsing and executing the command. - - -- This state takes care of leading whitespace before the command - when SCAN_CMD => - cmd_ptr <= cmd_ptr+1; - adr_offset <= (others=>'0'); - case (lc_cmd_char) is - when "01110010" => -- "r" - command <= READ; - fsm_state <= CHECK_SUFFICES; - when "01110111" => -- "w" - command <= WRITE; - qty_sr <= (others=>'1'); -- Limit writes to the max. qty... - fsm_state <= CHECK_SUFFICES; - when "01101001" => -- "i" - command <= INIT; - qty_sr <= (others=>'0'); - rst_o <= '1'; -- Actually do this one right now!! - fsm_state <= START_EXECUTION; - when "01100110" => -- "f" - command <= FILL; - fsm_state <= CHECK_SUFFICES; - when others => - if (char_is_whitespace='0') then - msg_pointer <= "01100"; -- Address of message - fsm_state <= SEND_QUESTION; - end if; - end case; - - -- This state cleverly detects command "suffix" modifiers, such - -- as the '0' modifier, which causes the address to remain frozen. - -- Invalid or unimplemented suffix modifiers elicit the "C?" response. - when CHECK_SUFFICES => -- Should that read "check suffixes" Hmmm... - if (cmd_char="00110000") then -- '0' suffix - cmd_ptr <= cmd_ptr+1; - adr_freeze <= '1'; - fsm_state <= SCAN_ADR_WHITESPACE; - elsif (cmd_char=ENTER_CHAR) then - fsm_state <= START_EXECUTION; -- Using last values - elsif (char_is_whitespace='1') then - adr_freeze <= '0'; - fsm_state <= SCAN_ADR_WHITESPACE; - else - msg_pointer <= "01100"; -- Address of message - fsm_state <= SEND_QUESTION; - end if; - - - -- The only way to determine the end of a valid field is to find - -- whitespace. Therefore, char_is_whitespace must be used as an exit - -- condition from the "get_xxx_field" states. So, this state is used to - -- scan through any leading whitespace prior to the first field. - when SCAN_ADR_WHITESPACE => - if (char_is_whitespace='1') then - cmd_ptr <= cmd_ptr+1; - elsif (cmd_char=ENTER_CHAR) then - fsm_state <= START_EXECUTION; -- Using last values - else - fsm_state <= GET_ADR_FIELD; - adr_sr <= (others=>'0'); - end if; - - when GET_ADR_FIELD => - if (char_is_hex='1') then - adr_sr <= adr_sr(4*(ADR_DIGITS-1)-1 downto 0) & hex_digit; - cmd_ptr <= cmd_ptr+1; - elsif (char_is_whitespace='1') then -- Normal exit - fsm_state <= SCAN_DAT_WHITESPACE; - elsif (cmd_char=ENTER_CHAR and command=READ) then - fsm_state <= START_EXECUTION; -- Using last values - else - msg_pointer <= "01010"; -- Address of message - fsm_state <= SEND_QUESTION; - end if; - - when SCAN_DAT_WHITESPACE => - -- There is no DAT field for reads, so skip it. - if (command=READ) then - fsm_state <= SCAN_QTY_WHITESPACE; - elsif (char_is_whitespace='1') then - cmd_ptr <= cmd_ptr+1; - elsif (cmd_char=ENTER_CHAR) then - if (command=WRITE) then -- Writing data values done, finish. - msg_pointer <= "10101"; -- Address of message - fsm_state <= SEND_OK; - else - fsm_state <= START_EXECUTION; -- Using last DATA & QTY values - end if; - else - fsm_state <= GET_DAT_FIELD; - dat_sr <= (others=>'0'); - end if; - - when GET_DAT_FIELD => - if (char_is_hex='1') then - dat_sr <= dat_sr(4*(DAT_DIGITS-1)-1 downto 0) & hex_digit; - cmd_ptr <= cmd_ptr+1; - elsif (char_is_whitespace='1') then -- Normal exit - if (command=WRITE) then - fsm_state <= START_EXECUTION; - else - fsm_state <= SCAN_QTY_WHITESPACE; - end if; - elsif (cmd_char=ENTER_CHAR) then - fsm_state <= START_EXECUTION; - else - msg_pointer <= "01101"; -- Address of message - fsm_state <= SEND_QUESTION; - end if; - - when SCAN_QTY_WHITESPACE => - if (char_is_whitespace='1') then - cmd_ptr <= cmd_ptr+1; - elsif (cmd_char=ENTER_CHAR) then - fsm_state <= START_EXECUTION; -- Using last values - else - fsm_state <= GET_QTY_FIELD; - qty_sr <= to_unsigned(0,qty_sr'length); - end if; - - when GET_QTY_FIELD => - if (char_is_hex='1') then - qty_sr <= qty_sr(4*(QTY_DIGITS-1)-1 downto 0) & hex_digit; - cmd_ptr <= cmd_ptr+1; - elsif (char_is_whitespace='1' or cmd_char=ENTER_CHAR) then -- Normal exit - fsm_state <= START_EXECUTION; - else - msg_pointer <= "11100"; -- Address of message - fsm_state <= SEND_QUESTION; - end if; - - -- This state seeks to obtain master_bg_i, which grants the bus for use. - when START_EXECUTION => - watchdog_timer_count <= (others=>'0'); -- Reset the timer. - display_adr_sr <= adr_ptr; - display_field_count <= (others=>'0'); - if (master_bg_i='1') then -- skip REQUEST_BUS if it is already granted! - exec_prep; - else - fsm_state <= REQUEST_BUS; - end if; - - when REQUEST_BUS => - if (master_bg_i='1') then - exec_prep; -- resets watchdog, sends "OK" if done. - elsif (watchdog_timer_done='1') then - msg_pointer <= "01011"; -- Address of messsage - fsm_state <= BG_ERR_INDICATOR; - end if; - - -- This single state does fill/write/read depending upon the value - -- contained in "command"! - when EXECUTE => - if (watchdog_timer_done='1' or err_i='1') then - fsm_state <= BG_ERR_INDICATOR; - elsif (ack_i='1') then - case command is - when READ => - dat_sr <= dat_i; -- Capture the read data - display_adr_sr <= adr_ptr; - fsm_state <= DISPLAY_PREP; - when WRITE => - adr_offset <= adr_offset+1; - fsm_state <= SCAN_DAT_WHITESPACE; -- Continue to next data value - when FILL => - adr_offset <= adr_offset+1; - fsm_state <= POST_FILL_CYCLE; - when others => - fsm_state <= POST_FILL_CYCLE; - end case; - end if; - - when POST_FILL_CYCLE => - exec_prep; -- resets watchdog, sends "OK" if done. - - when DISPLAY_PREP => - adr_offset <= adr_offset+1; - if (display_field_count = 0) then -- Check to see if address display is needed yet. - msg_pointer <= '0' & display_adr_sr(4*ADR_DIGITS-1 downto 4*(ADR_DIGITS-1)); - display_adr_digit_count <= (others=>'0'); - display_adr_sr <= adr_ptr; - fsm_state <= DISPLAY_ADR; -- Leads to a new address line. - else - display_dat_digit_count <= (others=>'0'); - msg_pointer <= '0' & dat_sr(4*DAT_DIGITS-1 downto 4*(DAT_DIGITS-1)); - fsm_state <= DISPLAY_DAT; - end if; - - when DISPLAY_ADR => - if (resp_cyc_l='1' and resp_ack_i='1') then - if (display_adr_digit_count = ADR_DIGITS-1) then - msg_pointer <= "10000"; -- Address of the message - fsm_state <= DISPLAY_SEPARATOR; - else - display_adr_sr <= display_adr_sr(4*(ADR_DIGITS-1)-1 downto 0) & to_unsigned(0,4); - display_adr_digit_count <= display_adr_digit_count+1; - end if; - end if; - - when DISPLAY_SEPARATOR => - if (resp_cyc_l='1' and resp_ack_i='1') then - msg_pointer <= msg_pointer+1; - if (msg_pointer = 18) then -- Three characters - display_dat_digit_count <= (others=>'0'); - msg_pointer <= '0' & dat_sr(4*DAT_DIGITS-1 downto 4*(DAT_DIGITS-1)); - fsm_state <= DISPLAY_DAT; - end if; - end if; - - when DISPLAY_DAT => - if (resp_cyc_l='1' and resp_ack_i='1') then - if ( - (display_dat_digit_count = DAT_DIGITS-1) - and (display_field_count = DISPLAY_FIELDS-1) - ) - then - msg_pointer <= "10111"; -- Address of the message - fsm_state <= DISPLAY_CRLF; - display_field_count <= (others=>'0'); - elsif (display_dat_digit_count = DAT_DIGITS-1) then - msg_pointer <= "10000"; -- Address of the message - fsm_state <= DISPLAY_SPACE; - display_field_count <= display_field_count+1; - else - dat_sr <= dat_sr(4*(DAT_DIGITS-1)-1 downto 0) & hex_digit; - display_dat_digit_count <= display_dat_digit_count+1; - end if; - end if; - - when DISPLAY_SPACE => - if (resp_cyc_l='1' and resp_ack_i='1') then - exec_prep; -- resets watchdog, sends "OK" if done. - end if; - - when DISPLAY_CRLF => - if (resp_cyc_l='1' and resp_ack_i='1') then - msg_pointer <= msg_pointer+1; - if (msg_pointer=24) then -- Two characters - exec_prep; -- resets watchdog, sends "OK" if done. - end if; - end if; - - --when others => - -- fsm_state <= IDLE; - end case; - - end if; -- sys_clk_en - end if; -- sys_clk -end process; - --- Assert needed outputs during execution of bus cycles -master_br_o <= '1' when (fsm_state=REQUEST_BUS or fsm_state=EXECUTE) else '0'; -we_l <= '1' when (fsm_state=EXECUTE and (command=WRITE or command=FILL)) else '0'; -stb_l <= '1' when (fsm_state=EXECUTE) else '0'; - - --- This is the command buffer writing section -ram_proc : process(sys_clk,sys_rst_n) -variable i : natural; -begin - if (sys_rst_n='0') then - -- synthesis translate_off - -- The initialization of the command buffer is for convenience in simulation only. - -- It can be removed for synthesis. - for i in 0 to CMD_BUFFER_SIZE-1 loop - cmd_buffer(i) <= (others=>'0'); - end loop; - -- synthesis translate_on - elsif (sys_clk'event and sys_clk='1') then - if (sys_clk_en='1') then - if (cmd_we_i='1' and fsm_state=CHECK_NEW_CHAR) then - cmd_buffer(to_integer(cmd_ptr)) <= cmd_char_i; - end if; - -- Latch the command pointer, for synchronous reads. - --rd_cmd_ptr <= cmd_ptr; -- Use this to infer BRAM. - end if; - end if; -end process; - --- This is the command buffer reading section -cmd_char <= cmd_buffer(to_integer(cmd_ptr)); -- Asynchronous read. Amazingly, this was the better option in XC2S200E... ---cmd_char <= cmd_buffer(to_integer(rd_cmd_ptr)); -- Synchronous read, use this to infer BRAM. -lc_cmd_char <= (cmd_char or "00100000"); -- lowercase - --- These assigments are for detecting whether the cmd_char is --- anything of special interest. -char_is_whitespace <= '1' when ((cmd_char=16#20#) -- space - or (cmd_char=16#09#) -- tab - or (cmd_char=16#0A#) -- line feed - ) else '0'; -char_is_num <= '1' when ((cmd_char>=16#30#) and (cmd_char<=16#39#)) else '0'; -char_is_a_f <= '1' when ((lc_cmd_char>=16#61#) and (lc_cmd_char<=16#66#)) else '0'; -char_is_hex <= char_is_num or char_is_a_f; - -hex_digit <= cmd_char(3 downto 0) when char_is_num='1' else (cmd_char(3 downto 0)+"1001"); - -watchdog_timer_done <= '1' when (watchdog_timer_count=WATCHDOG_VALUE) else '0'; - -end beh; - - ---------------------------------------------------------------------------------------- --- --- Author: John Clayton --- Date : Nov. 20, 2009 --- Update: 11/20/09 copied this file from rs232_syscon.v Began translating. --- 10/04/11 Removed msg_offset+msg_base adder, in a bid to --- increase max operating speed of this module. --- Combined CMD_ERR_INDICATOR, ADR_ERR_INDICATOR, --- DAT_ERR_INDICATOR, and QTY_ERR_INDICATOR --- into a single state : SEND_QUESTION --- Combined ACK_ERR_INDICATOR and PARSE_ERR_INDICATOR --- into a single state : ERR_INDICATOR --- 08/03/13 Removed rs232_tx_active_o, since it appears to be a --- vestigial relic of a time long ago when the echoing of --- command characters was done through the UART, and not --- directly as it is now. It was staying high all the --- time except for brief pulses low during generated --- responses... which is not useful. --- 08/03/13 Added "cmd_done_o" output pulse, which helps outside --- serial command generators know when to begin generating --- the next command. Removed the "rs232_" prefix from --- signal names, since the signals really aren't at RS232 --- levels. --- 08/03/13 Changed module and packet name to replace "rs232_" --- with "async_" --- 08/07/13 Added logic to include a "single line" type of comment --- which allows initialization strings and messages to --- include comments, which are echoed back over the --- interface for the user to perhaps see. --- --- Description ---------------------------------------------------------------------------------------- --- This module takes an "ascii_syscon" unit and adds an asynchronous serial --- interface to it. --- --- For details of command and response syntax, please refer to the ascii_syscon --- description. --- ---------------------------------------------------------------------------------------- - -library IEEE; -use IEEE.STD_LOGIC_1164.ALL; -use IEEE.NUMERIC_STD.ALL; -use IEEE.MATH_REAL.ALL; - -library work; -use work.function_pack.all; -use work.uart_sqclk_pack.all; -use work.async_syscon_pack.all; - -entity async_syscon is - generic ( - ECHO_COMMANDS : natural := 1; -- set nonzero to echo back command characters - ADR_DIGITS : natural := 4; -- # of hex digits for address - DAT_DIGITS : natural := 4; -- # of hex digits for data - QTY_DIGITS : natural := 2; -- # of hex digits for quantity - CMD_BUFFER_SIZE : natural := 32; -- # of chars in the command buffer - WATCHDOG_VALUE : natural := 200; -- # of sys_clks before ack is expected - DISPLAY_FIELDS : natural := 8 -- # of fields/line - ); - port ( - - sys_rst_n : in std_logic; - sys_clk : in std_logic; - sys_clk_en : in std_logic; - - -- rate and parity - parity_i : in unsigned(1 downto 0); -- 0=none, 1=even, 2=odd - baud_clk_i : in std_logic; -- At 1x the desired baud rate, can be squarewave or pulses. - baud_lock_i : in std_logic; -- '1' Indicates baud clock is stable and ready. - - -- Serial IO - cmd_i : in std_logic; - resp_o : out std_logic; - cmd_done_o : out std_logic; - - -- Master Bus IO - master_bg_i : in std_logic; - master_adr_i : in unsigned(4*ADR_DIGITS-1 downto 0); - master_dat_i : in unsigned(4*DAT_DIGITS-1 downto 0); - master_dat_o : out unsigned(4*DAT_DIGITS-1 downto 0); - master_stb_i : in std_logic; - master_we_i : in std_logic; - master_br_o : out std_logic; - - -- System Bus IO - ack_i : in std_logic; - err_i : in std_logic; - dat_i : in unsigned(4*DAT_DIGITS-1 downto 0); - dat_o : out unsigned(4*DAT_DIGITS-1 downto 0); - rst_o : out std_logic; - stb_o : out std_logic; - cyc_o : out std_logic; - adr_o : out unsigned(4*ADR_DIGITS-1 downto 0); - we_o : out std_logic - ); -end async_syscon; - -architecture beh of async_syscon is - --- Constants -constant ENTER_CHAR : unsigned := "00001101"; - --- Signals - -- For ascii_syscon -signal cmd_char : unsigned(7 downto 0); -signal cmd_we_uart : std_logic; -signal cmd_we_wait : std_logic; -signal cmd_rx_done : std_logic; -signal cmd_we : std_logic; -signal cmd_ack : std_logic; -signal cmd_echo : std_logic; -signal resp_char : unsigned(7 downto 0); -signal resp_cyc : std_logic; -signal resp_cyc_r1 : std_logic; -signal resp_cyc_uart : std_logic; -signal resp_ack_uart : std_logic; -signal resp_ack_uart_r1 : std_logic; -signal resp_ack : std_logic; - - -- For the serial interface -signal async_rx_error : unsigned(1 downto 0); -signal async_rx_restart : std_logic; -signal resp_l : std_logic; - ----------------------------------------------------------------------------- --- Component Declarations ----------------------------------------------------------------------------- - ----------------------------------------------------------------------------- -begin - ----------------------------------------------------------------------------- --- Instantiations ----------------------------------------------------------------------------- - -uart1 : uart_sqclk - port map ( - - sys_rst_n => sys_rst_n, - sys_clk => sys_clk, - sys_clk_en => sys_clk_en, - - -- rate and parity - parity_i => parity_i, - rate_clk_i => baud_clk_i, - - -- serial I/O - tx_stream => resp_l, - rx_stream => cmd_i, - - --control and status - tx_wr_i => resp_cyc_uart, - tx_dat_i => resp_char, - tx_done_o => resp_ack_uart, - rx_restart_i => async_rx_restart, -- High clears error flags, clears rx_done_o - rx_dat_o => cmd_char, - rx_wr_o => cmd_we_uart, -- High pulse means store rx_dat_o. - rx_done_o => cmd_rx_done, -- Remains high after receive, until clk edge with rx_restart_i=1 - frame_err_o => async_rx_error(0), -- High = error. Reset when rx_restart_i asserted. - parity_err_o => async_rx_error(1) -- High = error. Reset when rx_restart_i asserted. - ); - -syscon1 : ascii_syscon - generic map( - ADR_DIGITS => ADR_DIGITS, -- # of hex digits for address - DAT_DIGITS => DAT_DIGITS, -- # of hex digits for data - QTY_DIGITS => QTY_DIGITS, -- # of hex digits for quantity - CMD_BUFFER_SIZE => CMD_BUFFER_SIZE, -- # of chars in the command buffer - WATCHDOG_VALUE => WATCHDOG_VALUE, -- # of sys_clks before ack is expected - DISPLAY_FIELDS => DISPLAY_FIELDS -- # of fields/line - ) - port map( - - sys_rst_n => sys_rst_n, - sys_clk => sys_clk, - sys_clk_en => sys_clk_en, - - -- Parallel ASCII I/O - cmd_char_i => cmd_char, - cmd_we_i => cmd_we, - cmd_ack_o => cmd_ack, - cmd_echo_o => cmd_echo, - resp_char_o => resp_char, - resp_cyc_o => resp_cyc, - resp_ack_i => resp_ack, - cmd_done_o => cmd_done_o, - - -- Master Bus IO - master_bg_i => master_bg_i, - master_adr_i => master_adr_i, - master_dat_i => master_dat_i, - master_dat_o => master_dat_o, - master_stb_i => master_stb_i, - master_we_i => master_we_i, - master_br_o => master_br_o, - - -- System Bus IO - ack_i => ack_i, - err_i => err_i, - dat_i => dat_i, - dat_o => dat_o, - rst_o => rst_o, - stb_o => stb_o, - cyc_o => cyc_o, - adr_o => adr_o, - we_o => we_o - ); - ----------------------------------------------------------------------------- --- Module code ----------------------------------------------------------------------------- - -async_rx_restart <= async_rx_error(0) or async_rx_error(1) or cmd_ack; -resp_o <= resp_l when cmd_echo='0' else - cmd_i when ECHO_COMMANDS/=0 else - '1'; - - -- Detect rising edge of resp_ack_uart - resp_ack_proc: Process(sys_rst_n,sys_clk) - begin - if (sys_rst_n = '0') then - resp_ack_uart_r1 <= '1'; - elsif (sys_clk'event AND sys_clk='1') then - if (sys_clk_en='1') then - resp_ack_uart_r1 <= resp_ack_uart; - end if; - end if; -- sys_clk - end process; - resp_ack <= '1' when resp_ack_uart='1' and resp_ack_uart_r1='0' else '0'; - - -- Detect rising edge of resp_cyc - resp_cyc_proc: Process(sys_rst_n,sys_clk) - begin - if (sys_rst_n = '0') then - resp_cyc_r1 <= '1'; - elsif (sys_clk'event AND sys_clk='1') then - if (sys_clk_en='1') then - resp_cyc_r1 <= resp_cyc; - end if; - end if; -- sys_clk - end process; - resp_cyc_uart <= '1' when resp_cyc='1' and resp_cyc_r1='0' else '0'; - - -- Create a valid command write enable, that waits until the final echoed - -- character (CHAR_ENTER) is done being transmitted - cmd_we_proc: Process(sys_rst_n,sys_clk) - begin - if (sys_rst_n = '0') then - cmd_we_wait <= '0'; - elsif (sys_clk'event AND sys_clk='1') then - if (sys_clk_en='1') then - if (cmd_we_uart='1' and cmd_we_wait='0') then - cmd_we_wait <= '1'; - end if; - if (cmd_we_wait='1') then - if (cmd_rx_done='1') then - cmd_we_wait <= '0'; - end if; - end if; - end if; - end if; -- sys_clk - end process; - -cmd_we <= cmd_we_uart when baud_lock_i='1' and cmd_char/=ENTER_CHAR else - '1' when baud_lock_i='1' and cmd_char=ENTER_CHAR and cmd_we_wait='1' and cmd_rx_done='1' else - '0'; - -end beh; - - Index: rs232_syscon/trunk/VHDL/syscon_vhdl_2008_lattice_diamond_project.zip =================================================================== Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream Index: rs232_syscon/trunk/VHDL/syscon_vhdl_2008_lattice_diamond_project.zip =================================================================== --- rs232_syscon/trunk/VHDL/syscon_vhdl_2008_lattice_diamond_project.zip (revision 8) +++ rs232_syscon/trunk/VHDL/syscon_vhdl_2008_lattice_diamond_project.zip (nonexistent)
rs232_syscon/trunk/VHDL/syscon_vhdl_2008_lattice_diamond_project.zip Property changes : Deleted: svn:mime-type ## -1 +0,0 ## -application/octet-stream \ No newline at end of property Index: rs232_syscon/trunk/VHDL_doc/async_syscon_guide_OC102517.odt =================================================================== Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream Index: rs232_syscon/trunk/VHDL_doc/async_syscon_guide_OC102517.odt =================================================================== --- rs232_syscon/trunk/VHDL_doc/async_syscon_guide_OC102517.odt (revision 8) +++ rs232_syscon/trunk/VHDL_doc/async_syscon_guide_OC102517.odt (nonexistent)
rs232_syscon/trunk/VHDL_doc/async_syscon_guide_OC102517.odt Property changes : Deleted: svn:mime-type ## -1 +0,0 ## -application/octet-stream \ No newline at end of property Index: rs232_syscon/trunk/VHDL_doc/async_syscon_guide_OC102517.pdf =================================================================== --- rs232_syscon/trunk/VHDL_doc/async_syscon_guide_OC102517.pdf (revision 8) +++ rs232_syscon/trunk/VHDL_doc/async_syscon_guide_OC102517.pdf (nonexistent) @@ -1,1918 +0,0 @@ -%PDF-1.4 -%äüöß -2 0 obj -<> -stream -xTMk19͌ NBNMcȡ6 -.$=Hu<ͼlCFgB 7XCc`X>U!qy[8罹T(\b/;v;E}lIcД1[)qxr771 -oj;X.%~1g6DLƉ\e;XEъ-TIM!W,E纮Dqi{5(_#4b採I"y -8+m2QGEo\%[|~MʄSLP2W&T yt6T؉meGv5R`-KVM">ypR?=U9i -6ΰ+1Hl_BC+:TNiImՎY)tGEOhpboh1FL03"TcyKA߇s߼`^VWL=~ ޴V4h@?hޓ2OLp͎MB%i#/~M!0:Bw @;@ R;t3yރ#,3(7dt~hjvY"ȫBP%2sGq~ -endstream -endobj - -3 0 obj -655 -endobj - -6 0 obj -<> -stream -x[I6ׯ9ܵ斤!!,0d3y$˖Jo΄w.IO"8S#qԍ4ȣk>~o~2wUz] -::>gt~Mڽxڔze}c8>ck -I[R9d:`N'(~젔>ںػXxmĝn<+#5udiK*<fT6y wFTఈ8q:W; 7f^[#ot[9'Z ͨ9z> -stream -xZˎWhm`:| 螞 0 -nɒD'.zZHTa\~`~S!{/?]\`/qMF`җ쮓 ָ2yH)agc;xL4Ixhgʹ8^l˿?}\~nP$nl↳_zSR3f{[ ‡E34vY@J0Idˋ,Yx8%ֈF@uGsZ߁^;iG;lFI-eM*+'7?pq6[?PlX|6 E'Aa8gٟ -SICbAl&YJ'p!,sq83W0$~O5I"M9uO\Vi  -[cWZ SFkOG*nSHBAP@qf&5(X͹ ŎKU^aMTR0WN -0,w -Nx -.e -RYx,8%4U|W9 +5$9ق]<bu%?a:-'x(`$XvTwLsU\_3jQLCZe8ܡ -UcSpYov\CT8 W!#xcRWfrKeN8:,fgzY -;=ѐn`8BPE9HQJR:JB.FbN46uΏdԂ&8Mz,;fEwq|خc璜uLigKkoVRB5whFڣ>wRŐ*`vl,ZL{6cRrQ:WuDJW0$B2)L]S)X -Yݾd z޸ZǺ U2aI^)ɩMB +beS*Edr -J*;w>ktUʾXmFnúZAMZGFجxE[IhMRiY%1FM4 הP,  pu+* =Kfimn0Zb -Wv!2lGE!Cva[Cٯ-[)RRQbZzJ ?tĊaJ#^;3>ZջSGdrbӯj)Tr$fuS,Z qK [$[YU=wYVEN#mdrME -}܈ -` -aAw:*E 疵5Oqv\őO00yp*FM sYP]fNzfx6pۼ4#1xm[~추Nލּ/aHY餷nTAv)WON=q('N3 @ KHd[W"o1VeUM,@׽q[:|ף\tbȮ> 4n؇j>s?f~:{k9v YܗkHX -ao5.ˁIG\;ᾁ7Y^^_XMY_^qHdy'wyyd!}!JoœKtڻHir6u3dXo~ p+^}k:_xk ?W׿^h:Z`TjS(Om<59SJMQZGyjJ`RSeTѕJDݖ}nhKST٬c|e}{nfNވO',]VTyT/LGMbm:[uڇq\׭>zukݼ GZmcFNyעZ00G ahSok'fU`RN;mG`!S R::v_I3~$N sI_<00UVkQ<bsm]Zg{0߹J} ?\MӐHy -1K Hj -endstream -endobj - -10 0 obj -2440 -endobj - -12 0 obj -<> -stream -x\K$ -ϯ賁H$ -9%N`/8l`xTCJ?"%պ?;3B g:exOoxz9Ro?|'/_\?š#\t_a\%rpq5]_~|駻A:6\_|B#O.GF_7WLgۛD0YjG?#w*ծkw_ҥ{42n"?tɗΒ 2&h'zS]Zu`VJ>&wN;h|ZDpQ:cAUUj,u eધ<>_EN$Ϙ(PȲ%9ONhZUWPeYwn5fBW3ɈtC59E#$,:+e3 - O1d# -s #0rXd6n#0_su4WBth6"B_|ы - -L&Ոuf4#GSS-$Q̀Btٌ&*Mi =+n}e039LR$cN:nw+޲`B(!w[Ym -%'-N*Jpo[_NޫXPǛ.4!U!0*Ӂ 5P0Ajp *՗/wtή4VI{zE#0c.\'>6SfBhÝuec(U Zp&N͌%,V?zt?)g045Z،v3dEqμgEUzޥ}P̬|:Aīֺ-yB71X^9Wa6Ekmcdy,+C,,,\ nA*&nnL0:얊]DΒٷB3Ǵ[[vtZKKIj)la$mV 7&y}u'&>F1ԁml-C#+aI*Ͱ:q MKC(MїUGO&"GQA0qׁTY*?[SS_>QjﱮsOӚ1-},euX^(s5Vl+65c9V_Z首mV?ygW-a,qBhY-e;ѫ_YL!atV܍n̵dh@Mo_g\.b{xUNQڃΦv9P/ٮ318M1"|wK.jG;휶$h6Mms ޔ{Ծ :ѥsςt1JRmӖM]+y[kV/k"y7_H[Fx՘7Nz|R͞IKZ[o7|-d›=;CI$U6IRㆌAv*%tTK3;iLRbnPCk(zxkc餏upw:kL{mx_BN_(Oڥ;LvU) -F5z[]Jh~3ɞWgִ!jRV 9ND!fb)33x X /b)53G TJKd)3292&e ek 8C"8"l59({І犉K(;І1/Yb02-}|E }&B٧P1B'R(-k>cP1(6BهdCP(`F2E2=ZxHX -=W3T5Oa\ ,S0CJ7'CUĪ1!+3T(k0'wCPոsVdp(Jh f Kd P.KCO&ʒ<,d,d`, b&ʒbMM%[ D9)eg,Ib&ʒNL%^ քK(belrtQkzbS(Gr 1N\K jʐL(cMB-ʱ@XʱVnEBsKaxƹ.ŀ`F9:j|P(`^LZY5$IL,i2pą1C}1pii0$E΅1yc2D= \,2{r4YKLxDNlJy-F.9DF$R\B(BLG epY [(G2h -B"()$3 zP Q X, -e (jXA4evF9d :rD41(ǢQN`Hr*l FVT9kkEe\P\rYBvHX+*etI5c2tB}"bH2PFZ$B-2;2Sf5c2PF"exHę2< `Hd@ћ(G(hF9ydF9; Ls(g\F%jk`L+ɑ2ȳ2yP( -eB) LrR($ eP& eBR(& e¬P&n:I,hbE~w8HZ[`wrx?I+{WI+G`w -|I#i[em<.\Ib-z\($J~L=j3QvY삉Cʼ1PM#PHP(C6ɃB ysnRP)(C 吔@1[(%*PRO-Cdb,l|,21&Pf䘵a01FF6:&@(GeOeM[.(Qvv)$ e*AL|e1PʔBRPc?B2,)"oqVc@̕&dʚ e1Tqu:q2n1Tu\-5-5KR'X%V™ 3*1[PUexHuax(d2](!f|E B>/>F9t -.@9]zS}Э4E-p6gJ]~ObNCKlܵ:妗wR_ԕ{@gUEr;ZJo;x%psYv_]_VCvX -8_ Y^xuOrFڌfl-T@'DCngvFfAr<{["I}|@_Hmek`x R?Lݶ]*K47Nt^M6Lq5E&9- -xA=\b +.^H4gZPlu|o)ľy‡[g2tr0[w) |;8۩:7s=uh"B"s8ŕefǺMi´(?Zc:!l6ϝJ`:}ae! SBXOҚ ۙ oc`޲dD6J(ҷO>E略Fٻض[X:$}H"\?vG[FǟC\b1'> -stream -xK$+lrŇ( ($=5on`=%`dek6S"?"p]%][2\?.񗗯^\Vo{|KpW~K8$W4̩M"8/[yK_o/?~{帠u9o*obK^!AAy@oz -rSm7bPWא1*pz~DlU7.hj]ETet_9୾/SGZyCp rtNckWm_BK_ڰR#q|ht{;|+ȴM;|SQ%ץA~&4`_Gkާ}ּ&~BZO_;Wtk&5E?.f/2!yYQi<{essFԮ#:i)w)u;Ę\ -djx0b>ƴA1&3Tf7_͡c9OxF`x-уz{Rs_3du݁[Xw<sa+/_WA{<8{X}Ty832{hw]_y:0zFp8ppzt)@It#="+b}z_xsYיɮx0BMa2:q?%k8 *}F[IB.o.7; -[*4Co -?_)3ݝ2?_rS[o/jEJS2]IY; -~EvU7cPwM -kgw^S]iJuY@1}&[5Rm̦b? -8RmԦŞ)p:+q(189yZYFuu*8W?$!g?$3;gRZH9xC t.:\rn/ :#PQ -e(QQŽ2(kK(dG# Q\"ʐ 9SRfGժgCNv#\P9RgS^ ^ĦKsLWw)TobL*f]h`FsbF"E<UuGk٨9jeϸ$%XEN');Ƣ=p;IQ3`GYDn'ehHPP"GYH"BB"(6e.rN!匞fg^3 --Y,R%FGYsr~@kR쇤uDĹ6xZD{k%9^75D sQPL(Q."ʅQ. \v[YZO˦`y~ -]J@8qK -MA|(XI+mxOsW+6‘nD-]kt^@J )7[ )([ PB̉KDSu @2(#pH3ꪎqFJYAN!`$2gedY݌!Q8jf?8[J3h@9ZEg/SHlhx$n‚ۑ$G*2)g ))s -)xL!eOjHSBOÇCxvQF*E‡Cxv.QN!<;y('7?ך̷Do7/qS>[A`[=>'w%{ח?Ξͼi%93|M]P*^~n"`CQ3dƞ5:ădp[S'S5Kvgxџ49 oe`﬉=KMq{Tul/KRF|2r(¬BMqd48\` rwxf4e:Fi -8GsȞU%7nK0>.X_'/f m-3?;J蹲y`hህ K.%{x8ktz+/GNQ9P >Lg>q3Ctgx} -=D3n^ݜ^Ǯ'DF@^frf,8˥F>[4[Nr`şke*ѷRRsnsUaՕy-ot.3X8Ý<[NrgU-!Gku$?,q -]f֐q)xlɾ^ /3\ٟ #o՞-bwqsWyV[l9iǟ/S -endstream -endobj - -16 0 obj -3925 -endobj - -18 0 obj -<> -stream -x[I$ -_QgCc00`o춷%6 -oO/GEsX6Cpq4dkuxslu1Mʼnsh1qO+9 - "xFRbFl@fwRoE6#l#FxF6Bnܒ1m; -霺JoLO!QWbK!;rPHI5oM#TqHqW!.1Fs_F1WG+ -.LA~w-q!jqw5,*?O2ߑ0Q8_P37ɲOllG5=bŀ{RQ5zxx. -AGv -Y{\1'۷ ]Yvm`gv\Cv>ۄg\WTTߪ$5Q溞0;qfC"nzߍIpNq'ɓXIN~y dGXHx}Kߎo7"Iu -ΒSWGaҕ*ui-<%E" Tp K \:cR>Ӣ pKf*!Qh{bn^`D3O -ondjz;aY5y'<r -4V(Gu.r"v9t ĩFlX%5s?TWUf΋T~QW:y%$ -+X%'濥ErW(vk6ڵkzWTo8𮑦nXޏU#2,S"<6{0r\͇jdi膲ۀ7iaC -U:'j W,g%,Iz!P>ysE;P -7*6ks5fr&̿T;q]uM85%h >niLQo4H+ -`pkEœmEEI -uf,j֍JܒsUet$n/Tő _= ۂ%խt[!ܠOɑG/z9Ztpy0YK]{rq[$ ZaGr5/eJ`$}qmgrց}VHKAJf$9kYdL1C# D^)) _rYRhtM -A_4cnUȰF!Uٲm -k:)UEw)T领 ӣzz+IEh6En@ё0pӷz %xc=73'x8py1z6x f\NO:nS[hbpe]ވk4R[ -5NjS -r:}UɟSC%JZ2V_BqYS٦ĖytÏ?O|?Oa<מB<~8ïo1 -'!pK_V -endstream -endobj - -19 0 obj -2772 -endobj - -21 0 obj -<> -stream -xZˊ,GWP5̌Vwi6ng"_m }+3#e~mp;!yo__ܹ }OGgXo^G|ӕn4n ?3`=@0Ukd.g&?^ѧw8zQn8ٜ&@M.Q@jS/v<6HB܇LOIw!LFU=zBܢꨊFfS} 2 mT4lSLHwoEUmkd$> ;"yB-; !?V"N0hBxbq.i[ٛrůBFť3UV#57\АPD'G`rv -X&񣓓M/7f@%uS!* -ERbqL -c#p #-AbUIXxȬ!Chçw"lG  -3y?H9p6fFD _ -\[dBHjz$HM]vѶW`@$V$#B[n̐j{əսx·D JxE[ z5OZ T@c-F|ƛv#Q^O@mfe;}bxS87у[Z`@r -C=y+aV䩀(3aɄa~TVpSgJ|D>x= t 5 ^0 bEWI":Irǚ¥ϘYZmW{s+!\ g6I l7Ÿ)6*cш|plW͜7[4/ 17k4񅂬I@#YIb,r4Ev=.wzI"D"2 -dOw -{;7Z+(ѤZ)]Fdot!8ǝZy^VdhL)'Ӕ[ڕ8]+ fsyf?f?q,`OZk@}JVV#ͨ<>՞p}"|7)X^ӾR>Vjٞ9[ZųM>o<]E4ԼAk:{>iCwsF!j=0)kcE:?z9maA -m3Z!:ҧ>3 -K1Tآ1ңSXԨg]G "o//)G(h}ZjkuךQ^;m%6hDVD4YʬQYFym PԵteʨm֗~u4"t׍f)̍S+9̵5Yci^뽭z.-bVxX#}k%BhZ۸:>cI[WT&sXuÝHgomۼw7$Py}IXŵ|Iy> -stream -xZI+W:`T*06%Ye&/нg\U{ vY骋~;2A]b`? -Nϓ0Li~p6vUzWeQYW>SaWbUxesQ;mgv湘P~9 -jlհ<3N<W5∇|PA+3} ܸ~g4jQ=U%(fC#( ״qWp+5 vl@H0܌G`;xǿi{|d mG'A4>Q(13o6]`(V0#(LǦe]:^KĒҝ} - FPy&HX|`bX(3"1XzsxHV6x ?8$%Rk[jA&y5Rp*mė,ѻ*7֊}ÄP^`H1O([$C!x(b8O5!7&ރ4Io$gE?E:1E+)\LھH'*@;f%dʪ)# 9rֱ )„l~Y$Ĩn|,kC}D1 @ -:A-;cetu?>%i\QB&ec!4Ga"OZ%el=%$gCG(?+0$`bߛЅчFMXv;R -F;K;rwm{4k%#:#e6 -8p.eB4 - -Fp,9'T:߲q6JB٪qBĆÐ,H*0)uLbED4Ww/L'5Q~컊-+`AH9nrW%a\" [+T0i8nC)~{ڰw-BȪ${[;+end6,gba['' Fl8~BUI(d;ңbi/״4Zd#W4ǖeӤ˶Y("dgv5(ɲlHT%\밑.Dć4z'4f0pajۣBu@ )939UkQhXUzCcLsG&)2Im33\V'TmcH6l//eNIkEGm:@ʨ1l5ç -juWT -NÑ;(&AP'~%I -g -:;eGO#z2 )OzWb+ݲQ+qK3=6q4 ;`_jw󄪥dHϖUQqw^עH2FWk<[}<-]0}lT7}O~4k ߨ~!3v> -stream -xYM6W\ K >䶭ڤ@ -\;3dKD -J)y8spѕ,~/ŧۗw*BgؗIZ-%6cij|2*@Ts;RCZ'o`1Hg -Uѫ9Kd!' -Ver1^+EaQfuFX.yƦSKNkD8N;@kkAV=/tEב$sHp F)hM8-đÙJ_}، ^}dO]2'mS_2Lu#06nuT&(6r#ZRJ -hLGEf -J=hts*{؜YND׸%hܫQKHպ6-+ 6mz -ލT#00f}3I;>n^S4~̨1 -X%"4Hi7KO&gyĞr hz@1ɅѬu 16$v1VOQgI3pdUɏ+͘G@? A*ux|-uUU&qep@TU@V\]n^diS/E!RkL,8T .pVWM6\^g`'[IRzF>9 M8᩸)~ -N5-ǝWϰrTHj h -endstream -endobj - -28 0 obj -1194 -endobj - -30 0 obj -<> -stream -xUMk@ W̹h -f'.Pz\$^74c{2_cC)dwߙ?xb9y -9seTih -6d3/m~NC -q.n -endstream -endobj - -31 0 obj -713 -endobj - -55 0 obj -<> -stream -xSj/ -endstream -endobj - -56 0 obj -14 -endobj - -4 0 obj -<> -endobj - -57 0 obj -<> -stream -xy|TE0\U{=tHH٢D $@PQGPGQPuDtdFTB -nΈ23"8/:;U ˼>MUZnݺU:MmH s|7z!l{E0]G6s+,R,FHтū-F!4ray;Z^ uT.}OI!⡅K -w̝!DKf_߀t|!}cE N;u)CJipD*+*F&j;.`( -㉢dIiYyzpƏ -]erl|]7{?Oȅh:;/ =DCjJ>Rt%00Ae# wUPHj87B\m7"e -A0!p7KȖdof_Z,`1QHNrfKKனDB ֠_wp3Aeo6̀6FϣpG|+2P~c.k{^@h"jBk ׃ø\]=}ߙ#Y/=]Bנ -h#ڊ>DO1Gd -=\h́޼$zrñoO+x%,ЃcY߉6C>];S;pO3M|~ ?#q|Uf> u!7P F]+_!N4#yu_&S]}5! -(F;O@ӡիЍh/z -}}a%6B_8'Jh38#VjC\{?۷3cdg٭oo4N.xΫ( !>hX<~0>$'בIm%3;-I45C7@o>۱ 4<ⅸwe|-x'ދ?o O's -n .fp˸kܻ׼O%__-ANj}vjIߜ~)Ό\Yy9A*/hc3Zm0S?`}avB}lq3B -ފ{ x?~ğC*J;<@n1\ߓq.q\ -og<-|)1]IIl!T/4# ?e[&q%$gG8ik" -| 26KR?1#A6"n:Ԩ -Kͤ~$cӮ![,n3_?Dᙈh:2"n{ZDΝ,!Z+ |pL×cXj(q=>@Q5#Bbt7~q/ZL_øT=.MA]Ao C=(@:Iy*?l&D#ӐiQI1t ZסNT۸N9 ->u oƢGMMCM/CoC1(Ek$[^ {|-Y_cMBm -2ߗʡ7i#Iç`ĿBu .Kn0w2ۜgfI;cZ>V|ϒ|6; -m%ϲ6~,PXfšeU"ˤOm7+y?׼݅@l([Q 7gi9 -x:4ׄ?m.9-Eˀ>Faq7-0C]_np -y<-UriGO9OC[bBa< -Fݖ}C.)R߲d;~t$Iމ%b1]7fꪊTyYiI(/D#P0|^tmVd4uZZTeR ѭBwǎ-lH=([Ct 0%QR̕JbPjBcP~gTPŗ\4Gc -B}( -ݣXuT]l6)hR -n[s;a[5ШngpTc#8 7ΞtьQ.(эtn]A -1҆n{N'WfϜn0ṣmWBƆk纸uvF׭[+toh\?G - -:q<<зʽ_[.8uɫ=N;{9uSfiWy(v3Z7y(8% -ݮf06 VB',- -^-%3NkFVC15c{H{u~8MwK{<ДiX= œT~;.,("k16ֱxEQ^ @&Ó~?"54ՃdҜ94gMALt#:Ըpx7\/dи5߷ Pa"y8 H9s0Pwa2+V,ַJ'ԛ=Ab<:G)[78кuuff - Du6hovzWۚ%ိķ\]ķ\|ɌzPo2D֑C7cR@* 4cikZ$Yň0Kriz"[anH@A24zT֋;]Kx -pH)BFӞ!t=>QvB_D}(]WK]iIo -<:%pO#І30*2$J:Y^^ Tib0: EI7R\TqKJA~W(8YUee8lQj**Jkz* -GDHTJ -:QcM}u:@F8N ځ.WҵhZXQ㰤o9yZeٙۥa -P0Ja.18SKKVBAPy*>,:6P%>lW;}⸾6~ڕz%RfE<8Yx'g2Ly7@ u\H[!kn1Y(Ui0h`h( -JD(*7䁯/_\?_bcPyby TZ?^7gѣk.od_Sc -=yhvm4 -9EO=UEda_ -eyk&]{[e[̏:Mn}K{Ԣ%sqko.~JK((r:I8 --VG1̕^|DR~`f~':\"VV=2A?ؿͿ/;mJA~a`lQUԂ&(},}ױd @ړ(0l<؟#&R#{rQ^,{84?Ā%9,` U #q*n#eҚ5s -M`=>j/x~+/;w:~Nq0hP꜅;DGڠT3…gWb<"ȹe522W6O>mv=&%vs丏erH`6.r/^spmwselqA3 3>I՗2^goXrfx[ͣb`\5 -7}wsppt??wAB`s)$HȽ9,p%m.*EQW[!EjY -3c}/mGpM #VG=&rNR<{yVn߭ AT=@W;2Jic`Y?/êUX},ѽ}}~ڝȕW - Sol-O@}o {B#/tM*o)zuVm6T^ 'w~{۾}o@1+}Q$fe%A8EoM - £r?ë³^u6H0"wV6mIbƇ`GNǣ_6 @sz?d:KQBYrw fXN`PZmuu -^cSmHc5T`vҘz~GK+3;\uzޒ.~Bc>lء7S X z8~/@\f"ᡬ3'ό|}Ĭs2:u>T_<žy^Din jry=';X9ˁql1*UK;Q:!y'y2® -Wkw\Yhf+?wQ(y(tQQjޣb!%lF/ -'7lԅ! -ry,sc3YӋ̖ pRGt!>$*ttiuȄgDZ2Nat. -J* l8\ln`Oǔo>-/nydS7dG2]4W:}E7)_U7] -B3p(j%J -))Nj< *ļ`x -h! (̂E6{5z J dR-IA(5-p -}LYP9?EZ"Չ -h⥒7Qj#q 2ȒY _ p,tfcQTv9iICP ҚD&dꕡp -Ki=(Wv)u2"s!k['Ҡ#wiv"Ubձc1Ò -;cxΣ@dZծ.j,G1#l6yݍw{`0o1x!jFUۦ7Guh둧L'SiTVIbdZ\#Mթ.n^Tsuu5VZǬf\$ǂRqDm -4_̢Rŕ:S1o7({qNN`};RaI^v3tJ&ftĪs -AI#J ${t@CrZ6HièB jQpMa[Ňj\|J8ִ݇l=>rV*}\o`K֔/缼Xh?1_!QozUT Xkէe-L~#*@*1WMw_ PhneV)M끞Lf -n\[k3U|tOrj~4k*`;mkoX3mf믯[4Lw؂:r\xgFꨍVWu&{ڱ?0kgX}%GML&ū$wvud2K^#~3ۿ۪q )R7uõw6&&JM^U^ -M -*g;Nz- Ō;͇ͼ/|4/Y6Zc]SjfOt}^c3 3N=a~_o(s=VNw݇G^+9 }tzy,?tf{@~)c֨f)c^ۺnnd=lX[H79H89/yKVW[c-Bǂk,[l埰l"{^KyoZ_}j=d-qmkk &ykG?mI^o24f?J!BBH q'(%n }J -BhA_RzClbb)|I -oSS X$Q(Z NX${&flje,f3MBR`anF89bVA65 cGS0hY#j4_4Îu^|Aw;Ē -XO9p<<ZZA rCmϿϯjJ:,y%T>2_0N?p{(*1 j0(f=19N 3L`Rbfqps9TV"ς LZ!\zh_nw4 -(j!]*` ?mv5<;{qS$1|q梜Md.$s/Drd@۵^r3%BEbyKZ03467H {9I*wȉ w }r$]+sIx?Di5Z*8/`)H?f/̅0?=: -{Fs|/hGɐؒɹWk-+-؝[c[xDNg9lT!R Miwe܏5D#`A+($1I1KMq8؟[ G'|Б*=D\dt.*ǘy\gj^%ә=S(/+GKKhS"k7A=0i1˴F -C*R[3']}|o~~wo7\vj -6 -Ox.2yy*x=DI|nУfպaϢ]φhsZ\_u^Q|#ysȃ_?y:bãA9UrC<9K卼CΨa25jH3Zd1jm߭Tэ8d!P85JSQPrJgiooq>GIQ*h_m:gL2 .lNS`f=vƪ4g.)TClg:ؾ2}{C:&:𿟇A}.w4_!;jSs,+,7Z03%30ȍv˽CryAߧ`NGpnwm[5./g)nՅhL]'֤4ZRf5YL -i6,ԑa;I)(mjmu0ּ8h!-OEZC˖F:<9ez},Zipx\z $CEIXT ,XNR.1XwA-Ex$$ſ2𱸻>q{ j"@"r]D&n;_w:t'C^ BoaQ$Y#Q}}uzg& }bh^?Pl -1!(.KyTQSV1̽&i-w-Qr7~;'L`vM/zP( ExNs .w;CqW,gtgUہFLbLǖ z=}Ǖk-vKķuDMߘVE=h[Fg[ܸ:OAh*j\,Q xi0.H3*!\\Gu2^#%Z=9hQ<ƨߏ&t8.,P(s똂(pg+RU/V*m$ytϱɣl׬NfB,:)7aYVl晀M<2/@ZBO'3;Dܓ;@6+YYxέUhZBmٿxE`LmD8*Zcb(h#@~W{t l10ð[]B:,C"u<.HA$)RZVjZ""CHD)4,">)/b:!bU%skޅ_}7/5bڊwjAG0sd+?"a~ә=̏Wti n,qoFe!K:J*/.-rou<+Lf4ӡ8c1\߬~1cP61t -rm9DtvRmJ[#o}}LQHo`]"Akp_j1vhpA9e-t?'&,sR=>m}僧5٢7y̏X˜MK>5f_ȡMf!>r̽= sYW)xYL׃wy+HW⃙#Jy@4 ,qD'F)ErQ8B -#J)%zqGr .zuu%qM6zk'Qn,ϋ,, ˙B&fW19 ?9?}.+?UTQ,o X~LSgZVT^!:}?E`'Lw?x+ -l哛4KEǪ q/uJpO/n ǐQGO{ܜmf0Y!TP4} -#_AGVG - ы; - -@QлVA7sݓܳܝ -mn/W:$wМ5Pgs ?a"?I 3lw|eV.a|~{QSHp&cW'oLxI!'4E)F>$]]=Cd G\ zd@6{Q xE҉W 8٢ܪzoaYdxYs(?bJI -\s Pn' -8ȩuV/]YKǕ^Q%t%§JF'_tD9m -~i(ʈ3;)Bd15*Ur{,),o-xa7H/nٵp{qpS`K]$wT[<3s(7D% &)S7 'Uk1;C3AoO-P# -?3|J(=rl87H4\>`6u3[22C%kniX'We"̸*?ኺْ)T1iq%} |̆"*#kHD[Q.4-o c+DjH8(~3_֓j؇rFt>~ch7-q .O6cJSe}n(WIr%颦E&80/74<¼Vr0])P ڂ$JsXl:mגcۋxmYR]V%|B=LB;NFZ+m[=i;HS+ -%! - -DC -GIQ i4:<Ϳ&-iu>SqZc0a-xg^ l̄=V,E@O[[u/n{[2̟f:L:Q4]MEpKVYғTIX\^ޣrYrٱ{Yz\4]MqE񂨧7^t{03!k$D7^'i|"%"he$TԼ)GSU鍊 EgE;ۢB}7z$zzɟELJgac =dh5 o潓LMMM1 -jD1jkYіx|]\*sTMSIE9TjOy -=aX㲟zm@]˙a -пX8`~"䗭27;v`uxęͦϷ -f#Eۗ vtTJW`됮@A -ڜy4 (N[d8S4^Q)B}!)G""_/^,:ARCgA*W9J; O=A -ܤآxWqDqB!QTD"ŨH_Df -a*&Fѿ},хCP@8,0w չZJ91zq@:KTr3كAWAPe<=JV0*Qm*'XvV20VZ ]8#\KgEdL(a8҃pgKzKOTz" -D$4V - =Ɣ?tA -'OQP+ٹbE=HI?s[ -U(FۣI -$*9…pq0UP1,S̋&4UH<)q7oR?LɇUl5o -JC qjt$ۉ})`V?]DEldt<(JUlTFTCzV4#14)cbX,$¡p($Td4 (hF(L!$A4KKI%-!y -&J3=aphj!EәZ"B$՚RtSeBȈebj&U8*h_4ʸt>c"o -;▓l#ɦZpʅ\h+baPcxt!m^&g΂/ L2-xSg(efnC"`C~g9_x*n3P6;Ӌ̈́4& |Ef}SƉ܉=my᭠'@QnCs+T+VZn*!nQ⹻"~0!NPy:a): SZD3w9#6]MGcFƀ?Ñ緵b -'NY%Иi - <zV}.z@r/e{q䮻>2߿r s -O,SCAAfw&4>];kQFvmQY*d2M@ApM9>5qMƂ`6 "$f #a ɥQrc$`CD$ -i6g؃!VшK-wE -%}^Im2ٿXr.I'~vd]9\Я$3SHǧ1c_\Sa\̎Zj93u)19+߲%)|h@eJǦ.'ߋMTYaeY|)a $ 39vQjS?9^f\P7t?&a ۢuDp:*P\T'jGR9oH#<^dtև+ʫ*/__\uMm{*7Peyc +G+HV_/w\{Rۊ:U*F"TzrZr Ga υEm,-**)3M&i)B -J"\$X_+@)2"?`_\) F -c1Gi ;kUtZ.GD{;~x^9OZM*KJ#'JIi}^ƕa_'dø=TFbD LeNjOeriisḼ1濵_p ^$¼Dt3.OOtE!Yy<$J -a!M;P'%8wZif2j& -x St;e֝cH$OmMϹ Qr>ܬᢊp6-_$ cY] u.& / ]&/5)s\;Me漼.t[rȐl;ff[Ά4wD1F˩ b+f>?ֿ3Gmsߡ*Q|T -#WN`ĉ*Ĉt.L}E|cFMݙ|K4W񀂫w(oUbt6a؆BGA'`' -r3NrB3CZ=^55a3ϋ+]jzԖK+IuWZ@7+K! -)Ӎ:*ņU  -vAhL͡ѻ-TM_6OpH#}E3:G5_֋oM\VAp --=@05%- IʊpQpv0?;$}~f'QS棎/$l9m><:XХyxxt ^z1EJ/v)URf!؁ -D"ces̨1CUTнICi;Iw^\9cjhSZUWX:mYa>~Wȼ֥A%6NejAb7kcxt33Dɼ[ܠEQ/pk5嫪 - ǟ -K ,ڠ`^OշW+;NcI6N 4>~VRӅ5F\tn+*t%¸|InpA -fa]ɽc.A8B+KЫDrm"hDxKʬrb:OTՓԳj(ƊУ3l47k8b8ah$'YBUC-k̇$ 9sPhVLx\T`NcE(b!0ZV;mDu݋BmhmEE }ыX~}>DSq= Q4CsBd7d{}PO -j&RlFUU|/^km*QR_ݩ1\h¦WX~nZj}v{C,tKW^THX>7S.+~(@ -eY,x#4D!_L,Ʊtݑy(u@dvkpY<@nR52j`*$ -(<fs,l%d vXJ|eaCY6C-yPЇaCyP5C_Ї0< }JN -hԫfef#lZ 6lTb=yV v{31Ch4 1- 3 +i),gY6\: 5{MzԨ2TW5@S :Rp]hd) -[0gCz;+Q 9C8]hA5x;KDd@buY~ZrP<.@-h.v@~Sϴ2tlx -Yض7lF -@X/7%/P܋>p=;)NoNCiϙ!(v9?w̪q˗1 -yR|L -֋9\@c{{ - P&89)b/YC*[CC=t}ۏ:mwf:!ip4uE{M){ e쁔4׋0<\O޹*;^v,8ɭG~|8+nvn}OOW8F`ϘIePUˀ)w@=zZ Ahq1Ժ7CfH7@@UX<`ΚO^5s`Rq3tnZOo_}+7-zN?Yjw0i0|u&sq,lQIDNưBHC8!Ǎf > -±nt(_I}'gAQІQЦQI4e-YwJbn\ -pspu#"JUA(;|eX jIWPs- O- O-q \*'k -N$+OHpE(um }d=B%{>^Av&p:!;{$F]ѲIpඁt.GT4Is$-caye.t{rY_Šbap49M|NwapãQ(`RRV8,8( --#aw%BS bpO-cvoܾ|^!s!g -@kz.X߃ꫠ'Lr;ot+`5%6N"n.Wp0zpmp0oY+6T<\b_l/ -W+iJWA^Ox4i 3_dMtycfLͽ353fj&ԌI9-4Lk*㚊<5܌# -z#_=xz)^"0Gw}qFrKsA -M|W_KR" T4Ḙ)%edŲ"Y,* |2(˵r\)˥r^NHN-8]5K4''{C&n<H<{\4~^nIp$6G㧌wWʲM؎&b4eF/Ҥ\_vF'nݕ=3ۛ=m3 =^kfF[o34wQ i=GnRM*G&U4h[T7N5OCڍ4`@!r^RE˅i+eCmo/31̂e2 e\2#eG* e,37F3,?p56pXh^3GvA?GZ瀂^AmTwCp}gw_MGmGW7NjmT8q\cpcf>3q?n{sT6VVH5sd?Cg=C }q {z@K903 *% p<Ҫc\_#Rśp4f,-$Yj=| -> -V?oŊ]l -ߊ؆ -z5|)o^6ƣ+r&H+V"Z[NW>!+Q̈V-yY!AZ#u -endstream -endobj - -58 0 obj -22076 -endobj - -59 0 obj -<> -endobj - -60 0 obj -<> -stream -x]͎0<b6"L2菚p2H@,m.}ן7v_mϭOO%^{m$ mp$ݖ>m$s?\ҧ_c>ާ_yRiϡf\}Uχ.6Tiߦs3\|:]ugŊ%s!jB4ϝr[\%ف+e+B{(W/ -Yx˼x'#cr2WOCBG [0ΆNп,/5CZ BH^}vxoB 7y[+wBo*Mú6#oZ6Wpwź/4Ev<8?ycIwqB~ -endstream -endobj - -61 0 obj -<> -endobj - -62 0 obj -<> -stream -x{{|ygo[6{m&&!"yF @Y4@br ޯ-Q+l6 V[OZ/U{b+iK_Kv3@Zw}sf|gΜ9sfn@aG* -2<>; 5=W]s?VHjݦ5=`hkV,gcbŪ -j,?̵_EwEȎcuݫF KkڮɡGP> @jcr@Ξ_@^`k*s #*V(.Ao0̉%TBTgmOXiY!2".R _I dDD?Fn nx<!4 ?P߈a/8!|à[!Rb6xE{ѯpT+܀UB5TG_DqatF'BSoE?$A 'HYHy2q=.^&.TE}lё#%DccG-Y7Kcnn G~QBo8vvCWh_|D$\BVȟӷG;"B{{! mOAo[DH#&& /ExwqRE&". f؊}F Lf1"3t1's".%L?nvԑ3{"D,Bg;Fh+m5?$W(}d;B/9eVwcI FX pFbFQDT> ;q^?;"0'"%NJ]қbMzЛu83$\C7:| =gs0g҇܀{Q0N\? %j_4D=7iǨylڏ)Q_QW>ƅZ8,h$ø -j3jHZq! -* -EٴS8gLJ z„Y eDC\hGVacdO(u-RݤTͻreҒ -y9پLoGv$͚dI4}NQ$Qr} -XۆmTd)[ M@. <ꨛ3LAc@Bں[4 Yum%u)O ?D -&dsχ |vヷaU_mo9$~6|y[7znk0XYqpV94V˃A4u -ذLLجbֱo!ƻv𛭸4Ƀ!XNNVƢ\'65{=o6u -K75 ؜3gs6qq5,,ay/FɫeԤًsͲ0z6+Hj izIYfhD۶=;GXж%ͱ R !ZƧZlY˶ix=P4?ٞTvNEsGaafn5nۆX8J,8GSފNy0+4CbStJ^AuA,<Ō5F933 - -M+u31 -{U^{֩ڙ-XK栳RK}13>mojSB3y * -ӵ$4t01`oy/%4SuVX1l%|@ -5(ԣJIIS.JP/Np_TNV.2\8Y Uț`V\I$faFqF(dqǂtKze:Y*ٓ/IYzq/ͿMrջ[wn={R^K~=ERlv˞ʵ]-tyՏTiZfIqb!S_T2r0s3dRd4.L#fN gOJAZQ%5ʣ1s&mb3(bMH/ir9[[Ozbɋ$ЊRA~ W:UY -[.M0kꥍ -MYf7^ZWjN{;^v.M}}xR%us#?8+(gvU -yee\jdߗU[r0f|+\rCᾄ,{3jY*wV-7fj}uK M uFf\_)(eU:)Qq^ufߧֺɶ!w om85l#w:ns>T^(_7`WRNOc֝Y4KqS(D]Uc>)'$?Sd&R0&m(¨_;< .t/Y? VT2fy=M$h'/b'$4'J|"IhL&IK8*R1Ȉ1.щLVqgʮd^VR@fega&KDت9n0,SLce NT*ѐ`T)$$* -!JjE%KPhVdk l`TlGX!(NW`@Qh)/YJ|URgd(p( ']srQ]G~ y1VUM,!RXq0[㫥!d^wX4á) SÂW/D1I.,* o#X`4X_$OR7#;WpV#_odڸdl.7i>CZV]+C_}{>1aT'9VjjQ4st,A6T:J|vP~T;Iv2w9yI?w.7ܰg& )<_\JnMʅfv+f$I 0gTlxD{l&#g.H;nyx?1p-=0Mb3]Ѻ -g,i6-AZS~sG9a~yBuBs"+UٶK,A}^=Rn/w -[[L;\,{cv)FXRq85% W, (((d=+bPV!gS+9v. E“'P5y8YL3SG[mcrhbqՋ;zuOy"Gb?GeMw=}˺ 2apShuQޱ=9 4Yxa)t(\$ylIRhoZe'c͗I_'$+V؃胪5G_JҾXXW͏Ҁf&%8KZEBܚғBSa_,<efEi^cYct%NՒ -ތL_7Wtp?@ǟrwuw_W46"}ݷͷ X+EʪiQS|a[(/ -E - -O `֊`զJ57j -9[$WѺ\wbh & - D#JREUc > .M|2S᝽NS)Hf65ןLtx3Dp%PC.TuA - -g0ACگڞmtϱ\KlZ+t)!-1AmDA5|wtGJ񘇟CLTU#gg*z'j- iuJ-/Dy9|qMZ -k7m[,H^j>]O~v|qUJs+>!ÆÆdJЋT U_ӽO+C)զӕMhh{&)S)]ћFc_b$MĨ35XL(:>1WZ,h1dLPbYatG -34xRN%ZTM㫓=O$*YXVY2(d?2=*sF$#ϋ՞*?oTJF6 -oTX,[v$e= ;lxwaR#Y'Gxs'}XTpC[lWVǞ k\@m:~x o[`٩kM5NC3qyY[p@%/tb鱒"+&|+ir v]xry=^<}<C5#Y=$[nO qHrѪKCgZ_(o ,^Ff7Iao"nR;s -I -OUKv)6'MIDK`4A6 AhyԒh.`gMLaW1̓x8 uZpމdK&yfѶGE>\XUX:4=]YVp8ې )nUiIs \4EҨGÑK,I#=$=jTEJٗ9NZngl{TQh 4&bRl΀i(`ܸ>UrQ*IeIV(m$e˲73v${<S"TD2T%U]yȯ"f }%_&?7^4M r'YI}ioO?Y쩳=+̑%M -I1sIrKVi+$<`J >S Ft'D:z%}o*2Lkc4]6p -v8,IVP+q -ZNw{8!Њd!8F 4 s`c9⩢O -oWQBq ->eʺۺ*ZYwYYOY%*ڡBh8 -\>:N:ul7<]؁K!St3x&Y=8n@(bL24Z@ S?l^3Kȳ -;R --R -KH;Pz{`(ц5]u8ʜsdi9S2f!}tjlnX}垷l9z5裓Ϩ -S?};u -^بw,4rɍ(مk bi - k- -x xZ>6[>5zyK'2P=n9}f9efMHJC1[ny}o%Wƚ^\tm>5(j?nuyvMkCL{lvx5#f\of!Vfqnvh XǹEn;'X:<6?\ -ICC<%Mk;]z:ݽ=ݽm]K;Z'/~AuogۺuS9FfUsVt!R.hsuow_ܳ"JWSLOn{;iZ^}]t]j{6vv]%/^su\ /^%/\{][_۹M^6ՎK5m䁾-j_;zaC[Wۉi[{MgGj:u8fX}`uzl\3ή]69r5s\;͒ >\>NfN{c׺FhMWuP QfmǺknA=Bf1!sv -ߞj9FKN.~(3}a~:v~m\t- -g53d"nRSuadO`]w)AE+W  8ki[Axc`\4IExvDm(QFZ82sJy}%ێPτgFNKha1aMYm-qW'#S[NL1I -=$nITmZ> oabP'q.OzbDg?Q)2anƴ -~Loaݘ8f8=Tx\x,lvuwa+&*< &>1s<4bJ*Q}ЈBHX(v{ -bn†Č;Q靨dhs -&&s$κ1lJo1f,iD+\ D na t!]%멌%p*lB`C- -ɐ8᜼|ELH5:\ -7mo{l+9*,RP6t:>dW^hi6Yܨ#A+wQuP'ۮ^Hth_{pG:\kވX2^akH> 9P"; rjRR z;e -G0F-LfNɘha4%i [sDo,:*a?ptTG) Fw=*8bK@;[B*&MHܡj7#ПcHm.[nK@N߈7?b4:N69թ#k؍+xu(ӂ~@Ǡ -XnG:顰u(A?6d+aaqgGJK%H.~4Kt2ԉtHexpqCz8}+LPX!Vj,tߧ@2>%c_t#INs[u1LN(Xrɮ=Fw]\R -=BQVQAAgry\mw`MqҝL{0)va&eak.iHHް{.Ik -FE$Oq?a=>GE$oe}(\W<qbyG/uoG3J{_p^nr&I3}栻;gv_5Uwor+lw|f-/8,%ѾyYǗD%O}JK}F=WUgijƢ1kFhTQC5 ɭ*3#*"͔(PBIBmXVCB㫡abw薬 I4@CSMhaT]*7ԍ5rGkCt(QeU7ߧ1 u 8UyZy.aYs`1Ѵ`Cz1j1jd$<&PSRV/Q8Co6d3bƓ&k!<>.Hr],s,Yp z bk}>.I3"^+;rQE1;r>XHV\lZ%25gJƚ2嫣OF~ڹa3m,oR׺jZF:Bގo<\y_aaxy6\yj#U31=Vsy:d5\͚Xlj6VRǪd~<NGh}5{1qnI9$ `H 0jք5ٯM-s=)Ⱦx50eZ`B -% -!ϲUBJ׬x:k<\I;|> -ByB&j5Zĺ  -kuql -8?a_#UtԥC!5e -#i%Gߊ p!|G2KHaY*dO N_9B͊Q%]Y -ve - wq`{;JÅ{M ľ݊=NM1M >mؾx};>0x:/,_ -endstream -endobj - -63 0 obj -11360 -endobj - -64 0 obj -<> -endobj - -65 0 obj -<> -stream -x]Mo0 CEB闄:Z$~MLi(bmZV͹1ڧn-xkLI`Wi)-_MmИ~,$} ɻNjC8N[}Tmۻ_0'eSgRr`XFQd; 37H -KVuQj-^~v.HErexAD>"QsAF&͎x[#c@qcO19G>G&ͅ8?!1,x bB^ qx2yw.IMjE}䱕y -endstream -endobj - -66 0 obj -<> -endobj - -67 0 obj -<> -stream -x|k`<׽?fdf7!HD@c IH $5T k}mxiYH/y+JV+zI;3 jg̙33gfΙgMȌ -K̛z!loܥ~pq+.DH.붭z_C{KsCӓ7nChJ1-_ 03[wmx#!ݴ!odBh}B!Hk7gwAz+BJj{[g}('Еߤ/{ -}h1*4xAddXmjOq8]n#E^ pís4}`OBp+:~/@Ch"7@h2܎#CyQХG ݄"C7ܯNdAGm.|u|ZNjxM=!dB>ωoGĽAtcxJ7p@qu< -=-UxDf.LX8pQjA&Aay:~P냨…w+a<}x1\F -RJ -; :C?H` -]>*rh ('wr<7s/3u*mcyx^JƑ6ׁdhq"x|\ ' -O ?.fk2_C9Co - - 0>BBY}h!+lpɬkF$y+~yog >O dul$=F>$8'fŸW7?rF>g>WGwwτwD^M"MKRW:"*׃vE?nW=&yj h*9wq4<]# ~rLq^֐DD <hB -rsYR3N).82h26%EaF&~5]8q1GtH+>D'at%8s݊븇h:[3\5AX[`܈nC;6%^83m - 7î#>PUs5!'xРVX.s'.&h`Ű lx!Z=_6Aa?5D 9|jGrW IaV|srlӦL\\TX01?ohθH83iTv9)vUY-f KsЬz-М9i:1YĴzƦ]Ω/p N}+Z)*U؉֏-P;jc` -h --ج-{*+&f\thXj?1Crad t* UTƼ -ڃlh_PSY ֎ύᙍ1E ɚ3ckFkAwhsٯQsSayMkmQh"R*Ϭ567SihrϞ]ZABPgM BZAkdgmM &5::CRFB3B-{mOAJmP0Vmv= zu{yÊa--c<1vU-,= -] -5IM4SО)Z bM0#1=TJcBX i{>FҐacDQ'#x,PfœBt$jW4@|h>ȶvj?|GVB"ֽ&Ekc 8М!>f";crdkS\)-Sc/UBU h{ꓲZ|Y*?e4/Rfp$TR.esWdJ/ɠY1~N"5B .Kv365zyze˺gAᨬZleyjLFhqMPCK`eB65fRп)15‡jY3+S?޽2)=GG{+G?~ج;kAV-x*, -f xe5 -OLfϨ= y5B:JDhUadꀎP71b4yQc?IДF?tf%Y;`f` ,v&jP -C\?Ay6W#PDgxJ$>s%^iAר5k<6rXM -y"\!TkMByK2 N31ؕ6$&~TT=N) s -upکqK{Uhl4֗9eB4# NC]5l:pb -flbF$pf3d@ -pU̶*\؍)Sjb?GU1P@5LqG]ܓ&Cd(H(a -?9 Yv ${3{k7}Y|ݝZϾ -ڳE~:RK83YwA -,Mh'c9CK)$C -cVW -']N3) -YB]ZfEQ?l". -0lPX k}U.FҡJGgW٬0-DK7:p]Z4-EB$:՝Mo-3fLΑG8gY;^p)!N&330 ӆ  vCat7'AnHD(Ja| 'SRTx#mwL"{>*@>׍T<\yQ:T -2)-;Gcc4ɩ>?OG>{AF@`o(RdXHe1\!j3.?g)([a3Kr^j}$M: ŤA$Jfc_H%:x%Q)) tiϱKG&^5v0*aُ`=D-,T^Fn1Bu2hEHu\D]]r]>lJ4;HXZ7|םCߨQau8Q^$K:ΰ̭ &* Bie]qOON۫}ޅz_y\(ȅm{\~>BO%t7a8"X}LCΰȔ#)CV 3B.L 0ex(7=ks=8l VhilʹA8[+;R M=vՎP*CtL0*e YsN - -edq7]EtJ':B#f61?Ƕ[zIc퐑-ش"`wY<,S92GL+3N8՞8'BؑLxle,'gn~IsæH;;=S%'`l -`T\b^Hɘq{.JK mW -Ff4FyM0:R&IFxL$pF'Su[1aP8#U2%=ܦM5~NfMMϺ:k_\iRpҸYYqǵJqݹod ~0KuDg?9ܗOp?yJW4Q;F'7o3VfF0\h {`+̓CyA6b[5̴Cv`sG?:ɒReEꢞ>Y6.w˂$Evzq%j!S̮w{xsw6wq]`oAi0֧_ {_Q|Z@v*>log?jn*΁S5s"cϚ(,mT9pzcfDFY3F^5҄:rE'N(P^tfBpTSaM9p?HRUV9U7R:y-rf"şE/2.?dِ"vGh2]A)C˩4k& -K9rZ4k7[ԥj46[~m}$oc3CIFٖ,k-˞瘂&۷ȷpAgks9ۻO -~H{lfB+ m,1)SVoG,aY%΂a_'Su0a;RDIb~qNݮQӑ/^E?/M+g7UwpjW Fl2Ž]+ R_eYT -jևdy[rXeXQ7EKv^jaݳ,˒D6Պ[-ҏЍ<#n3l$`. -TܦެL٩ ,rqty;&>^ L` -P ,hf<?05~4;(ʼnOmUh89~갔!N!tÒځΨPFTOkASDKsr*FДV5{ ~88(]~߫wOq g.U}/|r`G -=oU_& 7g??r}VaZxFeլad.pK4`q1[l1$Odc'2 -"0ZvC󏰣zncnj -.H+抻xq|W\_q!kmooD1^yT-oV)lͩ"ے,;P)fq[ ߯۴v]`<<}{27 -Ngg3]{ f9_B;%WsrʵUrkty%'O"+敼"wAY1mϳYZ[VaC+ge19C>ҝt&K'jsn0=xu{NsTe,s\Ґ8Q8 *583Lg[_:ٙFe2 -Zqf?Vf(DH~PD(a'(Mv# Hi^ʖ %Y5r {22'ED"ZHEv -$ZL;#k -/Q1?62:eV:}jBhc'3u~03Q&%w0Sص5$o;DJS̕6 -99kX +w߼--pOW ۖomy,v˒YOcje_Qѳ* [/|)l]7yWlUz!~':ttY+aIBN`LLA=<]tӖR+*\o`eoe,B5 28Ƚ;$64_8ZڂOWV-ze7OyIxQT.(&YK|SfoV8y oLFf04.f N]zrۘjY(IiƛPʐ.rȉ]7 k&I5,q '<|?ƺiyP:mtR"7Ka{7A/|=vazyJ}]*K - D (Ǐ[%$bX'Ԩm,_@(fᎍuajl G_sͧ/{pYrsVwfJEix#-aK";אƅEդIh64:W_}'LJއD7*] RE*-W1.#dUJ$pz -1 -Rjڭf%^iWGv9*)U-"T+=: u3<?2}[tʲMbGNxrطS׽P˫ۏuhc%᣻o{Mi>~7yzg6m>z#w~۳X?E쯼/qە+s7 K336ܚxӹ?,ί}-²#J6z -ˍM-k55555H_-+9nR2c)Ҕa=ޛog}'7+0TL#HhAbA2G4zjO/Y&gFާEiB^dxs{˼+'yO{wx vʮ`C+WQ-U-xui$!n%4?)L83z][Pz!W%-e'#e@g%rpmȡf0! r|`VNQ}`)+. }&bm"ZBd Ch({i'L®X -WQ 1+J\JeF ̓;1zT<:& -@$tFfRo2ĢѓΝ8!QpbEKEl) !Hw@2h -,3,Q(Q%q]Dw؁,FɮˊdMS,īd)AϘѲ7lZƋ+E7p3wn_rz/xu|mGs!OsgoDܰڳp!Z1|ey%X142,!, -$W,Ea,;kFܲ2xR5Dž^ JX b<$v}*Vy'2TDGZ3 uvSGNcfOx_*NeեVʪJKejVᄃʮSGTZ PBx:HQEE|$yĨЕ4-ī ofo -{M:;UCg{;>YuƬfGJaVSq?>M?Khf?A"G^X,(W&ҿMAȉD.s=yaqRl}mRzտqԋwNHAyh)> - :пXXrlFX)+J}-s&ӿ;{?`$.XI2I܀ǒk崲.p7%奁nWj&HSlxa*Vv1ZMdIՀD9eVS;k}=puz@Q!<=~v -(' --4"`p Z^x -dr''{"3.s ?e+E/AŞ*7A>2 - -y/ʹ*9 @P0`^#=M;TzYFكc1kzd&(F+`?B}B[wFȺ̀ Ҵ0Dy<̬ykVn#[@J[@J[@J[O}Ӿ}''$> qcw߄wR}n?N:~OQtcd/Naܝ56A烰'$@t`2tg%!/@`^@x@^J^ -l  wt|/ mCuCڒ]<:<"/C!U4ůD9^?yt2\#UYǖ#d(7^/$-Џ<(wQ:ZKP!:Ye!?yR(fb+-u$l=?o~~ -^x)_~ Q2cnёف~ќȸR-0,0 P@@i9ȇ.Dhtv5Jg.܏[\>F'M -\)(4)UrvYY6ʲ,ʼLd$;!*< -y+$"`P,"Uf`#Z.. -ce1!4UjؔhU_I9ݵ@-qJڙJOXyW*wU[h_ 3C{(I#3P -cw3pf&qktr;k×x ˙W?3Q;q9'Df[<v6߉"+ -5WCi˿${9͞8W.9\o虦O 5TΞ_4nmhT6VVDۚ=K'ٴɴɴlb:>氌f\{ZRڧ3ܔzC3b5||9͂5E?M%<7M Y - Թ y*[+Nkx"v~*czCEgBUEUjKPbSGh&Se|0AĩqVJiCS2f&b=wZ.^V8/}-EZ`'Α:NFt#е)%eѕ%HHF?TXQuAϭ -endstream -endobj - -68 0 obj -13510 -endobj - -69 0 obj -<> -endobj - -70 0 obj -<> -stream -x]Mo0 C|Bji+q؇hb:@6ۤ@;aUjUzL)W&н׈jhmzmL3 Ƣ76n/NMl>/" -Rh|>ł)lE&*pAPDQ)˥ gq’k>[K/4/=y# )r|FΉgZs  -yv<83 G??K|?I(q?+_= n7fhQE7zۣC -endstream -endobj - -71 0 obj -<> -endobj - -72 0 obj -<> -stream -x{ |T?̄$!&!LFB T&I2̌3""QZ\umWn޵]UMEpy$ݛ!s'@Hel6!MBUqe_vFzɮ5O|HwLwhBNܟэ :ÆpΫzV#=2׷:X/8WB@G2rp,~=! ~$t!L܍k~ Ɇ c&5'1u@p% -a8 -#G[;%"\K*!"9&x3c#0HDjZArJ˥0ɏLxY&WxGzJރ|THc+yE^r0׊-|O - o!w !o@瓇Q7g;/ Ab(Qũ#v=oQ2Q^CNF1Ra{LxI2l#FA*~"'[5 -rq`g }2b\I(-hG/33b JIo26N&3*==NׁOq337LJȽ$$sE:Lti٤E"2ӥc*s*s/[_VPN)H767Zؽ#L` X! l`"L&gV)||}-ڹQȭ 9c |!7P\tIiM0zFT -B3W;r-9?/t.~Hs,+zBoykj^$kڝϓ)Z]$ -HIp.(fI(^QV{ɲV 5QdSMSij1Lce-C Zʥ xϮ\z}~!L4NgL:EFC&XqRc&h>znldSLdj'6&9넬R2H\n,,SLS̥Kf)+HP#VIUtiJL̬*8䔝gX,'i6hEEřiͼԺ4)t4h -f-5Bn``bbݒuvv뎬GMwYwe=N [B -Z| Ly[Owz:%·_~7z@fnc!3yI*6Y{ I%hc;1y3s+ -{K`z5sc%ޛo޾{߾ڧ~ɿ^|&i'HFяn㜈Ynl,a,Nȶ9 w^Ӕ56qĻ'>۰ܢ1_Ob*y$9n{JE2rlr`İqxv#Ws-<1y<[P^YTFTxzHOa{?M]_;v¸O}Wu -;Gͷn.?g^9| sRDƑkc >;gfg]ٹ@#[K2t<`d -k;gG$ \z4?q4q(q`yH~ D -/X/,*W W؋kX\.5<}k}{ٿy'?]7qT޹=3 -'o#?Y;KKO$~g. =Qe`?7 (\3ݡv^h NĉVYHIƱbX.O5.;.cLo5n{?1&tʠT*f8ݰܼ6H[ [3v;qٌ3~g8 -JHngɴ]}bɿ|R\y 9'‡'-|oK -YW}J -nNn!ԋ ָW.f|4j9;$%0/ܧE>\\K8~JH؀>>6;hc%A!j%yHc0N1"EADƼ26׮Eb-ǀX±[d|n&2+ }l)>ٓAۉq‘5`Ww\)(W+k`<|P\==J )-X *௠z}zWC]J +| -_4CJ'ءý`( jiӴ@4 5r@g8T(Dw<UYU}p_#v*B\x`R$Wb W(q2gM;{#h$ 8w#vr Cq#2AңpG_o ?4R(x?s -Da_GQ`{_$T15|׷Ah8kc"_}=(eX+b1u ;'6CIWgt)l^gLssĉXòA)%@G1(Evb-*C4HbXL'$cq`x{lC1MW}1 - w_g8*iͪpjn6f$òJ0XB0Ca\90R@O'cj[UZzZ܊UiniZw+EV96-FRij\,4;wk+mjQ< N]wx'2עfWSjQZZ݈6z B7 -Ꚛx:w/t,p( EnQ8Hr8"vuAx[-nB˴3imjkwy=MJEq65PgCw-tc$00M:(;0nq58fw -PwCQ -ݺVump x@\soDqoS7bOۡZ<"s[]fϦPx:Flt@(vZj@ -\`ѻܫ;8m=Ө;k$.􌅏 -zG9‡gx xɋZv*+A +"ݑJ=蜑:&DItn' -)#դ -?qԎ -E8ozH+p"=QHKW UGHzTg$z*\"Ќbq-"}с>-OD -b wao<F>7O+CYyWqc7̩V#I01tqL8r>TǯïB - 3(q4l =$lqm'Z -~eָ8:f'|ǹ=u#C}|LP&f3ҵv7S2>"NGq¼z%&Y3˱?y{].N%[ݡ]FM1͟0~Q#ָcA |is.FSc~aO``/xjW%Er쬟?c<< -:C{98IG=z$%yLQ`yGռQL鄭DxB?%s_k8hгPp܁q,Nt5%J}\4q/fkAbxq9I9+yQ8f-4A]ívӸ$=:Jy]J~sNC4~h8ibBtp|L~̏{̖PuNgcg -sQJgh -MJJc9 eq)}Mӆvb0b8%e:Y-uNΣ_)ө?^A}F g4)sJFװ{Uȡ>=&hO/ʔ]\fF.\dqs4Khi3yȗkQnG&O=?Ϩ.PgM8Bץ$V.~.W6.ğyrmq\\MB-cZdlHz\KU긾kuTIҭ3w$y\>7TnE=ޓ\eu^4qeCnݧ\\wå`vZOIYץ,eFݺ ~w,P.ndP-aЦgSMQ\r+A{?5&AгrO7wz՘FNGZM,Wxj |fOU8[h |rKD#A:z -U_VA8[* -Wj9 -ˆ߮w^V7uy> -endobj - -75 0 obj -<> -stream -x]Mo  -u1C?R0Z -/ Mz<30 <4Zyh^i`2@;&yA~p#oLF, { ɻn.tpG؋ֆ**ȧ]]s=1!1jE|}ԑ)K]Wlr&3*fpj_х:C -endstream -endobj - -76 0 obj -<> -endobj - -77 0 obj -<> -stream -x{y|=2f2(/#ցȳE&Ud=iI#fܓ@jM_Nu%ܳ7V~B#ttSJ'nsE6!甇dKI*U_;Cʻ"{Do8 Z- Nա7U(׃(#O?/4qY -W\>seL2y\} Ǎ3zTȲҒܜ@ߗZ&^ըUs@8Z -BuERMF⢚@mK\ -Iq|:ť)А斸@ H9 - i@HS^7 Ro|9+ bĊߏ+ʭT]޹yzݔv]q٩cQx~ /VkHřք -jz`q)0u)d\5%f$.: ,ڷνh -h!]׬_&n- ?3o )b% ?Mp:?%lQXNZsS0O?Zv}ށEX`XAq&$w -xS=#n5)J!loM4X7ApP~?Æ2Yx߬D]"\Zs-g_9z-\sDžmPoj0KXoJcK VBuIq1XCPo(z K<r6ilP:5 $ -bA%WfgY)bZpŌ"qG`rzu)[5]sJ-'-Ixi -WR (Hѝ -RIS)k -jYnۆCjrW8hjRC 22]il1'0cּ1IFSs@7A0HM"Z,&O{\˂gTq'OKRF@iTԥhLħn)90bhPR]hC95QYfP`S -MtnT>; e -ڴ [G/݉XY^۩ >;8yMO;4~P]2:qѭHmTQn vo F\4q\Q@>0WDQEއk%{[FW*Febd F#7DM|QʼnJ:aqcD -S)A"*A pL [ ka"ZhBƧ`:2ZخZuOeT$>f~L Sz- Z8׵ayYS ֊h7h! Eq}Y 5A &> eO+s~o3 -@ K -(jɋeVcP0p\ ,j\f'_UʟTHeMM>L6~Vf`^*X3W|f&I}GYU27R\ -.(4ܼʮ6qNt)T+k?2i'?xĒvjypمO^z-9af+רWTBg{u.Qj&~\O&plt# d92VDN^xW$8NJBQ]V[+-cۡRGU*mfȦ!lwG9ЀG;|}meq~AՁ !,R>UۻOKMx{yI\(-q6 ivV"O"akaPAz{QE(t*Mh@Y>؈)nyު㽙.o֙]`].RQ?,4+G\ۼBPMjQp!>fT#BP`VjN)g@w/[}ohkxxX?8_y_G7zkj>w|іəVۥ5Q%uCI6TO~EvJ'ү xwus#Qރ"Pg?^}J3/%. =k$Sl8)8Kgjv Wfۉ*Yb;!_V'uPEI5l8T8׭[VZPP7=s7|wYю2qุIdrKk16|`oZ,>nw<ǡheXkxmuy[{dYdUB@bb+b 0^wQ^9+xort꫷Cc>χ|ؒGP>a[>C Kϯy$hV]$Lyܩ'ѭ^*tJ5+>|.FCO -Ϣ߁rJc9L}`TۇٍD1\M,Ţ-jMm4ӡf -W!y$ik6)_f~ة+0V~uu -Y^[Yu¦ǜUt5׋mGS f.%R*"T]TnurAe `W1$KelZ6+`#8ʇE|3pV A'FUU ZlԮVP3'LA/xGފ;G|ڞOכWLrZwRZ.=/*_cZEyE梱 #oҸ2& -281؞3d3 Qd%fܪ =Fp( '1Rb:n깽;7O!nt++Ua,!Y9a*U%9V ->o[a-si V+3{蹼^/#yTGIݢ}jL-ԛՇ"F -_;POKS r\ȸƣ (N~=Y{Ǣ+- Cϖ>ּ7<_E낫Z[m -;PPkQW͢Y]ečA2H_$upB#[6Ǖ&(w(𙗏r?R^xB\\ʼnsKXA?IE܉s b>D9-&$9 -3G #R,(GMJ|ϾtHȊ=Ე(GZ_ ےʷO1~=㕄 -؀'`$c6%i7F*o# g#˳ v B 4;|!:\ vzh) k -~>?D?~(cZzaAI!=)r1*d@qG+is(qrtWs>rJftl嘲Vu+tߟO;v{ -ʯRo*݋SM2Uz2ZiZ^)`4Zc@F!&g!u3r5͖4'+ %msFexSOߝȣ+y?qY:O"ٙSt;-$Y+ag ' -N7RL5|a<:(GsrX:FRwE~[Y+ aY7-x"T3jrOl]cy Z:{]qϿ~A_BBUh.!R>,˥V\ÈPTh=98|Gu+%u&A~)N,2ߒ107UA2`Gil6|`[|Zsrjl;:F}oH)xel+~)oGG׎)933zb'urYR09u:D n -QѠM*["NhqB|NmumLx'𥠣 0YW"h5@oR0lʪA|`243{>nf-ԳwD ok-`GˉQv\f7H3xR@*cN2hj } !1r5eaᷥNۏ ~$tIK:%r'!SBOVq"M12QU:^MQԠWD,n.tQD/G9#F(3dv~gdɬ'uBwJq1e1e4KZ5 Bcm%\7y5ܯqjP -F@1>#lB&C7at+<Fc] o "ڈC ELcǵ- gB;ƕ2G)}0thSʋ*5pzXko~+o~k'F7*}c+_U9~d,ݰTphr<NmwFZiMbk<0=Yx<1@*=~7x 쁩(xp8z@oYnla"N6#8ƻk'{ -xGh=& ؅y)}&z W*?}MϹoO(gY"Ayp -olG&2*UȦdXMldCK6P -'AʆRi2:j&Vhr}Q|} -cz})_)[t;^ -)H}X1 j(hV"<A -Jd@)upb:rc:xWYDtLD'upTqlAS`6vq `t <&Fgh>ֵol?nF~GtUޭtK)xj#EU0*nrd 17_r$ -&n3 - moCd;!b}vn2;Hi7%JhDM;CC޶_l} g4?=ȯ|7|ù)H \Nh̩xf=xƑuZ[P͋2=Hz /8KR`Tf?19|#j8^Uc&ӫ?mGpRGpHv=lC"zhCdR)5_z97)\  ;?_ -*eKb4jN5vHxJ(>t7'37lHy_t2sx*=G?z(ݞw=<|pe)ޕKzOس[Xg(!5.0=euEE\=d4_#6Zm3TR|n}~R.;=V^ ddxS{@ɰ']rOcPȗn~ul{?}okT>}[VձiV x~r -pf8+C|Ww5>{C%dyKG]Ѵ~8#Qy͞v8]ʰqULK4he6g~>3w8ܱQ4XޤL͟PLc^|/ jtɓH=ߎ/q7zw`x\]7-_2#wTgfqs34Vsn#l*!vzcAөhc =>{Pߛ0;F4J(8X| sovu>Q -F57/ 藯pGr6|Ռ_jŢ~&.l"&:Xyx7١ѯl"z>4 2.J9U~+/xC{By8L0kP([ʶJ@3fڳ Fԥs~b,hQE}] -تH!yᝎ -z&7(J̿|w> -nQ^\ٽ ?X^6Goy%x'Sn4|׶?\OcKoDÑi8̑KFpPPgX`6̜7 -:17T T>9騇i:e|t∾2:C5'O)M嫸'۞ YY֒aɲ$z2Fs(Y6ZMl$KmɲTj8kqW6- Iޮŝ1)@*/Y&M wKS½po()M\$B"izOk̮E XiN':96)+K^P(QP^RVV2rS!H]Q)$zCmKCHyzwEc#-S"5b=1)&5;:ZYck{o,X'rdYoW-IOdDڗKbhgr(c!gz]ҊPTjkv-E+q$ -\zzˑ"代=ճXRD{:$Xg(Fg=^k4pVt:J\X:PRHox9c8ރBbH3jEaĺZL())Y#WM9l% -w/o2(]6b7"5t*^d-Y<ߎpO QR -猂 -.[J%K1j -c_;C*K%Xd\i+JBUiE)Aʥ/2Ҟ\^JeiL\jI̙>S|j9) P$4sd(ƮH,Z. ..IEZW R CXj%a!+I/Vck>IV:Ť%Va{ -t?S+$u K)DE;D`Ddw#$,"T)DϸWJӾDU~KHQ(NSH]l*로/g/¤?EBvQig6FҞsTäzTEF;h -ѦrgRK2QxEqudn9rNQ72[5* CLm ZOsjǑ7 .)NQReSeb6 I,Xcލߕ}uQrg`3=wgEB[:z*ÌيPWb~btq|t2mOpqR[rVk)&5LnoOJ*3/J1!e{e9 mk %K#%fͬ5U`Z^V#`%G -3XFw[.Jp 1xc%xYvE'ӻQe)rG%LN)I\G0 i^"3{'ז -ٵg&&%']@ mHf-ϟEBcD,Kc=03<g\&c\4 2>O>Ǔ -ca‹z"ĞY2g,KyKsϜd=Y >+Y/~|x)AnCJ?X!|wzvk>'OOl; cc}Dg?\i٧ܧ-Wx93~G> w4Οr}-7w8{gx->wk{%ᕗs} jj_}v^ػG#{{ZDyϡ='{AuL3g=!eTkռOQ1ǫ/l; 9?ַtGm;w\ȓ}OG<$cUr}ρ2wMe> ߀Qx`'p -|[m?3*=ݛs}?Iϼɷ)iզMĻo ߩnjqowf_0[82bxE*7|NEW38)Aq{|=LȘȘp]B\k| j|]W;g/qur~n3_a~/6yN~Q> -endobj - -80 0 obj -<> -stream -x]n0E -.E ! ^:Y$_޹l taᐜҜ|{a;E6C_1FC|k;gy=>n^gϸv[C=md0k{}?Տ*Q?:_[{d=<,/1{edMmC;^|.F&cZb}!Zk"J-ـy .%6"Wagο_kwK7ʾ{D_!Wӿ-;IqFM+$&wR+8ב -K4Qп[eo7`;I.kпOCwb_^wOmMc$/7KX[8X2O=vzx?{mQ_)<ȒoƁ -endstream -endobj - -81 0 obj -<> -endobj - -82 0 obj -<> -stream -xռk@\09gf9\f@̅\L& LbM`k&FڠƻUjSkmZ'VU&Yk|mmk pgf0}ߏ8s^{^{־M_Ϯ6b"%Ҷ-ӟ!"lv W;cxwK -ھ_m'!B -tĢӁ+ul(xAξ/x~F,bG'E%7a;[n`i*ղ_4`xwo_+)'dsJz-ޭ'1! Z%ΰF& lr{r>@M>cfPpE圹.`jiq͒ں -˖XIohn!ҠYH$N'}cC!d=%6-O*a2Dn!Ʉz!dB2??" TDF(9#Oc#\!w'&!;H˓uM~M>,r=9~/Tcvlπ!1r,FQRÓ~؂%a;oIx -=@u0h=я[u-YNL9Y_#yy# - u -eS 3v;Fn%il;s 8?fDTXOsl1)-rjr/:r;17GZnլ<!MM׭]Y+/kXZ_WfThU͛;rvYdiE.VhgeKP 4%"&((ؒcb_-XBB))1JA1RmP|6i-x/aF*Z.Q`] iFÒ6C,r`ĠCqh^wqdju-ȚZo^^dֲ%XKZdB$E -x|<͓bSkҦۂyuHʼnČκmYںDRꊵzVLT M!`s7Ғh %`$`mS#c[&xDǟ=M%cpQ4+k65%z!_̛8/J&dr8/Oaá%#5Mj\$[)TM01%e8XRcA&e:DV˔ ޼A VWDv M2 sef@Qizߋ 6*(bn,@DF7ؔj1 ${xYsİ:kig&BxIBV]&%-a_ m\PWbXJRVpM3$<>rB>&$Z ;ljmObVwb7/!E"vȡ#^*Q*+M+W4/IM)&UALdfM""f#)TܚbxI -HjxJ|RE4J*Q,gI7/~Jf1,&+Y -SRI0! sI)t+B/6ۂ`"MJP.'AyI f!H&" -3L&x:0%yY*Y<\Rx0Y Aʗ%"{R5%PMkKpӺM8̒XMx5=#ѠPF*@%"*ɢg$Bi*G4i 4x"ZDL)!,KS' -$Fʒ13㠀GȳE65s~=ȿTA$q=Mf%1'#I+6G}s7TKnp[6b.lPU%2mr3|D"w~߾ZX)'aGr(a ,sLl^\5=Ť xN$jUF0SntCݰyʧ?pL -9rVa3\>]5Fy__?08x]|߹mGU O)3{L w=ҺTfXt,rs&)V;!š(q> -!=ij[VU^/vA`Uk۪e lgn/꫍c{ţ{yg@G -AY",GqCOe08@wCS2A -PPdr~ l@Ԏ)#@"4!B԰-j6`g3B[C&O'wwԣZzqC`z$#" 8Zmvu3:uL0%::^ƢzېG8">h` @+9,i~*S<,n֘B{MdF\ @UT3* .$@3 ij"dNiδSۓֆtDLUꄼa6 =/C֫>{1f&+;TqP_6C:פvbB'Rp9Y(agYEI -hvp.d \]sA ]p .]@\0J!9J)&t}u4%8(&9ٴY4D2|] b-5.}vQJۣ|mt*t33yD.5F:?3!6"3A ̈́晰z&E -dR82Bg" %PS,߭vY_=ѶK˿=ʞ5/^u d}eg{ڇnpढ़Hmժ%~{Tw6z]ΗzA1VFx}~}>A}Ig}p'|0#Wdoyb -e56o>Ȩp`|0~} @#%әH詔YN*N(.;?>7︸fvI~Yuŧ(sئjNdt#~?+)sӨGjlfdxͶ-% Τ`mvgp'0dv8b}vCPk -;nS!8v`vÀC ځEyvE$idݖS=a:Um'ioFlUZ1o <4Nynpѱ_ = T'e) -n:v^mQaZ6bWu>'͵fcF!&˯Q? ?c -#GV?4~(&d CuO3y|n%vO&s^B"z%]_ŭp]t5=׮YeW\&66T#Ӵ7#=r= {Ҹ`v~c3g3c+,"뇏(N~x7S?S ~~xbSfS|?(3?䇇S=~ꇵ)O14)*5>ijJ.ɤң?"HVVsQ<- -`CVj04O=1oQUBA -O8IK*[ΫlP^`nEӲ1:"|;l*ߺ8'^쾛xǺ81VL9p͆9Q_pHtuz^`*).DbNMzڨ BeÆ0 CAaІ0 -04 Gpg"a -Cų Ch -q( }aPA1\΄a8 Zƾ0E8| -TN;aha~T - Cc;y<~^*HҼg)L"iX5 z[H@$$T(IHWZLhe]j [jHu|\;z+9uuM7"oIx6+F[J29(oÕUMݒh&3oM~!B>tvCp}="ly5fQmf<9oZhZ3fa #f8mfJV g3Gp$UH,VF촜i}f5qSfTfHaU*0MM3BT٘:iHmԱ}L -̠2 -]-$ísFdhC]~{0Ze$K#tͭۅWz2WxB :*8v-p BQPd~s]ߟѭ}jO@+6F{p?.O 1 -TƼ79R39Noӻܚlg66iY5N>59pjj$c=k"BD7LdC?ᤦ'YJ 흦yC5; -=YKt,)9d*3t J׉V&it[ae ZhIٶl[o4 -Ay?g`07Աh\ׯc:X4 , 6 0vkF_!u- "[ҡKN2BL,V6?j)vx+eA)-4&)jj4l9Fr(hٶ00C|:Ħ4FÃ0L!e4JE/d~:"yj: ҲԜi=3a&en3@>A@eӀQtعB{i{уn62ޭ7]}z|xo)xvzord;mq1ۡD%qB1~m'U˺zuʠOL -+w砩]޻An9$<-)q}B8 x~]&yWDYˮYGͤ(r5le$*.6hEA5QG"/GBP - 证h({ -p50Rk`(E7Y$5pR[?WfU&RfUJGՎH -( ڤڤx -j"O`xY3QE~:YX ngR4I5ץs8D7RWD?mλo!V~la_%3GfV^''vnѹ5Y.Ǘ~#VCw; -+av]w=}I796DYveMa*gg ̶{QW۹TC0JB TI9;bʉ JkZH|hqɦ|m_m=8~w-ܶwm ?du -[۰wS_.[aM7~jQנ^ɣvM~ V5ǣƢzfccQ5΁PXsx!9PM26Sy* 41m/ sA$Uã'7d7֎o]^؋O+W{NI_]~ ǏoA8 F`e@aQu(Ny8ψBf. `Y k%, Fyє\`**Tm+*!(U*UӍ0v汱GýOhdށi0m?{lf,C8mtV8mrtNx`G=}h:e(5EO%7z2r@wzy B Z.O2E'veӳs!s~{]Xח*u{4N!=kQK73eǢͦnSbxטLkE8c,1Q{ qDC)P3ݴL*e@g\8hQ 1'䉊711~ \|'d앤eܠ؛'$!ږǤ.)=F`|z7jj=kdzYa=N! ;O -tG%rgiTE&32 Mt%mq`  -[ʌx1{eac3VVeT2c/z+U>h|p%'@&2O9zs٨u zr8cd]66K?CkɁS90'%ajRMK -ĪLlY^&&n ʎ!ycp' Џ唊9ϱSftߍm&He:Mh-XԸY i,&dL6٥D8`e8B~twXIǹ(mSݛ7@RvBit?EZ. < -)${v蚣zV-EAlDn2u$U&)N>^}m/ps2jɣx+p=׏dr9v]D}Eђ|Ckjٻ=(>··|8Ga_>D6* |\>͇HF2H>!詉$N`Z94q&c=q19&M`Q}:@g-Ku?|Ƨˎ7U@ y\lU3' -y!6{pzWQpﲿ哯茟]Tb?A%i#?_3aPt}Q+‰ ިr$Mʡ4鍲H`Ċitbv>ĕ!ki*lɭpR+tuo~{n KnF7Vz=wp7۔~6מZ"TE AfE'ESUU_e;>_R<6jοѿVH3.rNzi4|ZxBR*SA|Pduz4Q 1堋ƇOx u2 &S7xM?wk 5^…fٔϾ^yhQ% -yΞM 6CsjE5Yl晓dP9:MN'?HA>BRTWI/T-~v"0i&5 IWz0o+36[nj- -tȇYeՒh4vd6fՠi|,. tSu' ;N'Ӥz'qBE vkNx _vN88>'r&T=U8 vp CN8JqTŨfJ5. 8SD'ha<{iꔹ4 Mlস?+s8H`Chz~'f835[*}r.j,KxnW|LUj[TsF9m!54#pRCyx<桚+~ی~HeZ -EEwt*ި0ǚ&:H` -~lrj=?皔X[=,ӯyUoܴ8(;xL׎뮿J/ ?%ʏe8V a(zY9.{ ȧ6f6ir8l3 ->>WNN - -hg}|*a -j ()8-ʹ$0WcnC-՘r9jj92zGʴ3(.Vs37twꔁaTwsN}WpvB< -^a,))qqGI wí0#arj<H~jNզ,Z-5inHY4'ZjunpN8GzG }4"@V)f5ei$:ܱ [ _/YepA3Sj $W9謹\A7p[o7{;^EOgbWH}u;;g}YJb{ޣ|91D&#a4amT5z5.Nd d\TUm~`_؉`E8^ -/pu6Ѥ -sf#|L3,ll"H鬌1<{aӔ+tCGnWЅ5ޛ+%mѺ7|[ QK?g;s -;Lϖ2d=þ܏2%'[c,L@|(|`2NC_+OoWETXgSG33BmV8HMglI}|˿.}x\w^r8}gci_%0l737++9[h`w4.G)06zsoWΎ?%|^~5~?눤XlBԑ]i~9쌶; \?ttA^ٸUPp?@~uor%ĘPvDy& -ϕi@v -p88! -> -iVG4ЯAN~#4D -jT)Hh`)^MH\KjR8W2v{jGҬ#Te4ҳw!*8ki -@9, obzDy32v]s;T?&]FE|hS6azؠ#nj;e - I7e NF -`/`(^摙gf2nT2N΄jdc$'BlBRc] !?)Ό -/)w?l֚L`f0VRϼF 0'uY\GZzG(c*w-^@z+wGSwć3n KAp>;/4a~IL'p -Aal^J]mI]wAw2o(cp\zBA3: -=pzXkzzRsPOzXPQva= CPsz84M43HeabzaB4[9md %> 9h\_r(TKu~l]O&Fn5~z͚H<|<\ X[H#{ YT;G*|#̣dVB6ⳇQӔgd>)f}q%[g+wfig>Ӏi4qf|0}|ӱ쇔:<:V("PɣqSLMn!3!Ik!eҩq.>[ـjB+Ҽ|Vr7v|s3l-K9 <<2qӹvMNެ6c!tia~auGlqknϱ;FMxss[}6)SߍKϊN񁼚;G9,Q2ȥ S)~JLbnH0dCa -a-a< g;a=d]&6\/2ga3dɰ䰋9LM0zz 3$,Õ't$ݔ k; 9py*֓\adHe ȥzK2l&/K-Bs{g_UmbkK_;~eO>qby2qiwmxwOK_gwWaTrq-7K\ֵte6W\پm-={u%T -m=JtDT^Eiims>m{go_[;JHK_[W*63noFzZIlWOgok6t 2رmwxqK__[owWMK/օ5vvuttnmۻ0q<"`[wcf!=m]^b_GKm}=ZvlgsmNׁlWvlzT%yӎL;w{wSKzuae--[;wtai-=-ېcȶm#1UR;ކ^t"r{nYjkkUjDwLX˕w }%wwan޶kOq-z1-K[(ڳgOiKkaϔbɡwe-=J);wRn_떭WǑ?HD%Dsvdx_oio+I-$*FZO [0t8Pd:Bgໜd)buc/%\w -tRb)r MR@s2̿ -KXbjf"YG!g.!I/jCV!|S)} -Sʑ2+E/?܉e}4Eu'ruchbJR#:9^ں(Vj\5cm/ShيL%wc#ː=V/ն^}paXGM뼘•x/Mxo]*)Ux)QV[dέ(w⿭GLmIKcwJ%Ϭ$w/ )}j/O[|j\W{z'Qm߁W&NZHCeG;i"Y=T*iu>*7IIi8i+R|,}RZߊ9vкU:tоmKumA_ɖ*T)QPF|[XyUfʦ';(ewQj[mT`H֤xHʛVZZ/Yk7We'U>ǹd8K}IZvA%0N.B2)T3GͶ)MO+N99>zҴDW&GWzX:h%'9'N)A5Sl/'BNQzz)/Kicja%yZtq}dVh#d*h&a1Y%L+RXHo!a| w5>9Q!|/7GV#Ty/x&w]2 &1)?F_NzF1`g ?c/2?lٲ!d#ޏ?`}Lo =2/7aɛز7ތfM͛uaql8>?|jxdxt8> -X <X'#`}$/v3p?X=KsNF9qYVJy v0>8A>!X)cmۊoCi78p#ۿ`?v3@ҙOؽ^fkŲcR6m, l\:#`9D]vX]ڈ?h"zSuu`uh5Զ"K[_޿]V?#аt^44o-py)<տPJ3BR?>v[3&Cq+c6[Z뼄w늋W<_"ٔoiƄYqSqFr HkJ|V HJ︓D{{1 IbnU$N{uT/ -.V̽(_JbIݛ,fVh -endstream -endobj - -83 0 obj -15688 -endobj - -84 0 obj -<> -endobj - -85 0 obj -<> -stream -x]n0z -C OcǀA>,юXd/gml ݏ; Rn}nC~ -~Ȕλ]Hk3eE=>nKXY3ݖ?md s?\_caX2[.cB]\s gxL!2VDi.ܦ -s3\BV:u5_1tn?9ZUԢ+mD{ m9/G+jѺ^62+=[-ſVozONUɺ+h{0_A"Jow!+""!^x?A'~iWЉwwȩ-4 -j -t&}&~5-V$? -֐߁ߐ tO`3 -x_tGM?R^%'+'`ץB-q&6#֒?=kɯC~ -!b~l%6I`Eo>ϱH>o Q -Rb -endstream -endobj - -86 0 obj -<> -endobj - -87 0 obj -<> -stream -xy{xו3zK^fF-˶b0lc˯iْmm In6m<Bf& B6$MnKI7Mʆnm%im"W#chyf9^ɉ`x }+Zebڑ-E -ё(Ϗ  -E/U>2"Rq%㉿P: -0 -ԕx_Dp/?8Yh%Kh,G>0~CPAqJZ -F9b;XUw8ʟB8 -J3n#,u8?Ï$ >H}= /"N:xsŞ 8N/ ԓϼjM9gh/0P'5 ނ5Ö~\.28F`p{{F1XýQ1Z#4'3}w^|v(%=|Ki9p4D&𝄿ԇ2[-rܵzsUs -PHD _FhqNjRƗFŠO}դǗeio|RlH g͞uCL*o4(iv4H;F Pn-Boӄ' eyʅ3pKf&3٥f5{iZ2ouYIW3[Wb@S*+ӋE97,e*<N - afOza?e*bcghZ_'d7q2bRx?2 zp43,Um3*-z ˍf$PGi9nJSPnpX  -jkv>W2e-zrb맾(K`1r{6+X&pLzmla zp[vXR9{p$$m+pI=5< -q=ݶ;.Fgi5!{z_4pOoYp%8QMQ9JDQ1~E$1Ç.`4UF`23EpDdeHSehƮi!hGq9mPY<{9!icpL"'cើlcOTH/,QL6n+b]ѩ?]l`IJLc%%5PcRhJo%V'1$ߎKR,z6efʏMes'FKxF'3t{4)U*,:PEUW^ռnLPnw{͛6&F~@̎yz0yGr+~w=duMu/WfMHk >j[Ž+"+<a.xJ -se<~1FA4r,>A6G1ۯ-hdmCڔ5T*/Yl*q׺1OYZ޲Mz:JΥ[T@Ƕ/y ǧ?ChN4:ڑ?z3|^\3 V`ULj+ٌ᫪":c͞hb9 k-Mn˟k}A]/8,+pN,%O&W.%.%Se[4og|ί\>\{=mby~n[j%KDފ'_NJ_\*JZ)G~ keZ60rRYIKCM]ѐӋ}%Xqٛ~S@YәLPX[p[?vC32L5ςɝ͋7{n,r$*L_\B"D3 rDj-dVC -^ୀ~nƸgiYI)S4+h΂Zw\,WÂJlW:b%CK?:X4m{c84xkێrF{G׽s*ݲ]w!kcuKޅD})/5 pǛţ/.8;Wu:U -=ΝxGxA"Z_sV^N?Vjjf9iuڼq#9Bs6ͪyFR'kݸ2$Ei,&pWE/T4.QԵr8UZt/9p0u$ -G+RқGɉS~hS/[ 21aio}Tx,0)hh}XV֫ddiU7􃯿8Q ?k;'8>Sv:X/-gQI8NkTK[ΞkNV)NvɛV"hkn:rf8kSUQ nSG*-C'K֥~Ur^/t4zTND7rn<n;=^ -Z6"h:EFA+S-&\)+xRb!-$b!-B,XA}R)p5򗹥fVqa>􄘱M4H*R}ڤ"%[T]}_ȣ63?k;;RX=A,<,KfӪբQh_ѾAKZRE"1 -paٕ?d%A:%#`67qK}WswR?{gco5ZO`%~N}lkϚza m\8x*jFc9N^cA]H_hԺV i3Wy& -4¦l?poW}e+k0"^;:v1:y6Eo!hx2M&MoRrEhܘm _HYeꖞJ3%K/Eo߷% ֐ I0{y?Q/%8i6Bߎ`(dR - A%&a+B} VdK -/K(~KT$XK$8Ip.,V 'wb0CXxd4!.*kĖHdd,$ĢX LTjVV#v@Bl2bO(nKCC`(&:śňB8TVUUV_gb< Ϭ@04m#7Z%B#x"CbxB}Dh"!&bPBD#Q4|X8 QmfŦ'o -$xd1G]hYox"wFŝ #88Kqeb"EUñP|4<1"Yt2h A%b.Lxg -bvx<׆vݑēS06[1<Ev0X(4`x,@iX`#a YD0b40lDCh-L4㑱rOBAIx,J`b9DF@0c"Ci0̉qXǢcJW&.Ν;+Rj03(!)1*e|?AS:!vF1>^4N*lVWVK*0h"^UFb#No4AFN}Ax 4.<PQe*[a51E&7P 6 -YfW ԆPBrE<څaV!< rٸm]o%w -:nc _ -XJ$]Agk -de!FVE5+B,q 1,ȤR}ø|l&Si`\53{C8lKFrQ)[`;7t^ַ8j|v0v02:lW&f̊Ri,v%T(,A6߄4s+RzDin@ӱCΩ=̞qwu̾l-8X3b1+p5(lŎJ3"uB8B"6ar|=*VdsG8:Yn'!f)+ 1;c(mHuyWPZe'4 $v!)1ٵIs2ϒ= -64e<cjL~Ye"dҜa5, -'LmEpvzTsO"`H8BuelgcU`ԅO%٫fHZ3ͮ%@S🶴{Bc_ QӟA.ߗ..O^N^.#}s7'K /Bx^agjעYe9qϠ $l _H ?T&/GMSN TbBE_]8DfșGȢ'O?xOW~V|y&F f8kG2Ou(o. 8=f* 7nh몄u-eB1k9fO7|W\BN;NW'`,Z֖:A"Z^iy-G[029>g$>[L\7wy=47i%rr<8S^~AnO}dO>=]뒊=I[/8ɚ@=DCI VhE #aSQ^~"|;R`{3ġTIb(͆%8޳- -endstream -endobj - -88 0 obj -6895 -endobj - -89 0 obj -<> -endobj - -90 0 obj -<> -stream -x]n0 > -endobj - -92 0 obj -<> -stream -xY{pq߽I2I|ЉQޖE$@Ҥ(dG$ $#bb+N\7Mf&h\utlI9~H?N}J_==[/P9K/ĢZ!7@M#ӥ{>uɰ%s5_ ,EyT26l4vr}*MMIG%%d>b\o:g`U+G'|($CZk I x 8EE'6cEvۦ(ߜdOW.G?,~1B1xA]($]IhHߣC8.$óF}}*l -LUT O8wPźE~_rWd> -I1(8TaJ;r{fEY~ 3Y(`#onD̪:/cȑCz=]׾{vڹSuuoܴYt4X-U*JK&t t5ŧh}h)4Ԭ ,fik!CӷXz -KPZ–qH=J -M͂"$QtB, Q[VtR:"oURK -B۷$AYOK+i}Hcw:z#T-B%ztx-_=lP[eDhoNr5mzңyVەƣXMɪ/͐4YԥnGN~u.W?i)YRee.#a8@!|Į -P G; R4п.ŹY05,!trY1@g0ea?svӣͻGz-&nn7?j޽5nY/m{{:mιsw͎feSi}]Πts=&/y7:z9ZQ Got?sw̍?6H؉ݫ̖~A Αi?l/zf*`Ԛklj%%CKfa -M6}~dž0kaJvjmx͆ -CB -S6Tmd7õDa6$ jj[=n|pz7QN:~j&=GzVxeuv (u:GZGoV` W@]kbiPpcU -VԊg[1يxV4zZzy퓴*^-Q65oqoڹy wPl*'/f%}׽# _zrY/k}l/;#<v{:^|?Mwwlxꤵ~GP{=+Ke - -rOiH]w wQySeguJjo<.?꫻wȅ3[~Z6H(~ƾ7OK -x#(u}X=%{46e!7ip -COIҐ0𔨩*NJ6#X{t%/L v8i&z?gft E.3]ˠˡ1 -L`FՕ7 - -vV;e' -4 Z]&A7h3l4=a%tɠK42j[.tFŠ -+]'t5(L<?X8:IJlkmzə(NSɴ'[Ͷ -ѧeY"OE l4O{p4YU}+ϸh:%]m&¢[qg5"9-}?KN\KGgl4MxF]lXFY%"llt<p48Q'L$2Ae4]CZ6$^-Cx"igbp2,g:nah-DrB.D۩t4'fXF Sf٘勞f6;{Z7")թx6F6=FsZiWfeT: jȄhim*>R„g"Ki|:RR43̭hgDgzi*4u|:Ȓki-Jxl8-N.5e)\fSTԩS.hM:eOF?< ?[7/1?? vVmmF -1f\+Q0Cg3}E@#^#* IHiH I}ۡɠ%Dɋ_57 zV>NT?) Mvm\Bǭ${2d%mDt?*dT['}\EYѱ B럣{'YRT0nfH\DDbTX - OOVdKdf+ITo! |_4.;>w?}t|?t7mq<}x:^p+ ޼#u1W֫W.^կ<\Htuzi9+UC/^_mu2'/?v]6'/H>uX.(]uO:SO>ѡ~s3x\qa΅IC9|$-uKPޑ;R8Ig7ﰹKxwvW𚆡IzNW&DhBz| 1w׏i&dr|XNʏ/˥e8&9tv!P⸧9,}[gKWgw׍נe권KHMqøj[$er"[ ьh[ri~d@/>z(zL%0>q,8o -!ÉE"K -f26q`-t>'. mmlI!yDQ2C'mgyÑD(r -)DX6^- -9 -endstream -endobj - -93 0 obj -4711 -endobj - -94 0 obj -<> -endobj - -95 0 obj -<> -stream -x]PAj0{LA# Җ},]A-|+i =H0;s{i 0`&B -XVV -w5Ixvpj́V؝q i$cG}Ȼ/(q97< !ZWPe^nU8{5E!^Ci))Nq(/"*㧇>&\oywgJN4Ŷ>f*h,;\}[tt -endstream -endobj - -96 0 obj -<> -endobj - -97 0 obj -<> -stream -xY}l[u?=~/%OA(Q,+"*ئ( $%YAjBiYA?N+8e# X[,ۊ ([ EMe9$=s{nW@d4fhYͬ%g#rk˫x@`C!`~ ֑/߰_Zշ{$4Xߑ^ 4MB_Q ?gҹ|;<8qg㛿Ay' -؟g/aiX_UjV7Mffr8Ϗ -u؆ƇA0_Q`2~<_r-C~mnΟt$>\ hq#%zhA<5: E_٢t=RPomE8>܅kE"=(G䨸JxQ"$wƙg -W]#ݙ,͞SY:kZR ~W"[[rOrlmG2zIO+3|v1ܨgd{' #;r@ -Oy -@=TB16Qcw@]0[E3+;(DY(BڬnHNLIdAP3ddi%c݋ݤaqF@fn@h|x|bk@dI{3S =sP;Yo3m@;Pu8{vzN:Tq'tv۫f#HW{DwnuMۙ8MfTY.SX}b*Rag? ܯZ+ -`ł}mx2'3yeAc`®TtFd* 'H'zQ/m& Q:i:EܓySЌ^Qa(7 -z[իZX9ҹh`!P7>j٣店cf[fRGׇ"bQO> &^kINvoY^з94Zr9ǻHchn|:~A`U -}H>ic (U;1#g ]tDǏdʨ1wp/gv8mkMSR6KqGupc88XɲAm7]{ a"ah鱺s)j7[#FihoiHuL3g,x.^oVD]hȴbѪ^`(06gK##_ -"#--#`өbz:b}f[La2? -)5EVb\=>\km;$j.ߒ۰ -{P6JڨG=dc(YcC>9?4(E)=tr -]AUhR -֝Y!^=>^Ĕ^|#!U|='-G< 2 4oy،^o/kL e,lB5LWYB8Iz&I+ƨ(gYo=9=#R'=h@X6r>8i68}XWY U;f,,l0E4@ĩr(w0n>ۺ\vޞw4JvS q-oOS5*˔u{yF3k(sUV:?<4 -Bߍ}-5mecUǓ\tqpѤ?-UTՑ֓w蚊ZHCTUc通ȕճ= -`#F=`=<[p 5%d=9HԸkUtŠ -w狟^5kETa<^*TIh9 -j^W.޿J92叄 -][ `GJfVG^OȌNew{ǂRlWl'vocΚgb# -u*m;&& Gr8nc}ػfsنm^LFWH{_5eN=6G#(0eY9k?O'r)jRVk6Zd7D)n3ޑZ<+,\{G#v~>0pHf&~Evr831E^S˸z? /xEDRdHK);}73ۿx -g K-A-[s -_b&ǣ1U,Z{kVJt!Â2K][yXctmR,t.x:I]QkƻF\OwѧncOu7cetJ  /Vjo]1]EozHc;KzYb;ZUg:TNUE 6w{u_DzW#Du -ٳgk;dGС|>yl:'9nx8`8! }z__.VyVM ~P G2P-¤Fr,B=Q!` n*,˜Ѝ~:PIlo#x#P%p p%Gk# Q#ZU}OڤT]CAs^󞶒kZgkm`)Lr k"ڳ'goیB +_Sh5VᜂB~XQZH -rI`$+tT*t96&VJW j1'0LB ZDOo*v -ME -"~*hQ+Z|-EuСSփSw -]_+tبu) :  -] -6mF#E&k3H2BHBlP:s9_[@[˞AVK1ǒ9:ZNg3l4[M|x/ʦI^l,nt*O'i8љl&fckh݇*9+Ocpi> G]?̄t~9ڤml2z!ίv_/v&8f7exFi>]% 4Y^h~=FMY/G&.OYƑ,]Nox,{FN=˙:jN/F\D|9܍)әXJ<)O9+7zR+|;FS3agsSs#a:=KƧ7J"tb|jKcqإL6Qtmo3]Meb2MDSk5F&Ms!<^dkX6O GL=3G0++ͭG^eaO@"! -ht\ DzU;i,! qXu1Ҏ% -wn?@w 5+n ?)!b7ŋh -q4r3Vp#{pFILX3"jUfq4- QN$Ńڤag-c߃Q\ôA^߃@2\;\Ϣ> ga7Ai%Y$+'[C]3>fYO̹o|tA7&Q\"7Nl!}/'=qnK[GzҸJ[b=X)y{ -~r+׹(1f>63H1\Pc'Gsw g>Go)kļgvopKeJ ֓S$O=A )ohMlq%|h>p:~G|C,h,OIV[z(zP0qiwwa琚øN#x,>?xCB$FcS9LvL\B9cۑDntF*LGC58kϤ<~)^&/K/In R|mg.+UaVI'saŨ %yה,vL`4K20o]c*ݏSVIHkеR(E|U)4Zm-ЉX](?Pq -endstream -endobj - -98 0 obj -4318 -endobj - -99 0 obj -<> -endobj - -100 0 obj -<> -stream -x]n@ E|,E+!!E*T@}6m.@ueOX)|sl`68<q6AD}k68A_n |qrXp |u -6w(7k3(( -s[R׺Vy[قH(يZs BUU`ԿZr˭Kh]27 g̤'8'#qzD> -rɚ=9C0GO%?1("2Zڲ\,B>'G@+h}* -endstream -endobj - -101 0 obj -<> -endobj - -102 0 obj -<> -endobj - -103 0 obj -<> -/ProcSet[/PDF/Text] ->> -endobj - -1 0 obj -<>/Contents 2 0 R>> -endobj - -5 0 obj -<>/Contents 6 0 R>> -endobj - -8 0 obj -<>/Contents 9 0 R>> -endobj - -11 0 obj -<>/Contents 12 0 R>> -endobj - -14 0 obj -<>/Contents 15 0 R>> -endobj - -17 0 obj -<>/Contents 18 0 R>> -endobj - -20 0 obj -<>/Contents 21 0 R>> -endobj - -23 0 obj -<>/Contents 24 0 R>> -endobj - -26 0 obj -<>/Contents 27 0 R>> -endobj - -29 0 obj -<>/Contents 30 0 R>> -endobj - -104 0 obj -<> -endobj - -105 0 obj -< -/Dest[5 0 R/XYZ 78.3 348 0]/Parent 104 0 R/Next 106 0 R>> -endobj - -106 0 obj -< -/Dest[5 0 R/XYZ 78.3 246.7 0]/Parent 104 0 R/Prev 105 0 R/Next 107 0 R>> -endobj - -107 0 obj -< -/Dest[8 0 R/XYZ 78.3 743.1 0]/Parent 104 0 R/Prev 106 0 R>> -endobj - -108 0 obj -< -/Dest[8 0 R/XYZ 85.5 706.1 0]/Parent 107 0 R/Next 109 0 R>> -endobj - -109 0 obj -< -/Dest[8 0 R/XYZ 85.5 409.3 0]/Parent 107 0 R/Prev 108 0 R/Next 110 0 R>> -endobj - -110 0 obj -< -/Dest[11 0 R/XYZ 85.5 743.1 0]/Parent 107 0 R/Prev 109 0 R/Next 111 0 R>> -endobj - -111 0 obj -< -/Dest[11 0 R/XYZ 85.5 262.6 0]/Parent 107 0 R/Prev 110 0 R/Next 119 0 R>> -endobj - -112 0 obj -< -/Dest[14 0 R/XYZ 56.7 387.2 0]/Parent 111 0 R/Next 113 0 R>> -endobj - -113 0 obj -< -/Dest[14 0 R/XYZ 56.7 301.5 0]/Parent 111 0 R/Prev 112 0 R/Next 114 0 R>> -endobj - -114 0 obj -< -/Dest[17 0 R/XYZ 56.7 743 0]/Parent 111 0 R/Prev 113 0 R/Next 115 0 R>> -endobj - -115 0 obj -< -/Dest[17 0 R/XYZ 56.7 624.2 0]/Parent 111 0 R/Prev 114 0 R/Next 116 0 R>> -endobj - -116 0 obj -< -/Dest[17 0 R/XYZ 56.7 505.3 0]/Parent 111 0 R/Prev 115 0 R/Next 117 0 R>> -endobj - -117 0 obj -< -/Dest[17 0 R/XYZ 56.7 124.2 0]/Parent 111 0 R/Prev 116 0 R/Next 118 0 R>> -endobj - -118 0 obj -< -/Dest[20 0 R/XYZ 56.7 629.7 0]/Parent 111 0 R/Prev 117 0 R>> -endobj - -119 0 obj -< -/Dest[20 0 R/XYZ 85.5 527.2 0]/Parent 107 0 R/Prev 111 0 R/Next 120 0 R>> -endobj - -120 0 obj -< -/Dest[20 0 R/XYZ 85.5 158.7 0]/Parent 107 0 R/Prev 119 0 R/Next 121 0 R>> -endobj - -121 0 obj -< -/Dest[23 0 R/XYZ 85.5 619.8 0]/Parent 107 0 R/Prev 120 0 R/Next 122 0 R>> -endobj - -122 0 obj -< -/Dest[23 0 R/XYZ 85.5 438.8 0]/Parent 107 0 R/Prev 121 0 R/Next 123 0 R>> -endobj - -123 0 obj -< -/Dest[23 0 R/XYZ 85.5 307.5 0]/Parent 107 0 R/Prev 122 0 R/Next 124 0 R>> -endobj - -124 0 obj -< -/Dest[29 0 R/XYZ 121 743.1 0]/Parent 107 0 R/Prev 123 0 R>> -endobj - -54 0 obj -<> -endobj - -32 0 obj -<> -endobj - -33 0 obj -<> -endobj - -34 0 obj -<> -endobj - -35 0 obj -<> -endobj - -36 0 obj -<> -endobj - -37 0 obj -<> -endobj - -38 0 obj -<> -endobj - -39 0 obj -<> -endobj - -40 0 obj -<> -endobj - -41 0 obj -<> -endobj - -42 0 obj -<> -endobj - -43 0 obj -<> -endobj - -44 0 obj -<> -endobj - -45 0 obj -<> -endobj - -46 0 obj -<> -endobj - -47 0 obj -<> -endobj - -48 0 obj -<> -endobj - -49 0 obj -<> -endobj - -50 0 obj -<> -endobj - -51 0 obj -<> -endobj - -52 0 obj -<> -endobj - -53 0 obj -<> -endobj - -125 0 obj -<> -/Outlines 104 0 R -/Lang(en-US) ->> -endobj - -126 0 obj -< -/Subject -/Creator -/Producer -/CreationDate(D:20171025163536-07'00')>> -endobj - -xref -0 127 -0000000000 65535 f -0000132366 00000 n -0000000019 00000 n -0000000745 00000 n -0000024187 00000 n -0000132511 00000 n -0000000765 00000 n -0000002866 00000 n -0000132807 00000 n -0000002887 00000 n -0000005399 00000 n -0000132970 00000 n -0000005421 00000 n -0000009774 00000 n -0000133117 00000 n -0000009796 00000 n -0000013794 00000 n -0000133264 00000 n -0000013816 00000 n -0000016661 00000 n -0000133411 00000 n -0000016683 00000 n -0000019371 00000 n -0000133576 00000 n -0000019393 00000 n -0000021872 00000 n -0000133723 00000 n -0000021894 00000 n -0000023161 00000 n -0000133870 00000 n -0000023183 00000 n -0000023969 00000 n -0000138229 00000 n -0000138343 00000 n -0000138460 00000 n -0000138577 00000 n -0000138694 00000 n -0000138809 00000 n -0000138924 00000 n -0000139043 00000 n -0000139162 00000 n -0000139281 00000 n -0000139398 00000 n -0000139513 00000 n -0000139632 00000 n -0000139751 00000 n -0000139868 00000 n -0000139983 00000 n -0000140097 00000 n -0000140213 00000 n -0000140329 00000 n -0000140445 00000 n -0000140557 00000 n -0000140677 00000 n -0000138066 00000 n -0000023990 00000 n -0000024167 00000 n -0000024340 00000 n -0000046503 00000 n -0000046526 00000 n -0000046723 00000 n -0000047270 00000 n -0000047664 00000 n -0000059111 00000 n -0000059134 00000 n -0000059330 00000 n -0000059704 00000 n -0000059936 00000 n -0000073533 00000 n -0000073556 00000 n -0000073747 00000 n -0000074150 00000 n -0000074401 00000 n -0000082437 00000 n -0000082459 00000 n -0000082654 00000 n -0000082997 00000 n -0000083199 00000 n -0000095253 00000 n -0000095276 00000 n -0000095479 00000 n -0000096026 00000 n -0000096425 00000 n -0000112200 00000 n -0000112223 00000 n -0000112420 00000 n -0000113039 00000 n -0000113506 00000 n -0000120488 00000 n -0000120510 00000 n -0000120717 00000 n -0000121110 00000 n -0000121368 00000 n -0000126165 00000 n -0000126187 00000 n -0000126391 00000 n -0000126701 00000 n -0000126884 00000 n -0000131288 00000 n -0000131310 00000 n -0000131513 00000 n -0000131910 00000 n -0000132171 00000 n -0000132287 00000 n -0000134017 00000 n -0000134077 00000 n -0000134252 00000 n -0000134422 00000 n -0000134640 00000 n -0000134797 00000 n -0000135035 00000 n -0000135214 00000 n -0000135421 00000 n -0000135623 00000 n -0000135826 00000 n -0000136027 00000 n -0000136230 00000 n -0000136453 00000 n -0000136672 00000 n -0000136878 00000 n -0000137121 00000 n -0000137344 00000 n -0000137531 00000 n -0000137718 00000 n -0000137905 00000 n -0000140788 00000 n -0000140950 00000 n -trailer -< - ] -/DocChecksum /5A2BB3940CE0D29350FDF70A35ABB5D2 ->> -startxref -141498 -%%EOF Index: rs232_syscon/trunk/source_rs232_syscon_showcase_VHDL.zip =================================================================== Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream Index: rs232_syscon/trunk/source_rs232_syscon_showcase_VHDL.zip =================================================================== --- rs232_syscon/trunk/source_rs232_syscon_showcase_VHDL.zip (nonexistent) +++ rs232_syscon/trunk/source_rs232_syscon_showcase_VHDL.zip (revision 7)
rs232_syscon/trunk/source_rs232_syscon_showcase_VHDL.zip Property changes : Added: svn:mime-type ## -0,0 +1 ## +application/octet-stream \ No newline at end of property

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.