Digital Electronics and Design with VHDL, Volnei A.
Pedroni, ElsevierMorgan Kaufmann, 2008
Digital Electronics and Design with VHDL Volnei A. Pedroni ElsevierMorgan Kaufmann, 2008
Samples of VHDL Codes Presented in the Examples Below are some of the VHDL codes from the examples in Part II of the book (Chapters 19-25).
VHDL code from Example 19.1 (Buffered multiplexer)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LI BRARY i eee; USE i eee. st d_l ogi c_1164. al l ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ENTI TY buf f er ed_mux I S PORT ( a, b, c, d: I N STD_LOGI C_VECTOR( 7 DOWNTO 0) ; sel : I N I NTEGER RANGE 0 TO 3; ena: I N STD_LOGI C; y: OUT STD_LOGI C_VECTOR( 7 DOWNTO 0) ) ; END buf f er ed_mux; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARCHI TECTURE myar ch OF buf f er ed_mux I S SI GNAL x: STD_LOGI C_VECTOR( 7 DOWNTO 0) ; BEGI N x <= a WHEN sel =0 ELSE - - Mux b WHEN sel =1 ELSE c WHEN sel =2 ELSE d; y <= x WHEN ena=' 1' ELSE - Tr i st at e buf f er ( OTHERS => ' Z' ) ; END myar ch; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
VHDL code from Example 19.7 (Carry-ripple adder)
- - - - - - - - The component : - - - - - - - - - - - - - - - - - - - - - - - - - - - - ENTI TY f ul l _adder I S PORT ( a, b, ci n: I N BI T; s, cout : OUT BI T) ; END f ul l _adder ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARCHI TECTURE f ul l _adder OF f ul l _adder I S BEGI N s <= a XOR b XOR ci n; cout <= ( a AND b) OR ( a AND ci n) OR ( b AND ci n) ; END f ul l _adder ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - Mai n code: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ENTI TY car r y_r i ppl e_adder I S GENERI C ( N : I NTEGER : = 8) ; - - number of bi t s
Digital Electronics and Design with VHDL, Volnei A. Pedroni, ElsevierMorgan Kaufmann, 2008
PORT ( a, b: I N BI T_VECTOR( N- 1 DOWNTO 0) ; ci n: I N BI T; s: OUT BI T_VECTOR( N- 1 DOWNTO 0) ; cout : OUT BI T) ; END car r y_r i ppl e_adder ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARCHI TECTURE st r uct ur al OF car r y_r i ppl e_adder I S SI GNAL car r y: BI T_VECTOR( N DOWNTO 0) ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - COMPONENT f ul l _adder I S PORT ( a, b, ci n: I N BI T; s, cout : OUT BI T) ; END COMPONENT; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - BEGI N car r y( 0) <= ci n; gen_adder : FOR i I N a' RANGE GENERATE FA: f ul l _adder PORT MAP ( a( i ) , b( i ) , car r y( i ) , s( i ) , car r y( i +1) ) ; END GENERATE; cout <= car r y( N) ; END st r uct ur al ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
VHDL code from Example 20.1 (Address decoder)
- - - - - - - - - Code f or N=3 and WHEN: - - - - - - - - - - - - - - - - ENTI TY addr ess_decoder I S PORT ( x: I N BI T_VECTOR( 2 DOWNTO 0) ; y: OUT BI T_VECTOR( 7 DOWNTO 0) ) ; END addr ess_decoder ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARCHI TECTURE addr ess_decoder OF addr ess_decoder I S BEGI N y <=" 00000001" WHEN x=" 000" ELSE " 00000010" WHEN x=" 001" ELSE " 00000100" WHEN x=" 010" ELSE " 00001000" WHEN x=" 011" ELSE " 00010000" WHEN x=" 100" ELSE " 00100000" WHEN x=" 101" ELSE " 01000000" WHEN x=" 110" ELSE " 10000000" ; END addr ess_decoder ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - Code f or ar bi t r ar y N: - - - - - - - - - - - - - - - - - ENTI TY addr ess_decoder I S GENERI C ( N: I NTEGER : = 3) ; - - can be any val ue PORT ( x: I N I NTEGER RANGE 0 TO 2**N- 1; y: OUT BI T_VECTOR( 2**N- 1 DOWNTO 0) ) ; END addr ess_decoder ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARCHI TECTURE addr ess_decoder OF addr ess_decoder I S BEGI N gen: FOR i I N x' RANGE GENERATE y( i ) <= ' 1' WHEN i =x ELSE ' 0' ; END GENERATE; END addr ess_decoder ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
VHDL code from Example 20.2 (BCD-to-SSD converter)
Digital Electronics and Design with VHDL, Volnei A. Pedroni, ElsevierMorgan Kaufmann, 2008
PACKAGE my_f unct i ons I S FUNCTI ON bcd_t o_ssd ( SI GNAL i nput : I NTEGER) RETURN BI T_VECTOR; END my_f unct i ons; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - PACKAGE BODY my_f unct i ons I S FUNCTI ON bcd_t o_ssd ( SI GNAL i nput : I NTEGER) RETURN BI T_VECTOR I S VARI ABLE out put : BI T_VECTOR( 6 DOWNTO 0) ; BEGI N CASE i nput I S WHEN 0 => out put : =" 1111110" ; - - deci mal 126 WHEN 1 => out put : =" 0110000" ; - - deci mal 48 WHEN 2 => out put : =" 1101101" ; - - deci mal 109 WHEN 3 => out put : =" 1111001" ; - - deci mal 121 WHEN 4 => out put : =" 0110011" ; - - deci mal 51 WHEN 5 => out put : =" 1011011" ; - - deci mal 91 WHEN 6 => out put : =" 1011111" ; - - deci mal 95 WHEN 7 => out put : =" 1110000" ; - - deci mal 112 WHEN 8 => out put : =" 1111111" ; - - deci mal 127 WHEN 9 => out put : =" 1111011" ; - - deci mal 123 WHEN OTHERS => out put : =" 1001111" ; - - l et t er " E" ( Er r or ) - > deci mal 79 END CASE; RETURN out put ; END bcd_t o_ssd; END my_f unct i ons; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - Mai n code: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - USE wor k. my_f unct i ons. al l ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ENTI TY bcd_t o_ssd_conver t er I S PORT ( x: I N I NTEGER RANGE 0 TO 9; y: OUT BI T_VECTOR( 6 DOWNTO 0) ) ; END bcd_t o_ssd_conver t er ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARCHI TECTURE decoder OF bcd_t o_ssd_conver t er I S BEGI N y <= bcd_t o_ssd( x) ; END decoder ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
VHDL code from Example 21.2 (Carry-lookahead adder)
- - - - - - - 4- bi t car r y- l ookahead adder : - - - - - - - - - - - - - - LI BRARY i eee; USE i eee. st d_l ogi c_1164. al l ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ENTI TY car r y_l ookahead_adder I S PORT ( a, b: I N STD_LOGI C_VECTOR( 3 DOWNTO 0) ; ci n: I N STD_LOGI C; sum: OUT STD_LOGI C_VECTOR( 3 DOWNTO 0) ; cout : OUT STD_LOGI C) ; END car r y_l ookahead_adder ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARCHI TECTURE st r uct ur e OF car r y_l ookahead_adder I S SI GNAL G, P, c: STD_LOGI C_VECTOR( 3 DOWNTO 0) ; BEGI N - - - - - - - Comput at i on of G and P: G <= a AND b; P <= a XOR b; - - - - - - - Comput at i on of car r y: c( 0) <= ci n; c( 1) <= G( 0) OR
Digital Electronics and Design with VHDL, Volnei A. Pedroni, ElsevierMorgan Kaufmann, 2008
( P( 0) AND ci n) ; c( 2) <= G( 1) OR ( P( 1) AND G( 0) ) OR ( P( 1) AND P( 0) AND ci n) ; c( 3) <= G( 2) OR ( P( 2) AND G( 1) ) OR ( P( 2) AND P( 1) AND G( 0) ) OR ( P( 2) AND P( 1) AND P( 0) AND ci n) ; cout <= G( 3) OR ( P( 3) AND G( 2) ) OR ( P( 3) AND P( 2) AND G( 1) ) OR ( P( 3) AND P( 2) AND P( 1) AND G( 0) ) OR ( P( 3) AND P( 2) AND P( 1) AND P( 0) AND ci n) ; - - - - - - - Comput at i on of sum: sum<= P XOR c; END st r uct ur e; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - Mai n code: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LI BRARY i eee; USE i eee. st d_l ogi c_1164. al l ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ENTI TY bi g_adder I S PORT ( a, b: I N STD_LOGI C_VECTOR( 31 DOWNTO 0) ; ci n: I N STD_LOGI C; sum: OUT STD_LOGI C_VECTOR( 31 DOWNTO 0) ; cout : OUT STD_LOGI C) ; END bi g_adder ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARCHI TECTURE bi g_adder OF bi g_adder I S SI GNAL car r y: STD_LOGI C_VECTOR( 8 DOWNTO 0) ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - COMPONENT car r y_l ookahead_adder I S PORT ( a, b: I N STD_LOGI C_VECTOR( 3 DOWNTO 0) ; ci n: I N STD_LOGI C; sum: OUT STD_LOGI C_VECTOR( 3 DOWNTO 0) ; cout : OUT STD_LOGI C) ; END COMPONENT; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - BEGI N car r y( 0) <= ci n; gen_adder : FOR i I N 1 TO 8 GENERATE adder : car r y_l ookahead_adder PORT MAP ( a( 4*i - 1 DOWNTO 4*i - 4) , b( 4*i - 1 DOWNTO 4*i - 4) , car r y( i - 1) , sum( 4*i - 1 DOWNTO 4*i - 4) , car r y( i ) ) ; END GENERATE; cout <= car r y( 8) ; END bi g_adder ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
VHDL code from Example 22.4 (Fibonacci series generator)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ENTI TY f i bonacci I S GENERI C ( N: I NTEGER : = 16) ; - - number of bi t s PORT ( cl k, r st : I N BI T; f i bo_ser i es: OUT I NTEGER RANGE 0 TO 2**N- 1) ;
Digital Electronics and Design with VHDL, Volnei A. Pedroni, ElsevierMorgan Kaufmann, 2008
END f i bonacci ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARCHI TECTURE f i bonacci OF f i bonacci I S SI GNAL a, b, c: I NTEGER RANGE 0 TO 2**N- 1; BEGI N PROCESS ( cl k, r st ) BEGI N I F ( r st =' 1' ) THEN b <= 1; c <= 0; ELSI F ( cl k' EVENT AND cl k=' 1' ) THEN c <= b; b <= a; END I F; a <= b + c; END PROCESS; f i bo_ser i es <= c; END f i bonacci ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
VHDL code from Example 22.5 (Frequency meter)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ENTI TY f r eq_met er I S GENERI C ( f cl k: I NTEGER : = 5; - - cl ock f r eq. f xmax: I NTEGER : = 15) ; - - max f x PORT ( cl k, x: I N BI T; t est : OUT BI T; f x: OUT I NTEGER RANGE 0 TO f xmax) ; END f r eq_met er ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARCHI TECTURE behavi or al OF f r eq_met er I S SI GNAL t wi ndow: BI T; SI GNAL t emp: I NTEGER RANGE 0 TO f xmax; BEGI N - - - - - Ti me wi ndow: - - - - - - - - - - - - - - - - - - - - - - - - PROCESS ( cl k) VARI ABLE count : I NTEGER RANGE 0 TO f cl k; BEGI N I F ( cl k' EVENT AND cl k=' 1' ) THEN count : = count + 1; I F ( count =f cl k) THEN t wi ndow <= ' 1' ; ELSI F ( count =f cl k+1) THEN t wi ndow <= ' 0' ; count : = 0; END I F; END I F; END PROCESS; - - - - - - Count er f or x: - - - - - - - - - - - - - - - - - - - - - PROCESS ( x, t wi ndow) VARI ABLE count : I NTEGER RANGE 0 TO 20; BEGI N I F ( t wi ndow=' 1' ) THEN count : = 0; ELSI F ( x' EVENT AND x=' 1' ) THEN count : = count + 1; END I F; t emp <= count ; END PROCESS; - - - - - - - - Regi st er : - - - - - - - - - - - - - - - - - - - - - - - - - PROCESS ( t wi ndow) BEGI N I F ( t wi ndow' EVENT AND t wi ndow=' 1' ) THEN
Digital Electronics and Design with VHDL, Volnei A. Pedroni, ElsevierMorgan Kaufmann, 2008
f x <= t emp; END I F; END PROCESS; t est <= t wi ndow; END behavi or al ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
VHDL code from Example 23.3 (Car alarm, version 1)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LI BRARY i eee; USE i eee. st d_l ogi c_1164. al l ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ENTI TY car _al ar mI S PORT ( cl k, r st , r emot e, sensor s: I N STD_LOGI C; si r en: OUT STD_LOGI C) ; END car _al ar m; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARCHI TECTURE f smOF car _al ar mI S TYPE al ar m_st at e I S ( di sar med, ar med, i nt r usi on) ; ATTRI BUTE enum_encodi ng: STRI NG; ATTRI BUTE enum_encodi ng OF al ar m_st at e: TYPE I S "sequent i al "; SI GNAL pr _st at e, nx_st at e: al ar m_st at e; SI GNAL f l ag: STD_LOGI C; BEGI N - - - - - Fl ag: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - PROCESS ( r emot e, r st ) BEGI N I F ( r st =' 1' ) THEN f l ag <= ' 0' ; ELSI F ( r emot e' EVENT AND r emot e=' 0' ) THEN f l ag <= NOT f l ag; END I F; END PROCESS; - - - - - Lower sect i on: - - - - - - - - - - - - - - - - - - - - PROCESS ( cl k, r st ) BEGI N I F ( r st =' 1' ) THEN pr _st at e <= di sar med; ELSI F ( cl k' EVENT AND cl k=' 1' ) THEN pr _st at e <= nx_st at e; END I F; END PROCESS; - - - - - Upper sect i on: - - - - - - - - - - - - - - - - - - - PROCESS ( pr _st at e, f l ag, r emot e, sensor s) BEGI N CASE pr _st at e I S WHEN di sar med => si r en <= ' 0' ; I F ( r emot e=' 1' AND f l ag=' 0' ) THEN nx_st at e <= ar med; ELSE nx_st at e <= di sar med; END I F; WHEN ar med => si r en <= ' 0' ; I F ( sensor s=' 1' ) THEN nx_st at e <= i nt r usi on; ELSI F ( r emot e=' 1' AND f l ag=' 1' ) THEN nx_st at e <= di sar med; ELSE nx_st at e <= ar med; END I F; WHEN i nt r usi on =>
Digital Electronics and Design with VHDL, Volnei A. Pedroni, ElsevierMorgan Kaufmann, 2008
si r en <= ' 1' ; I F ( r emot e=' 1' AND f l ag=' 1' ) THEN nx_st at e <= di sar med; ELSE nx_st at e <= i nt r usi on; END I F; END CASE; END PROCESS; END f sm; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
VHDL code from Example 24.3 (Type I testbench for an adder)
- - - - - desi gn f i l e ( adder . vhd) : - - - - - - - - - - - - - - - ENTI TY adder I S PORT ( a, b: I N I NTEGER RANGE 0 TO 255; sum: OUT I NTEGER RANGE 0 TO 511) ; END adder ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARCHI TECTURE adder OF adder I S BEGI N sum<= a + b; END adder ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - t est f i l e ( t est _adder . vhd) : - - - - - - - - - - - - ARCHI TECTURE t est _adder OF t est _adder I S - - - - - component decl ar at i on: - - - - - - - - - - - - - COMPONENT adder I S PORT ( a, b: I N I NTEGER RANGE 0 TO 255; sum: OUT I NTEGER RANGE 0 TO 511) ; END COMPONENT; - - - - - si gnal decl ar at i ons: - - - - - - - - - - - - - - - SI GNAL a: I NTEGER RANGE 0 TO 255; SI GNAL b: I NTEGER RANGE 0 TO 255; SI GNAL sum: I NTEGER RANGE 0 TO 511; BEGI N - - - - - component i nst ant i at i on: - - - - - - - - - - - dut : adder PORT MAP ( a=>a, b=>b, sum=>sum) ; - - - - - si gnal a: - - - - - - - - - - - - - - - - - - - - - - - - - - PROCESS BEGI N a <= 0; WAI T FOR 50 ns; a <= 150; WAI T FOR 50 ns; a <= 200; WAI T FOR 50 ns; a <= 250; WAI T FOR 50 ns; END PROCESS; - - - - - si gnal b: - - - - - - - - - - - - - - - - - - - - - - - - - - PROCESS BEGI N b <= 0; WAI T FOR 75 ns; b <= 120; WAI T FOR 75 ns; b <= 240; WAI T FOR 50 ns; END PROCESS; END t est _adder ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Digital Electronics and Design with VHDL, Volnei A. Pedroni, ElsevierMorgan Kaufmann, 2008