0% found this document useful (0 votes)
68 views20 pages

Digital Logic Design: VHDL Coding For Fpgas Unit 3

The document discusses behavioral (sequential) description in VHDL for implementing combinational logic circuits. It describes using asynchronous processes with sequential statements like if-else statements to describe circuits like multiplexers, encoders, and comparators. Sensitivities lists include all signals used within the process. Statements are executed sequentially to determine outputs. Examples show different coding styles for common logic functions.

Uploaded by

Srinivas Cheruku
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
68 views20 pages

Digital Logic Design: VHDL Coding For Fpgas Unit 3

The document discusses behavioral (sequential) description in VHDL for implementing combinational logic circuits. It describes using asynchronous processes with sequential statements like if-else statements to describe circuits like multiplexers, encoders, and comparators. Sensitivities lists include all signals used within the process. Statements are executed sequentially to determine outputs. Examples show different coding styles for common logic functions.

Uploaded by

Srinivas Cheruku
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 20

DIGITAL LOGIC DESIGN

VHDL Coding for FPGAs


Unit 3
BEHAVIORAL DESCRIPTION
 Asynchronous processes (decoder, mux,
encoder, etc): if-else, case, for-loop.
 Arithmetic expressions inside asynchronous
processes.

Daniel Llamocca
 BEHAVIORAL DESCRIPTION
(OR SEQUENTIAL)
 In this design style, the circuit is described via a series of
statements (also called sequential statements) that are
executed one after other; here the order is very important.
This feature is advantageous when it comes to implement
sequential circuits. The sequential statements must be
within a block of VHDL code called ‘process’.

 The sequential code suits the description of sequential circuits


very well. However, we can also describe combinatorial
circuits with sequential statements.

 Here we will use the sequential description style to implement


combinatorial circuits. In this instance, the block of VHDL code
(‘process’) is called asynchronous process.
Daniel Llamocca
 ASYNCHRONOUS PROCESSES
(Implementation of combinatorial circuits with sequential statements)
Below we show the syntax of a sequential description. Note that the
‘process’ statement denotes the sequential block.

entity example is
port ( ...
...);
end example;

architecture behav of example is


begin
process (signal_1, signal_2, ...)
Beginning begin
of process block
...
... Sequential
Sensitivy list
... Statements (all the signals used
inside the process)

End of
process block end process;
Daniel Llamocca end behav;
 SEQUENTIAL STATEMENTS:
 IF Statement: Simple Conditional
 Example: AND gate. The sensitivity list is made of ‘a’ and ‘b’. We
can use any other gate: OR, NOR, NAND, XOR, XNOR.
 It is a good coding practice to include all the signals used inside
the process in the sensitivity list.
 Xilinx Synthesizer: DO NOT omit any signal in the sensitivity list,
otherwise the Behavioral Simulation (iSIM) will be incorrect. This
is usually not a problem for other Synthesizers.
library ieee; architecture behav of my_and is
use ieee.std_logic_1164.all; begin
process (a,b)
entity my_and is begin
port ( a, b: in std_logic; if (a = '1') and (b = '1') then
f: out std_logic); f <= '1';
end my_and; else
f <= '0';
a end if;
f end process;
b end behav;
Daniel Llamocca
 IF Statement:
 Example: 2-to-1 Multiplexor:
Three different coding styles: a
0
y
library ieee;
use ieee.std_logic_1164.all; b 1

entity my_mux21 is
s
port ( a, b, s: in std_logic;
y: out std_logic); y = sa + sb
end my_mux21;
architecture st of my_mux21 is architecture st of my_mux21 is
begin begin
process (a,b,s)
y <= (not(s) and a) or (s and b); begin
if s = '0' then
end st; y <= a;
architecture st of my_mux21 is else
begin y <= b;
with s select end if;
y <= a when '0', end process;
b when others; end st;
end st;
Daniel Llamocca
 IF Statement:
 Example: 4-to-1 Multiplexor
Two different styles: a
0
b
library ieee;
1 y
use ieee.std_logic_1164.all; c
2
entity my_mux41 is d
3
port ( a,b,c,d: in std_logic;
s: in std_logic_vector (1 downto 0); 2
y: out std_logic); s
end my_mux41;

architecture st of my_mux41 is architecture st of my_mux41 is


begin begin
with s select process (a,b,c,d,s)
y <= a when "00", begin
b when "01", if s = "00" then y <= a;
c when "10", elsif s = "01" then y <= b;
d when "11", elsif s = "10" then y <= c;
'-' when others; else y <= d;
end st; end if;
end process;
end st;
Daniel Llamocca
 IF Statement
