# FPGAs and VHDL - PowerPoint PPT Presentation

1 / 30

FPGAs and VHDL. Lecture L12.1. FPGAs and VHDL. Field Programmable Gate Arrays (FPGAs) VHDL 2 x 1 MUX 4 x 1 MUX An Adder Binary-to-BCD Converter A Register Fibonacci Sequence Generator. Block diagram of Xilinx Spartan IIE FPGA. Each Spartan IIE CLB contains two of these CLB slices.

I am the owner, or an agent authorized to act on behalf of the owner, of the copyrighted work described.

FPGAs and VHDL

Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.

- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -

## FPGAs and VHDL

Lecture L12.1

### FPGAs and VHDL

• Field Programmable Gate Arrays (FPGAs)

• VHDL

• 2 x 1 MUX

• 4 x 1 MUX

• Binary-to-BCD Converter

• A Register

• Fibonacci Sequence Generator

### Each Spartan IIE CLB contains two of these CLB slices

A B C D Z

0 0 0 0 0

0 0 0 1 0

0 0 1 0 0

0 0 1 1 1

0 1 0 0 1

0 1 0 1 1

. . .

1 1 0 0 0

1 1 0 1 0

1 1 1 0 0

1 1 1 1 1

Combinatorial Logic

A

B

Z

C

D

WE

G4

G

G3

Func.

G2

Gen.

G1

### Look Up Tables

Look Up Table

• Combinatorial Logic is stored in 16x1 SRAM Look Up Tables (LUTs) in a CLB

• Example:

4

(2 )

2

= 64K !

• Capacity is limited by number of inputs, not complexity

• Choose to use each function generator as 4 input logic (LUT) or as high speed sync.dual port RAM

### Introduction to VHDL

• VHDL is an acronym for VHSIC (Very High Speed Integrated Circuit) Hardware Description Language

• IEEE standard specification language (IEEE 1076-1993) for describing digital hardware used by industry worldwide

• VHDL enables hardware modeling from the gate level to the system level

### Combinational Circuit Example

8-line 2-to-1 Multiplexer

8-line

2 x 1 MUX

a(7:0)

y(7:0)

b(7:0)

sel y

0 a

1 b

sel

a(7:0)

8-line

2 x 1

y(7:0)

MUX

b(7:0)

sel

### An 8-line 2 x 1 MUX

library IEEE;

use IEEE.std_logic_1164.all;

entity mux2 is

port (

a: in STD_LOGIC_VECTOR(7 downto 0);

b: in STD_LOGIC_VECTOR(7 downto 0);

sel: in STD_LOGIC;

y: out STD_LOGIC_VECTOR(7 downto 0)

);

end mux2;

### Entity

Each entity must begin with these library and use statements

library IEEE;

use IEEE.std_logic_1164.all;

entity mux2 is

port (

a: in STD_LOGIC_VECTOR(7 downto 0);

b: in STD_LOGIC_VECTOR(7 downto 0);

sel: in STD_LOGIC;

y: out STD_LOGIC_VECTOR(7 downto 0)

);

end mux2;

port statement defines inputs and outputs

### Entity

Mode: in or out

library IEEE;

use IEEE.std_logic_1164.all;

entity mux2 is

port (

a: in STD_LOGIC_VECTOR(7 downto 0);

b: in STD_LOGIC_VECTOR(7 downto 0);

sel: in STD_LOGIC;

y: out STD_LOGIC_VECTOR(7 downto 0)

);

end mux2;

Data type: STD_LOGIC,

STD_LOGIC_VECTOR(7 downto 0);

a(7:0)

8-line

2 x 1

y(7:0)

MUX

b(7:0)

sel

Architecture

architecture mux2_arch of mux2 is

begin

mux2_1: process(a, b, sel)

begin

if sel = '0' then

y <= a;

else

y <= b;

endif;

end process mux2_1;

end mux2_arch;

Note: <= is signal assignment

Architecture

entity name

process sensitivity list

architecture mux2_arch of mux2 is

begin

mux2_1: process(a, b, sel)

begin

if sel = '0' then

y <= a;

else

y <= b;

endif;

end process mux2_1;

end mux2_arch;

Sequential statements (if…then…else) must be in a process

Note begin…end

in process

Note begin…end

in architecture

Sely

“00”a

“01”b

“10”c

“11”d

a(7:0)

8-line

b(7:0)

4 x 1

y(7:0)

c(7:0)

MUX

d(7:0)

sel(1:0)

### An 8-line 4 x 1 multiplexer

library IEEE;

use IEEE.std_logic_1164.all;

