170 likes | 284 Views
Digital Design with VHDL. Presented by: Amir Masoud Gharehbaghi Email: amgh@mehr.sharif.edu. Concurrent Statements. Concurrent Signal Assignment Component Instantiation Statement Generate Statement Process Statement Block Statement Concurrent Procedure Call Statement
E N D
Digital Design with VHDL Presented by: Amir Masoud Gharehbaghi Email: amgh@mehr.sharif.edu
Concurrent Statements • Concurrent Signal Assignment • Component Instantiation Statement • Generate Statement • Process Statement • Block Statement • Concurrent Procedure Call Statement • Concurrent Assert Statement
Sequential Statements • Signal Assignment Statement • Variable Assignment Statement • IF Statement • Case Statement • Loop Statement • Wait Statement • Procedure Call Statement
Sequential Statements (cont.) • Next Statement • Exit Statement • Return Statement • Assertion Statement • Report Statement • Null Statement
Serial to Parallel (Entity) ENTITY s2p IS GENERIC (bps: INTEGER); PORT (s_in, rec : IN BIT; d_ready: BUFFER BIT; overrun, f_error: OUT BIT; p_out: OUT BIT_VECTOR(7 DOWNTO 0)); END s2p;
Serial to Parallel ARCHITECTURE w OF s2p IS BEGIN collect: PROCESS VARIABLE buff: BIT_VECTOR(7 DOWNTO 0); CONSTANT half: TIME :=(1000000.0/REAL(bps))/2.0*1 US; CONSTANT full: TIME :=(1000000.0/REAL(bps))/2.0*1 US; BEGIN WAIT UNTIL serial = ‘0’; WAIT FOR half; FOR count IN 0 TO 7 LOOP WAIT FOR full; buff(count) := serail; END LOOP;
Serial to Parallel IF serial = ‘0’ THEN f_error <= ‘1’; WAIT UNTIL serial = ‘1’; ELSE f_errro <= ‘0’; d_ready <= ‘1’; p_out <= buff; WAIT UNTIL rec = ‘1’; WAIT UNTIL rec = ‘0’; d_ready <= ‘0’; END IF; END PROCESS;
Serial to Parallel too_fast: PROCESS BEGIN IF d_ready = ‘1’ THEN WAIT UNTIL serial = ‘0’; IF d_ready = ‘1’ THEN overrun <= ‘1’; END IF; ELSE overrun <= ‘0’; END IF; WAIT ON d_ready; END PROCESS; END w;
Enumeration Type Declaration TYPE identifier IS (enumeration_literal { , enumeration_literal } ); enumeration_literal ::= identifier | character_literal
Moore FSM ENTITY moore IS PORT (x, clk: IN BIT; z: OUT BIT); END moore; ARCHITECTURE behavioral OF moore IS TYPE state IS (reset,got1,got10,got101,got1011); SIGNAL current : state := reset; BEGIN
Moore FSM (cont.) PROCESS BEGIN WAIT UNTIL clk = ‘1’ ; CASE current IS WHEN reset => IF x = ‘0’ THEN current <= got1; ELSE current <= reset; END IF; … END CASE; END PROCESS; z <= ‘1’ WHEN current = got1011 ELSE ‘0’; END behavioral;
Mealy FSM ARCHITECTURE behavioral OF mealy IS TYPE state IS (a, b, c); SIGNAL nxt, present : state := a; BEGIN -- of architecture PROCESS (clk) BEGIN IF (clk’EVENT AND clk = ‘1’) THEN present <= nxt; END IF; END PROCESS;
Mealy FSM (cont.) PROCESS (present , x) BEGIN z <= ‘0’; CASE present IS WHEN a => IF x = ‘0’ THEN nxt <= a ELSE nxt <= b; END IF; … END CASE; IF present = c AND x = ‘1’ THEN z <= ‘1’; END IF; END PROCESS; END behavioral ; -- of architecture
Array Type Declaration TYPE identifier IS ARRAY ( index {, index} ) OF element_subtype; Index ::= range | NATURAL RANGE <>
Array Type Example TYPE BIT_VECTOR IS ARRAY (NATURAL RANGE <>) OF BIT; TYPE two_dim_bit IS ARRAY (0 TO 7, 15 DOWNTO 0) OF BIT; TYPE byte_memory IS ARRAY (NATURAL RANGE <>) OF BIT_VECTOR (7 DOWNTO 0);
Signal of Array Type Example SIGNAL a: BIT_VECTOR(1 TO 16); SIGNAL b: two_dim_bit; SIGNAL c: byte_memory(0 TO 1023); … c(0) <= a(1 TO 8); a(1 TO 8) <= b(1,15)&b(1,14)&b(1,13)&b(1,12)&b(1,11)&b(1,10)&b(1,9)&b(1,8); c(0) <= a(5 TO 12);
Specifying Radix SIGNAL a: BIT_VECTOR(7 DOWNTO 0); SIGNAL b: INTEGER; .. aa <= "10101111", B"0111_0101" AFTER 10 ns, x"F1" AFTER 50 ns; bb <= 100_789, 16#3F7# AFTER 30 NS, 4#103_2122# AFTER 100 ns;