library ieee;
 Example: use ieee.std_logic_1164.all;
4-to-2 priority encoder
entity my_prienc is
w3 port ( w: in std_logic_vector (3 downto 0);
y1
y: out std_logic_vector (1 downto 0);
w2 z: out std_logic);
PRIORITY y0
w1 ENCODER end my_prienc;
w0 z
architecture bhv of my_prienc is
w3 w2 w1 w0 y1 y0 z begin
process (w)
0 0 0 0 0 0 0
begin
1 x x x 1 1 1 if w(3) = '1' then y <= "11";
elsif w(2) = '1' then y <= "10;
0 1 x x 1 0 1 elsif w(1) = '1' then y <= "01";
0 0 1 x 0 1 1 else y <= "00";
end if;
0 0 0 1 0 0 1
if w = "0000" then
z <= '0';
• The priority level is implicit else
by having w(3) in the first z <= '1';
‘if’, and w(2) in the second end if;
end process;
‘if’, and so on.
end bhv;
Daniel Llamocca
 IF Statement
 Example: 4-to-2 library ieee;
priority encoder use ieee.std_logic_1164.all;
(another style) entity my_tprienc is
port ( w: in std_logic_vector (3 downto 0);
 Process: Statements are
y: out std_logic_vector (1 downto 0);
‘executed’ (the way the z: out std_logic);
synthesizer reads it) one end my_tprienc;
after the other.
 The first statement architecture bhv of my_tprienc is
assigns y <= “00”. Then begin
process (w)
the value of ‘y’ changes
begin
ONLY if the conditions are y <= "00";
met for the input ‘w’. if w(1) = '1' then y <= "01"; end if;
 Note the order: w(1), if w(2) = '1' then y <= "10"; end if;
w(2), w(3). This if w(3) = '1' then y <= "11"; end if;
establishes a priority for
z <= '1';
w(3) (last statement to if w = "0000" then z <= '0'; end if;
be executed). end process;
 ‘z’ starts with ‘1’, but if end bhv;
the condition is met, it is
changed to ‘0’.
Daniel Llamocca
 IF Statement:
 Example: 4-bit comparator
library ieee; A
use ieee.std_logic_1164.all; COMPA- y
use ieee.std_logic_unsigned.all; -- unsigned #s RATOR
B A = B?
entity my_comp is
port ( A,B: in std_logic_vector (3 downto 0);
y: out std_logic);
end my_comp;
architecture struct of my_comp is architecture behav of my_comp is
begin begin
y <= '1' when A = B else '0'; process (a,b)
end struct; begin
A3 if (A = B) then
B3 y <= '1';
A2
else
y <= '0';
B2 y end if;
A1 end process;
B1 end behav;

A0
B0
Daniel Llamocca
 IF Statement:
 Example of ‘bad design’:
4-bits comparator, but the ‘else’ is omitted:
Warning! library ieee;
use ieee.std_logic_1164.all;
If a ≠ b  y = ? use ieee.std_logic_unsigned.all; -- unsigned #s
Since we did not
specify what happens entity my_comp is
when a ≠ b, the port ( A,B: in std_logic_vector (3 downto 0);
synthesizer assumes y: out std_logic);
end my_comp;
that we want to keep
the last value of ‘y’. architecture behav of my_comp is
In the circuit, initially ‘y’ begin
will be ‘0’. But: process (a,b)
begin The synthesized circuit
If a = b  y = ‘1’ would look like this:
if (A = B) then
forever. It is said that y <= '1'; A3

the output has an end if; B 3

implicit memory since it end process; A 2

‘remembers’ the end behav;


B 2
y
previous value of y. A1
B1
This results in a faulty
A0
comparator. B0
Daniel Llamocca
 RULES FOR A GOOD COMBINATORIAL
DESIGN USING PROCESSES
 Rule 1: EVERY input signal that is used within the process must
appear in the sensitivy list.

 Rule 2: ALL the possible Input/Output combinations must be


specified. Otherwise, we will find issues with implicit memory..

architecture behav of my_comp is architecture behav of my_comp is


begin begin
process (a,b) process (a,b) The case 'A B'
begin is never specified
begin
if (A = B) then if (A = B) then
y <= '1'; y <= '1';
else end if;
y <= '0'; end process;
end if; end behav;
end process;
end behav;

Daniel Llamocca
 IF Statement. Example: Majority gate
