hardware development on fpga using vhdl

27
Hardware development on FPGA using VHDL Benny Thörnberg Associate Professor in Electronics

Upload: others

Post on 16-May-2022

28 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Hardware development on FPGA using VHDL

Hardware development on

FPGA using VHDL

Benny Thörnberg

Associate Professor in Electronics

Page 2: Hardware development on FPGA using VHDL

2

Parallel statements

� Parallel statements are at architecture-level

� Parallel statements

� The order of the statements as they appear in the code has no meaning

� The result is an event (signal-assignment) in future simulation time

� The parallel statements are

� With-select-when

� When-else

Page 3: Hardware development on FPGA using VHDL

3

WITH-SELECT-WHEN

� Is called ”selected signal assignment”

� Parallel statement – sensitive to and operates on signals

� Selects one out of several values that will drive the signal

� The selection is based on all possible values of an expression

with expression select

outsignal <= value1 when val1,

value2 when val2,

...

value9 when val9;

Page 4: Hardware development on FPGA using VHDL

4

Results generated from with-select-when

val9val1

value1

value2

value9

outsignal

multiplexer

with expression select

outsignal <= value1 when val1,

value2 when val2,

...

value9 when val9;

Page 5: Hardware development on FPGA using VHDL

5

A range of values can be specified

Logical expressions allowed

others is a default choice when

none of the listed choices are true

Examples of use of with-select-when

-- 2-to-1 multiplexer

with addsub select

opcode <= add when ’0’,

sub when ’1’;

with (a and b) select

out <= "1011" when "00"

"11--" when "1Z",

x OR y when "11",

"0000" when others;

add sub

opcode

addsub

with min_integer select

outvec <= X"1F" when 35,

X"27" when 2 TO 5,

X"FF" when OTHERS;

Page 6: Hardware development on FPGA using VHDL

6

When-else

� Also called ”conditional signal assignment”

� Parallel statement – sensitive to and operates on signals

� Selects one of several values to drive the signal

� The selection is based on the first condition to be true

outsignal <= value1 when cond1 else

value2 when cond2 else

...

value9;

Page 7: Hardware development on FPGA using VHDL

7

Example on the use of when-else

opcode <= add when (addsub = ’0’) else

sub when (addsub = ’1’) else

nop;

out <= "1011" when (a = ’0’) else

"11--" when (b = ’0’) else

x OR y when (a AND b) = ’1’ else

"0000";

-- 4-to-2 priority encoder

outcode <= "11" when in3 = ’1’ else

"10" when in2 = ’1’ else

"01" when in1 = ’1’ else

"00" when in0 = ’1’ else

"00";

Page 8: Hardware development on FPGA using VHDL

8

Processes

� A process is a sequential program

� Many processes in an architecture are

executed in parallel

� Communication between processes is done

through signals

� Syntax:

[<process_name>:] process [(sensitivity list>)]

[<declarations in the process>]

begin

<sequential statements>

end process [<process_name>];

Page 9: Hardware development on FPGA using VHDL

9

Activated if a, b or c is changed

Activating processes

Active/executing

Waiting

Process is activated when:

-signal in sensitivity list is

changed or

-Signal in wait-statement

Process terminates when:

-end process is reached

-wait-statement is reached

process(a, b, cin)

begin

s <= a xor b xor cin;

end process;

process

begin

s <= a xor b xor cin;

wait on a,b,cin

end process;

Goes to wait-state

Page 10: Hardware development on FPGA using VHDL

10

Logic expression with IF-THEN-ELSE in a combinatorial process

� Example:

process (xbus)

begin

if xbus = "111"

then

doitnow <= ’1’;

else

doitnow <= ’0’;

end if;

end process;

Page 11: Hardware development on FPGA using VHDL

11

Incorrect usage of IF-THEN …

� Example:process (xbus)

begin

if xbus = "111" then

doitnow <= ’1’; -- a latch will be introduced

end if;

end process;

D Q

G

D-LATCH

doitnow

Xbus(2)

Xbus(1)

Xbus(0)

Nothing in the code assigns the output

To ’0’

Page 12: Hardware development on FPGA using VHDL

process (a,b,c)

begin

d <= (a and b) or c;

end process;

� Include all input signals into the sensitivity list

� If not, the simulation will behave differently from synthesized hardware

� Most synthesis tools do not even consider sensitivity lists

12

Sensitivity list

� Example of combinatorial process:

a

bc

d

Synthesis

process

begin

d <= (a and b) or c;

