FPGAs and VHDL

Post on 05-Jan-2016

78 views 1 download

description

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. - PowerPoint PPT Presentation

Transcript of FPGAs and VHDL

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

Look Up Tables

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

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

• Example:

A B C D Z

0 0 0 0 00 0 0 1 00 0 1 0 00 0 1 1 10 1 0 0 10 1 0 1 1 . . .1 1 0 0 01 1 0 1 01 1 1 0 01 1 1 1 1

Look Up Table

Combinatorial Logic

AB

CD

Z

4-bit address

GFunc.Gen.

G4G3G2G1

WE

2(2 )4

= 64K !

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)

b(7:0)y(7:0)

sel

sel y

0 a

1 b

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;

An 8-line 2 x 1 MUX

a(7:0)

b(7:0)

y(7:0)

sel

8-line2 x 1MUX

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

port statement defines inputs and outputs

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

Mode: in or out

Data type: STD_LOGIC,STD_LOGIC_VECTOR(7 downto 0);

 architecture mux2_arch of mux2 isbegin mux2_1: process(a, b, sel) begin if sel = '0' then y <= a; else y <= b; end if; end process mux2_1;end mux2_arch;

Architecture

a(7:0)

b(7:0)

y(7:0)

sel

8-line2 x 1MUX

Note: <= is signal assignment

 architecture mux2_arch of mux2 isbegin mux2_1: process(a, b, sel) begin if sel = '0' then y <= a; else y <= b; end if; end process mux2_1;end mux2_arch;

Architecture entity name

process sensitivity list

Sequential statements (if…then…else) must

be in a process

Note begin…end

in processNote begin…end

in architecture

An 8-line 4 x 1 multiplexer

a(7:0)

b(7:0)y(7:0)

sel(1:0)

8-line4 x 1MUXc(7:0)

d(7:0)

Sel y

“00” a

“01” b

“10” c

“11” d

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;

Example of case statement

architecture mux4_arch of mux4 isbegin 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; Must include ALL posibilities

in case statement

Note implies operator =>

Sel y

“00” a

“01” b

“10” c

“11” d

An Adder-- Title: adderlibrary IEEE;use IEEE.std_logic_1164.all;use IEEE.std_logic_unsigned.all; entity adder 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) );end adder; architecture adder_arch of adder isbegin add1: process(a, b) begin y <= a + b; end process add1;end adder_arch;

adder

y(n-1:0)

b(n-1:0) a(n-1:0)

Note: + sign synthesizesan n-bit full adder!

Binary-to-BCD Converter

-- Title: Binary-to-BCD Converterlibrary 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 isbegin bcd1: process(B) variable z: STD_LOGIC_VECTOR (17 downto 0); begin for i in 0 to 17 loop

z(i) := '0'; end loop; 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; end if; if z(15 downto 12) > 4 then z(15 downto 12) := z(15 downto 12) + 3; end if; z(17 downto 1) := z(16 downto 0);

end loop;

P <= z(17 downto 8); end process bcd1; end binbcd_arch;

A Register

-- A width-bit registerlibrary IEEE;use IEEE.std_logic_1164.all; entity reg is generic(width: positive); port ( d: in STD_LOGIC_VECTOR (width-1 downto 0); load: in STD_LOGIC; clr: in STD_LOGIC;

clk: in STD_LOGIC; q: out STD_LOGIC_VECTOR (width-1 downto 0) );end reg; 

regclk

clrload

d(n-1:0)

q(n-1:0)

architecture reg_arch of reg isbegin 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 if load = '1' then q <= d; end if; end if; end process; end reg_arch;

regclk

clrload

d(n-1:0)

q(n-1:0)

Register architecture

Infers a flip-flop for alloutputs (q)

W clrclk

1

+B A

S

hunds

88

8

8

R1set

clk1

binbcdunitstens

set

clr

r

s

tr

r

Fibonacci Sequence

-- Title: Fibonacci Sequencelibrary 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  

component addergeneric(

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));

end component; 

component reggeneric(

width : POSITIVE);port(

d : in std_logic_vector((width-1) downto 0);load : in std_logic;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 binbcdport(

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;

W clrclk

1

+B A

S

hunds

88

8

8

R1set

clk1

binbcdunitstens

set

clr

r

s

tr

r

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;

W clrclk

1

+B A

S

hunds

88

8

8

R1set

clk1

binbcdunitstens

set

clr

r

s

tr

r

Wire up the circuit

Fibonacci Sequence Works!