Triple Modular Redundancy: library ieee;
To improve reliability, a use ieee.std_logic_1164.all;
system is replicated three
times. The 3 generated entity my_maj_gate is
outputs go into a majority- generic (N: INTEGER:= 8);
port (A,B,C: in std_logic_vector(N-1 downto 0);
voting system (majority gate) f: out std_logic_vector(N-1 downto 0);
to produce a single output. y_err: out std_logic);
If at least two replicas end my_maj_gate;
produce identical outputs 
architecture bhv of my_maj_gate is
the majority gate selects that begin
output. If the three replicas process (A,B,C)
produce different results, the begin
majority gate asserts an error y_err <= '0';
flag (y_error = ‘1’) if (A = B) then f <= A; end if;
if (A = C) then f <= A; end if;
N N
System if (B = C) then f <= B; end if;
replica 1
if (A/=B) and (B/=C) and (A/=C) then
N System N N
f <= (others => '0');
Majority
replica 2 gate y_err <= '1';
y_error
end if;
N
System
N
end process;
replica 3 end bhv;
 my_maj_gate.zip: my_maj_gate.vhd,
Daniel Llamocca tb_ my_maj_gate.vhd
 SEQUENTIAL STATEMENTS:
CASE statement library ieee;
use ieee.std_logic_1164.all;

It is used in multi-decision entity my_mux8to1 is


cases when nested IF’s port ( a,b,c,d,e,f,g,h: in std_logic;
s: in std_logic_vector (2 downto 0);
become complex.
y: out std_logic);
All possible choices must be end my_mux8to1;
included (see the keyword
when for every choice of the architecture bhv of my_mux8to1 is
begin a
‘selection signal’) 0
process (a,b,c,d,e,f,g,h,s) b
Last case: We must use when begin 1
others (even if all the 0/1s, case s is c
2
as std_logic has 9 possible when "000" => y <= a; d
3 y
values). This also avoids when "001" => y <= b; e
when "010" => y <= c; 4
outputs with implicit memory. f
when "011" => y <= d; 5
when "100" => y <= e; g
6
 Example: MUX 8-to-1  when "101" => y <= f; h
when "110" => y <= g; 7
when others => y <= h; 3
end case; s
end process;
end bhv;
Daniel Llamocca
 CASE Statement:
library ieee;
 Example: MUX 7-to-1 use ieee.std_logic_1164.all;

entity my_mux7to1 is
 Note: y <= ‘-’ (don’t care). port ( a,b,c,d,e,f,g: in std_logic;
This allows the synthesizer to s: in std_logic_vector (2 downto 0);
optimize the circuit. y: out std_logic);
end my_mux7to1;

 If, however, we had used architecture bhv of my_mux7to1 is


when others => y <= g; begin
The synthesizer would have process (a,b,c,d,e,f,g,s)
assigned the value ‘g’ for the begin
case s is
cases “110” and “111” (a when "000" => y <= a;
slighty less optimal circuit). when "001" => y <= b;
when "010" => y <= c;
when "011" => y <= d;
when "100" => y <= e;
when "101" => y <= f;
when "110" => y <= g; -- when others => y <= g;
when "111" => y <= g; when "110" => y <= g;
when others => y <= '-';
end case;
end process;
end bhv;
Daniel Llamocca
 CASE Statement:
library ieee;
 Example: use ieee.std_logic_1164.all;
Binary to gray decoder
 It could also be entity my_gray2bin is
port ( B: in std_logic_vector(2 downto 0);
described using the G: in std_logic_vector(2 downto 0));
‘with-select’ statement end my_gray2bin;
(no process)
architecture bhv of my_gray2bin is
begin
process (B)
begin
g 2g 1g 0 case B is
b2b1b0
when "000" => G <= "000";
0 0 0 0 0 0 when "001" => G <= "001";
0 0 1 0 0 1 when "010" => G <= "011";
0 1 0 0 1 1 when "011" => G <= "010";
0 1 1 0 1 0 when "100" => G <= "110";
when "101" => G <= "111";
1 0 0 1 1 0
when "110" => G <= "101";
1 0 1 1 1 1
when others => G <= "100";
1 1 0 1 0 1 end case;
1 1 1 1 0 0 end process;
end bhv;
Daniel Llamocca
 CASE statement library ieee;
use ieee.std_logic_1164.all;
 Example:
7-segment decoder. entity my_7segdec is
port ( bcd: in std_logic_vector(3 downto 0);
leds: out std_logic_vector(6 downto 0));
 We use the don’t care end my_7segdec;