wait on a,b,c;

end process;

Alternatively

Page 13: Hardware development on FPGA using VHDL

13

Timing in synchronous systems

� General model for a synchronous system

Combinational logicQ1 D2 Q2

C

tC-Q

tC-Q

tLOGIK tSETUP

tMARGIN

C

Q1

D2

tLOGIK

tSETUP

On clock cycle is the sum of the delays:

MARGINALSETUPLOGIKQC ttttT +++=−

With no timing margin we have obtained the

highest possible clock frequency:

SETUPLOGIKQC tttTf

++

==

11

min

max

tC-Q and tSETUP are

delays in the flip-flop

Page 14: Hardware development on FPGA using VHDL

14

Synchronous processes in VHDL

� Synchronous processes

� Also called clocked processes

� All activated simultaneously at the active clock edge

� Signal assignments in a synchronous process results

in flip-flops

inputs outputs

clock

Page 15: Hardware development on FPGA using VHDL

15

Keeps the old value

Latches the new value in the FF clk’event and clk=’1’

clk

clk’event

Example: positive edge-triggeredD-FF in VHDL

library ieee;

use ieee.std_logic_1164.ALL

entity dff IS

port (d, clk : in std_logic;

q : out std_logic);

end dff;

architecture behavior of dff is

begin

process(clk)

begin

if (clk’event and clk = ’1’) then

q <= d;

else

q <= q;

end if;

end process;

end behavior;

clk

d q

dff

Page 16: Hardware development on FPGA using VHDL

16

Signal assignment leads to introduction of

FF’s

Example: Code that introduces FF’s in the design

Write a function that stores an 8-bit number in a register if it is greater than 10.

If it is less than 10 the register shall contain 10.

10

10

d

q

2:1 MUX

clk

0

1

d>10

entity load_ge_10 is

port (

clk : in std_logic;

d : in std_logic_vector (7 downto 0);

q : out std_logic_vector (7 downto 0));

end load_ge_10;

architecture rtl of load_ge_10 is

begin

process (clk)

begin

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

if d > 10 then

q <= d;

else

q <= conv_std_logic_vector(10,8);

end if;

end if;

end process;

end rtl;

Page 17: Hardware development on FPGA using VHDL

17

Initialization of FF’s

� At system start the FF’s needs to be initialized

� Two types of initializations

� Synchronous reset/preset

� Asynchronous reset/preset

� Example: synchronous reset

if (clk’event and clk = ’1’) then

if reset = ’1’ then q <= ’0’;

else q <= d;

end if;

end if;

D Q

reset

Page 18: Hardware development on FPGA using VHDL

18

� Example: Asynchronous reset

� Exemple: Asynchronous presetprocess (clk, preset)

begin

if preset = ’1’ then q <= ’1’;

elsif (clk’event and clk = ’1’) then q <= d;

end if;

end process;

D Q

preset

process (clk, reset)

begin

if reset = ’1’ then q <= ’0’;

elsif (clk’event and clk = ’1’) then q <= d;

end if;

end process;

D Q

reset

Cont. Initialization of FF’s

Page 19: Hardware development on FPGA using VHDL

19

� Automatic synthesis

Develop a state diagram for the problem

Write VHDL-code that captures the problem

Automatic synthesis will perform coding of

state graph and generate a gate level netlist

Design of state machines

Page 20: Hardware development on FPGA using VHDL

20

Moore type in VHDL

library ieee; use ieee.std_logic_1164.all;

entity fsm1 is

port (aIn, clk: in std_logic; yOut: out std_logic);

end fsm1;

architecture moore of fsm1 is

type state is (s1, s2, s3, s4);

signal present_state, next_state: state;

begin

process (aIn, present_state) begin

case present_state is

when s1 => yOut <= ’0’;

if (aIn = ’1’) then next_state <= s1

else next_state <= s2;

when s2 => yOut <= ’0’; next_state <= s3;

when s3 => yOut <= ’1’; next_state <= s4;

when s4 => yOut <= ’1’; next_state <= s1;

end case;

end process;

process begin

wait until clk = ’1’;

present_state <= next_state;

end process;

end moore;

S1 S2

S4 S3

yOut=0

aIn=0

yOut=0

yOut=1 yOut=1

aIn=0

aIn=0

aIn=0

aIn=1

Page 21: Hardware development on FPGA using VHDL

21

Mealy type in VHDL

architecture mealy of fsm2 is

type state is (S1, S2, S3, S4);

signal present_state, next_state: state;

begin

process (aIn, present_state) begin

CASE present_state IS

when s1 => if (aIn = ’1’)

then yOut <= ’0’; next_state <= s4;

else yOut <= ’1’; next_state <= s3;

end if;

when s2 => yOut <= ’1’; next_state <= s3;

when s3 => yOut <= ’1’; next_state <= s1;

when s4 => if (aIn = ’1’)

then yOut <= ’1’; next_state <= s2;

else yOut <= ’0’; next_state <= s1;

end if;

end case;

end process;

process begin

wail until clk = ’1’;

present_state <= next_state;

end process;

end mealy;

S1 S4

S3 S2

aIn=1/yOut=1

aIn=-/yOut=1

aIn=0/yOut=0

aIn=1/yOut=0

aIn=0/

yOut=1

aIn=-/

yOut=1

aIn yOut

next_statepresent_state

Page 22: Hardware development on FPGA using VHDL

22

Counters in VHDL

library ieee;

use ieee.std_logic_1164.ALL;

use work.numeric_std.ALL;

entity modulo8 IS

PORT(clk: in std_logic;

cnt: buffer unsigned (7 downto 0));

END count8;

architecture rtl of count8 is

begin

process (clk)

begin

if rising_edge(clk) then cnt <= cnt +1;

end if

end process;

end rtl;

� Modulo-8 counter

Page 23: Hardware development on FPGA using VHDL

23

Shift-register in VHDL

entity shift_r is

port (

clk, resetn, d_in, shift_en : in std_logic;

shift_out : out std_logic_vector(3 downto 0));

end shift_r;

architecture rtl of shift_r is

signal shift_reg: std_logic_vector(3 downto 0);

begin

process (clk, resetn)

begin

if resetn = '0' then

shift_reg <= (others=>'0');

elsif clk'event and clk = '1' then

if shift_en='1' then

shift_reg(3 downto 1) <= shift_reg(2 downto 0);

-- shift_reg <= shl(shift_reg, "1");

-- shift_reg <= shift_reg sll 1;

shift_reg(0) <= d_in;

end if;

end if;

end process;

shift_out <= shift_reg;

end rtl;

d_in shift_out

shift_en

resetn

Alternative ways

Page 24: Hardware development on FPGA using VHDL

24

Memories in VHDL

� A RAM or ROM can be designed in two ways

� Use the datatype array

� Use a pre-defined macro cell for the memory device

Page 25: Hardware development on FPGA using VHDL

25

Example: 4×8 ROM in VHDL

library ieee;

use ieee.std_logic_1164.all;

use ieee.std_logic_unsigned.all;

entity ROM is

port (

address : in std_logic_vector(1 downto 0);

dout : out std_logic_vector(7 downto 0));

end ROM;

architecture rtl of ROM is

type rom_table is array (0 to 3) of std_logic_vector(7 downto 0);

constant rom_contents : rom_table := rom_table'("00101111",

"11010000",

"01101010",

"11101101");

begin -- rtl

dout <= rom_contents(conv_integer(address));

end rtl;

Page 26: Hardware development on FPGA using VHDL

26

Define existing RAM module

existing in a library

Example #1: RAM in VHDL

architecture rtl of rmodul is

component RAM4_8

port (

din: in std_logic_vector(7 downto 0),

address0, address1, we : in std_logic;

dout : out std_logic_vector(7 downto 0);

end component;

begin -- rtl

ram1:

RAM4_8 port map (

din => d,

address0 => a0,

address1 => a1,

we => we,

dout => q)

end rtl;

din dout

address0

address1

we

RAM4_8

din

a0

a1

we

q

Page 27: Hardware development on FPGA using VHDL

27

Define a matrix

Example #2: Synchronous RAM in VHDLlibrary ieee;

use ieee.std_logic_1164.all;

use ieee.std_logic_unsigned.all;

entity ram32_16 is

port (

addr : in std_logic_vector(4 downto 0);

clk, we_n : in std_logic;

din : in std_logic_vector(15 downto 0);

dout : out std_logic_vector(15 downto 0));

end ram32_16;

architecture rtl of ram32_16 is

type ram_type is array (31 downto 0)

of std_logic_vector(15 downto 0);

signal ram_array : ram_type;

begin

process(clk)

begin

if clk'event and clk='1' then

if we_n='0' then

ram_array(conv_integer(addr)) <= din;

end if;

end if;

end process;

dout <= ram_array(conv_integer(addr));

end rtl;

dindout

addr

we_n

RAM32_16

clk