HANDSHAKING














HANDSHAKING - SERIAL TO PARALLEL INTERFACE





1. Serial to Parallel Interface :













Serial to Parallel Interface











Serial to Parallel Interface


    ENTITY serial2parallel IS GENERIC (bps : INTEGER); PORT (serial, received : IN BIT; dataready : BUFFER BIT; overrun, frame_error : OUT BIT; parallel_out : BUFFER BIT_VECTOR (7 DOWNTO 0)); END serial2parallel; -- ARCHITECTURE waiting OF serial2parallel IS BEGIN collect : PROCESS VARIABLE buff : BIT_VECTOR (7 DOWNTO 0); CONSTANT half_bit : TIME := (1000000.0/REAL(bps))/2.0 * 1 US; CONSTANT full_bit : TIME := (1000000.0/REAL(bps)) * 1 US; BEGIN --Look for Start, start collecting data --If Stop not found, issue frame error END PROCESS collect; -- too_fast : PROCESS BEGIN -- While collecting, check for overrun END PROCESS too_fast; END waiting;










Serial to Parallel Interface


    ARCHITECTURE waiting OF serial2parallel IS BEGIN collect : PROCESS VARIABLE buff : BIT_VECTOR (7 DOWNTO 0); CONSTANT half_bit : TIME := (1000000.0/REAL(bps))/2.0 * 1 US; CONSTANT full_bit : TIME := (1000000.0/REAL(bps)) * 1 US; BEGIN WAIT UNTIL serial = '0'; WAIT FOR half_bit; FOR count IN 0 TO 7 LOOP WAIT FOR full_bit; buff (count) := serial; END LOOP; WAIT FOR full_bit; IF serial = '0' THEN frame_error <= '1'; WAIT UNTIL serial = '1'; ELSE frame_error <= '0'; dataready <= '1'; parallel_out <= buff; WAIT UNTIL received = '1'; WAIT UNTIL received = '0'; dataready <= '0'; END IF; END PROCESS collect; -- too_fast : PROCESS BEGIN -- While collecting, check for overrun END PROCESS too_fast; END waiting;










Handshaking.Serial to Parallel Interface


    ARCHITECTURE waiting OF serial2parallel IS BEGIN collect : PROCESS VARIABLE buff : BIT_VECTOR (7 DOWNTO 0); CONSTANT half_bit : TIME := (1000000.0/REAL(bps))/2.0 * 1 US; CONSTANT full_bit : TIME := (1000000.0/REAL(bps)) * 1 US; BEGIN --Look for Start, start collecting data --If Stop not found, issue frame error END PROCESS collect; -- too_fast : PROCESS BEGIN IF dataready = '1' THEN WAIT UNTIL serial = '0'; IF dataready = '1' THEN overrun <= '1'; END IF; ELSE overrun <= '0'; END IF; WAIT ON dataready; END PROCESS too_fast; END waiting;













HANDSHAKING - BUS ARBITER





2. Bus Arbiter :













Bus Arbiter


    PACKAGE waiting IS TYPE wait_array IS ARRAY (NATURAL RANGE <>) OF NATURAL; END waiting; -- USE WORK.waiting.ALL; ENTITY arbitrator IS GENERIC (wait_states : wait_array := (0, 1, 2, 3); clock_period : TIME := 1 US); PORT (request : IN BIT_VECTOR (3 DOWNTO 0); grant : BUFFER BIT_VECTOR (3 DOWNTO 0); clock : IN BIT); END arbitrator; -- ARCHITECTURE behavioral OF arbitrator IS BEGIN wait_cycle: PROCESS BEGIN IF clock = '0' THEN WAIT FOR 20 NS; FOR i IN request'RANGE LOOP IF request(i) = '1' THEN IF grant = "0000" THEN WAIT FOR wait_states (i) * clock_period; grant (i) <= '1', '0' AFTER clock_period; END IF; END IF; END LOOP; END IF; WAIT ON clock; END PROCESS wait_cycle; END behavioral;