value (‘-’) to optimize
the circuit, since we only architecture bhv of my_7segdec is
begin
expect inputs from
process (bcd)
“0000” to “1111”. begin
case bcd is -- abcdefg
when "0000" => leds <= "1111110";
 Note that the CASE
when "0001" => leds <= "0110000";
statement avoids the when "0010" => leds <= "1101101";
output with implicit when "0011" => leds <= "1111001";
memory, since the when when "0100" => leds <= "0110011";
others clause makes when "0101" => leds <= "1011011";
sure that the remaining when "0110" => leds <= "1011111";
when "0111" => leds <= "1110000";
cases are assigned.
when "1000" => leds <= "1111111";
when "1001" => leds <= "1111011";
when others => leds <= "-------";
end case;
end process;
Daniel Llamocca end bhv;
 CASE Statement:
 Example: library ieee;
2-to-4 decoder with enable. use ieee.std_logic_1164.all;
 Note how we combine IF entity my_dec2to4 is
with CASE for this decoder port ( w: in std_logic_vector(1 downto 0);
with enable. y: out std_logic_vector(3 downto 0);
E: in std_logic);
 The else cannot be
end my_dec2to4;
omitted, otherwise the
output will have implicit architecture bhv of my_dec2to4 is
memory (it will be a LATCH) begin
process (w,E)
begin
w 2 if E = '1' then
4 y
DECODER case w is
E when "00" => y <= "0001";
when "01" => y <= "0010";
when "10" => y <= "0100";
when others => y <= "1000";
Example: 2-to-4 decoder (3 styles): end case;
 mydec2to4.zip: else y <= "0000";
mydec2to4.vhd, end if;
end process;
tb_mydec2to4.vhd,
end bhv;
mydec2to4.ucf
Daniel Llamocca
 FOR-LOOP statement
 Very useful for library ieee;
sequential circuit use ieee.std_logic_1164.all;
description. But, it
can also be used entity my_signext is
to describe some port ( A: in std_logic_vector(3 downto 0);
combinatorial y: out std_logic_vector(7 downto 0));
circuits. end my_signext;

architecture bhv of my_signext is


begin b3b2b1b0
 Example: Sign-
extension (from 4 process(A) 4
begin
bits to 8 bits)
y(3 downto 0) <= A;
for i in 7 downto 4 loop sign-
y(i) <= A(3); extender
end loop;
end process;
end bhv; 8
b3b3b3b3b3b2b1b0

Daniel Llamocca
 FOR-LOOP statement
 Example: Ones/zeros detector: It detects whether the input contains only 0’s
or only 1’s. library ieee;
use ieee.std_logic_1164.all;
 Input length:
entity zeros_ones_det is
Parameter ‘N’.
generic (N: INTEGER:= 8);
 This is a rare instance port (in_data: in std_logic_vector(N-1 downto 0);
where using process all_zeros, all_ones: out std_logic);
for combinational end zeros_ones_det;
circuits is the most architecture bhv of zeros_ones_det is
efficient description. begin
process(in_data)
 Variable inside a variable result_and, result_or: std_logic;
process: it helps to begin
describe this circuit. result_and:= '1'; result_or:= '0';
Depending on the for i in in_data'range loop
implementation, a result_and:= result_and and in_data(i);
result_or:= result_or or in_data(i);
‘variable’ could be a end loop;
wire. all_zeros <= not(result_or);
all_ones <= result_and;
end process;
end bhv;  zeros_ones_detector.zip:
all_ones

in_data
in_data

all_zeros zeros_ones_detector.vhd,
...

...

tb_zeros_ones_detector.vhd,
Daniel Llamocca zeros_ones_detector.ucf
 ARITHMETIC EXPRESSIONS
 We can use the operators +, -, and * inside
behavioral processes. We can also use the comparison statements
(>, <, =, /=, >=, <=).
 Example: Absolute value of A-B. A,B: treated as unsigned integers.
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;

 Input length: entity my_uabs_diff is


Parameter N. generic (N: INTEGER:= 4);
port ( A,B: in std_logic_vector(N-1 downto 0);
 Signed numbers: R: out std_logic_vector(N-1 downto 0));
As the result end my_uabs_diff;
requires an extra
bit, you must first architecture bhv of my_uabs_diff is
sign-extend the begin
process (A,B)
operands A and B.
begin
if A >= B then
R <= A - B;
else
R <= B - A;
end if;  my_uabs_diff.zip:
end process; my_uabs_diff.vhd,
Daniel Llamocca end bhv; tb_my_uabs_diff.vhd

You might also like

pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy