ELEN 468 Advanced Logic Design Lecture 19 VHDL ELEN 468 Lecture 19 1 Introduction VHDL VHSIC Hardware Description Language VHSIC Very High Speed Integrated Circuit ELEN 468 Lecture 19 2 Example -- eqcomp4 is a four bit equality comparator -- Entity declaration entity eqcomp4 is port ( a, b: in bit_vector( 3 downto 0 ); equals: out bit ); -- equal is active high end eqcomp4; -- Architecture body architecture dataflow of eqcomp4 is begin equals <= ‘1’ when ( a = b ) else ‘0’; end dataflow; ELEN 468 Lecture 19 3 Entity Declarations Describe I/O and parameterized values Port declaration Name Mode in out buffer: for internal feedback inout Data type Boolean, bit, bit_vector, integer, std_logic … ELEN 468 Lecture 19 4 Example of Entity Declaration library ieee; use ieee.std_logic_1164.all; entity add4 is port ( a, b: in std_logic_vector( 3 downto 0 ); ci: in std_logic; sum: out std_logic_vector( 3 downto 0 ); co: out std_logic ); end add4; ELEN 468 Lecture 19 5 Architecture Bodies Always associated with an entity declaration Description styles Behavioral Dataflow Structural ELEN 468 Lecture 19 6 Behavioral Descriptions library ieee; use ieee.std_logic_1164.all; entity eqcomp4 is port ( a, b: in std_logic_vector( 3 downto 0 ); equals: out std_logic ); end eqcomp4; architecture behavioral of eqcomp4 is begin comp: process ( a, b ) -- sensitivity list begin if a = b then equals <= ‘1’; else equals <= ‘0’; -- sequential assignment endif end process comp; end behavioral; ELEN 468 Lecture 19 7 Dataflow Descriptions library ieee; use ieee.std_logic_1164.all; entity eqcomp4 is port ( a, b: in std_logic_vector( 3 downto 0 ); equals: out std_logic ); end eqcomp4; architecture dataflow of eqcomp4 is begin equals <= ‘1’ when ( a = b ) else ‘0’; end dataflow; -- No process -- Concurrent assignment ELEN 468 Lecture 19 8 Structural Descriptions library ieee; use ieee.std_logic_1164.all; entity eqcomp4 is port ( a, b: in std_logic_vector( 3 downto 0 ); end eqcomp4; equals: out std_logic ); use work.gatespkg.all; architecture struct of eqcomp4 is signal x : std_logic_vector( 0 to 3); begin u0: xnor2 port map ( a(0), b(0), x(0) ); -- component instantiation u1: xnor2 port map ( a(1), b(1), x(1) ); u2: xnor2 port map ( a(2), b(2), x(2) ); u3: xnor2 port map ( a(3), b(3), x(3) ); u4: and4 port map ( x(0), x(1), x(2), x(3), equals ); end struct; ELEN 468 Lecture 19 9 Identifiers Made up of alphabetic, numeric, and/or underscore The first character must be a letter The last character cannot be an underscore Two underscores in succession are not allowed Uppercase and lowercase are equivalent ELEN 468 Lecture 19 10 Data Objects Constants Signals constant width: integer := 8; signal count: bit_vector( 3 downto 0); Similar to “wire” in Verilog Variables Only in processes and subprograms Usually applied as loop or tmp variable Files ELEN 468 Lecture 19 11 Data Types Scalar types Composite types ELEN 468 Lecture 19 12 Scalar Types Enumeration Integer Floating Physical ELEN 468 Lecture 19 13 Enumeration Types type states is ( idle, waiting, read, write ); signal current_state: states; type bit is ( ‘0’, ‘1’ ); type std_ulogic is ( ‘U’, -- Uninitialized ‘X’, ‘0’, ‘1’, ‘Z’, ‘W’, -- Weak unknown ‘L’, -- Weak 0 ‘H’, -- Weak 1 ‘-’, -- Don’t care ); ELEN 468 Lecture 19 14 Integer and Floating Types VHDL supports Integers from –(231-1) to (231-1) Floating number from –1E38 to 1E38 variable a: integer range –255 to 255; ELEN 468 Lecture 19 15 Physical Types type time is range –2147483647 to 2147483647 units fs; ps = 1000 fs; ns = 1000 ps; us = 1000 ns; ms = 1000 ns; sec = 1000 ms; min = 60 sec; hr = 60 min; end units; -- time is a predefined type -- physical types are mostly for simulations ELEN 468 Lecture 19 16 Composite Types Array Record type bit_vector is array ( natural range <> ) of bit); Has multiple elements of different types ELEN 468 Lecture 19 17 Two Dimensional Array type table8x4 is array ( 0 to 7, 0 to 3 ) of bit; constant exclusive_or: table8x4 := ( “000_0”, “001_1”, “010_1”, “011_0”, “100_1”, “101_0”, “110_0”, “111_1” ); ELEN 468 Lecture 19 18 Strongly Typed VHDL is a strongly typed language If a and b are integer variables, following assignment is not allowed a <= b + ‘1’; since ‘1’ is a bit, unless ‘+’ is overloaded ELEN 468 Lecture 19 19 Concurrent Statements Lie outside of a process Signal assignment Concurrent Selective (with-select-when) Conditional (when-else) Generate ELEN 468 Lecture 19 20 Concurrent Signal Assignment entity my_design is port ( mem_op, io_op: in bit; read, write: in bit; memr, memw: out bit; io_rd, io_wr: out bit ); end my_design; architecture control of my_design is begin memw <= mem_op and write; memr <= mem_op and read; io_wr <= io_op and write; io_rd <= io_op and read; end control ELEN 468 Lecture 19 21 Selective Signal Assignment entity mux is port ( a, b, c, d: in bit_vector( 3 downto 0 ); s: in bit_vector( 1 downto 0 ); x: out bit_vector( 3 downto 0 ) ); end mux; architecture archmux of mux is begin with s select x <= a when “00”, b when “01”, c when “10”, d when others; end archmux; ELEN 468 Lecture 19 22 Conditional Signal Assignment entity mux is port ( a, b, c, d: in bit_vector( 3 downto 0 ); s: in bit_vector( 1 downto 0 ); x: out bit_vector( 3 downto 0 ) ); end mux; architecture archmux of mux is begin x <= a when ( s = “00” ) else b when ( s = “01” ) else c when ( s = “10” ) else d; end archmux; ELEN 468 Lecture 19 23 Component Instantiation and Generate Statement architecture RTL of SHIFT is component DFF port ( rst, clk, d: in bit; q: out bit ); end component; signal T: bit_vector( 8 downto 0 ); begin T(8) <= SI; SO <= T(0); g0: for i in 7 downto 0 generate -- variable i is implicitly declared allbit: DFF port map ( rst=>rst, clk=>clk, d=>T(i+1), q=>T(i)); end generate; end RTL; ELEN 468 Lecture 19 24 Sequential Statements In a process, function or procedure if-then-else when-else ELEN 468 Lecture 19 25 if-then-else … if ( condition1 ) then x <= value1; elsif ( condition2 ) then x <= value2; else x <= value3; end if; ELEN 468 Lecture 19 26 case-when … architecture design of test_case is begin process ( address ) begin case address is when “001” => decode <= X”11”; -- X indicates hexadecimal when “111” => decode <= X”42”; when “010” => decode <= X”44”; when “101” => decode <= X”88”; when others => decode <= X”00”; end case; end process; end design; ELEN 468 Lecture 19 27 Loop … p0: process ( A ) variable sum, i : integer; begin sum := 0; loop1 : for i in 0 to 9 loop exit loop1 when A(i) > 20; next when A(i) > 10; sum := sum + A(i); end loop loop1 end process ELEN 468 Lecture 19 28 D Flip-Flop library ieee; use ieee.std_logic_1164.all; entity dff is port ( d, clk, rst: in std_logic; q: out std_logic ); end dff; architecture behavior of dff is begin process ( clk, rst ) begin if rst = ‘1’ then q <= ‘0’; elsif ( clk’event and clk = ‘1’ ) then q <= d; -- ‘event is an attribute end if; end process; end behavior ELEN 468 Lecture 19 29 wait-until library ieee; use ieee.std_logic_1164.all; entity dff is port ( d, clk, rst: in std_logic; q: out std_logic ); end dff; architecture behavior of dff is begin process ( clk, rst ) begin if rst = ‘1’ then q <= ‘0’; else wait until ( clk = ‘1’ ) q <= d; end if; end process; end behavior ELEN 468 Lecture 19 30 Functions function bl2bit ( a: BOOLEAN ) return BIT is begin if a then return ‘1’; else return ‘0’; end if end bl2bit; ELEN 468 Lecture 19 31 Using Functions entity full_add is port ( a, b, carry_in: in bit; sum, carry_out: out bit ); end full_add; architecture fall_add of full_add is function majority( a, b, c: bit ) return bit is begin return ( ( a and b ) or ( a and c ) or ( b and c ) ); end majority; begin sum <= a xor b xor carry_in; carry_out <= majority( a, b, carry_in ); end; ELEN 468 Lecture 19 32 Procedures procedure dff ( signal d: bit_vector; signal clk, rst: bit; signal q: out bit_vector ) is begin if rst = ‘1’ then q <= ( others => ‘0’ ); elsif clk’event and clk = ‘1’ then q <= d; end if; end procedure; ELEN 468 Lecture 19 33 Packages Similar to library A design unit whose type, component, function and other declarations can be visible to outside Consists of Package declaration Package body (optional) Made visible through “use” use library_name.package_name.item; use work.std_arith.all; Some vendors provide a default work library ELEN 468 Lecture 19 34 Declare Types in Package package STANDARD is type BOOLEAN is ( FALSE, TRUE ); type BIT is ( ‘0’, ‘1’ ); type INTEGER is range -2147483648 to +2147483647; … end STANDARD; ELEN 468 Lecture 19 35 Define Procedure in Package package myflop is procedure dff ( signal d: bit_vector; signal clk, rst: bit; signal q: out bit_vector ); end myflop; package body myflop is procedure dff ( signal d: bit_vector; signal clk, rst: bit; signal q: out bit_vector ) is begin if rst = ‘1’ then q <= ( others => ‘0’ ); elsif clk’event and clk = ‘1’ then q <= d; end if; end procedure; end myflop; ELEN 468 Lecture 19 36 Using Procedure entity flop8 is port ( clk, rst: in bit; data_in: in bit_vector( 7 downto 0 ); data: out bit_vector( 7 downto 0 ) ); end flop8; use work.myflop.all; architecture archflop8 of flop8 is begin dff( data_in, clk, rst, data ); end archflop8; ELEN 468 Lecture 19 37 Generics entity dff is generic ( size: integer := 2 ) port ( clk, rst: in bit; d: in bit_vector( size-1 downto 0 ); q: out bit_vector( size-1 downto 0 ) ); end dff; architecture behavior of dff is … end behavior … u1: dff generic map(8) port map( myclk, myrst, data, output ); … ELEN 468 Lecture 19 38