entity mux4 is

port (

a: in STD_LOGIC_VECTOR (7 downto 0);

b: in STD_LOGIC_VECTOR (7 downto 0);

c: in STD_LOGIC_VECTOR (7 downto 0);

d: in STD_LOGIC_VECTOR (7 downto 0);

sel: in STD_LOGIC_VECTOR (1 downto 0);

y: out STD_LOGIC_VECTOR (7 downto 0)

);

end mux4;

Sely

“00”a

“01”b

“10”c

“11”d

### Example of case statement

architecture mux4_arch of mux4 is

begin

process (sel, a, b, c, d)

begin

case sel is

when "00" => y <= a;

when "01" => y <= b;

when "10" => y <= c;

when others => y <= d;

end case;

end process;

end mux4_arch;

Note implies operator =>

Must include ALL posibilities

in case statement

Note: + sign synthesizes

library IEEE;

use IEEE.std_logic_1164.all;

use IEEE.std_logic_unsigned.all;

generic(width:positive);

port (

a: in STD_LOGIC_VECTOR(width-1 downto 0);

b: in STD_LOGIC_VECTOR(width-1 downto 0);

y: out STD_LOGIC_VECTOR(width-1 downto 0)

);

begin

begin

y <= a + b;

Binary-to-BCD Converter

-- Title: Binary-to-BCD Converter

library IEEE;

use IEEE.std_logic_1164.all;

use IEEE.std_logic_unsigned.all;

entity binbcd is

port (

B: in STD_LOGIC_VECTOR (7 downto 0);

P: out STD_LOGIC_VECTOR (9 downto 0)

);

end binbcd;

architecture binbcd_arch of binbcd is

begin

bcd1: process(B)

variable z: STD_LOGIC_VECTOR (17 downto 0);

begin

for i in 0 to 17 loop

z(i) := '0';

endloop;

z(10 downto 3) := B;

for i in 0 to 4 loop

if z(11 downto 8) > 4 then

z(11 downto 8) := z(11 downto 8) + 3;

endif;

if z(15 downto 12) > 4 then

z(15 downto 12) := z(15 downto 12) + 3;

endif;

z(17 downto 1) := z(16 downto 0);

endloop;

P <= z(17 downto 8);

end process bcd1;

end binbcd_arch;

### A Register

-- A width-bit register

library IEEE;

use IEEE.std_logic_1164.all;

entity reg is

generic(width: positive);

port (

d: in STD_LOGIC_VECTOR (width-1 downto 0);

clr: in STD_LOGIC;

clk: in STD_LOGIC;

q: out STD_LOGIC_VECTOR (width-1 downto 0)

);

end reg;

Register architecture

architecture reg_arch of reg is

begin

process(clk, clr)

begin

if clr = '1' then

for i in width-1 downto 0 loop

q(i) <= '0';

end loop;

elsif (clk'event and clk = '1') then

q <= d;

end if;

end if;

end process;

end reg_arch;

Infers a flip-flop for all

outputs (q)

Fibonacci Sequence

-- Title: Fibonacci Sequence

library IEEE;

use IEEE.STD_LOGIC_1164.all;

use IEEE.std_logic_unsigned.all;

entity fib is

port(

clr : in std_logic;

clk : in std_logic;

P : out std_logic_vector(9 downto 0)

);

end fib;

P

architecture fib_arch of fib is

generic(

width : POSITIVE);

port(

a : in std_logic_vector((width-1) downto 0);

b : in std_logic_vector((width-1) downto 0);

y : out std_logic_vector((width-1) downto 0));

endcomponent;

component reg

generic(

width : POSITIVE);

port(

d : in std_logic_vector((width-1) downto 0);

clr : in std_logic;

set : in std_logic;

clk : in std_logic;

q : out std_logic_vector((width-1) downto 0));

end component;

Declare

components

component binbcd

port(

B : in std_logic_vector(7 downto 0);

P : out std_logic_vector(9 downto 0));

end component;

signal r, s, t: std_logic_vector(7 downto 0);

signal one, zero: std_logic;

constant bus_width: positive := 8;

begin

one <= '1';

zero <= '0';

U1: adder generic map(width => bus_width) port map

(a => t, b => r, y => s);

R1: reg generic map(width => bus_width) port map

(d => r, load =>one, clr => zero, set => clr,

clk =>clk, q => t);

W: reg generic map(width => bus_width) port map

(d => s, load => one, clr => clr, set => zero,

clk =>clk, q => r);

U2: binbcd port map

(B => r, P => P);

end fib_arch;

Wire up the circuit