Professional Documents
Culture Documents
VHDL
VHDL
Text Book:
Reference Books:
Phn mm hc tp
Active-HDL 7.1.sp2
Quartus (for Altera FPGAs)
ISE (for Xilinx FPGAs)
www.opencores.org
Ging vin
Nguyn Thnh Kin
Ging vin B mn K thut My
tnh
Khoa CNTT, HBKHN.
Mobile: +84983588135
Email: kiennt-fit@mail.hut.edu.vn
Yu cu mn hc
Ni dung mn hc
Ni dung mn hc
Phng
php
thit k
truyn
thng
VHDL l g?
u im ca VHDL:
ActiveHDL
Leonardo Spectrum (Mentor Graphics).
Synplify (Synplicity).
ModelSim (Mentor Graphics).
Copyright by N.T.K - 8/2008
Mt v d VHDL n gin
Mt v d VHDL n gin
Ni dung mn hc
Code structure
library IEEE;
use IEEE.std_logic_1164.all;
ENTITY full_adder IS
PORT (a,b,cin: in bit;
s,cout:out bit);
END full_adder;
Architecture dataflow of full_adder is
begin
s <= a xor b xor cin;
cout <= (a and b) or (a and
cin)
or (b and cin);
end dataflow;
Copyright by N.T.K - 8/2008
Cu trc code
Th vin LIBRARY
ENTITY
ARCHITECTURE
Th vin LIBRARY
A LIBRARY l mt
tp cc on m
thng c s
dng. t cc
on m thng
s dng vo th
vin cho php
chng c th
c ti s dng
hoc chia s gia
cc thit k khc
nhau.
Copyright by N.T.K - 8/2008
Th vin LIBRARY
Khai bo th vin:
Th vin LIBRARY
LIBRARY work;
Copyright by N.T.K - 8/2008
Th vin LIBRARY
std_logic_1164
std
work
Th vin LIBRARY
Th vin IEEE:
std_logic_1164
std_logic_arith
std_logic_signed
std_logic_unsigned
Cu trc code
Th vin LIBRARY
ENTITY
ARCHITECTURE
ENTITY
q[7:0]
d[7:0]
clk
co
ENTITY
signal_type:
Port_name:
ENTITY
Ch signal_mode cho bit chiu d liu c
truyn nhn:
Entity
IN
D liu ch i vo ENTITY
OUT
INOUT
V d v ENTITY
ENTITY mux IS
PORT (a, b: IN std_logic_vector(7 downto 0);
sel: IN STD_LOGIC_VECTOR(0 to 1);
c: OUT STD_LOGIC_VECTOR(7 downto 0));
END mux;
Copyright by N.T.K - 8/2008
Cu trc code
Th vin LIBRARY
ENTITY
ARCHITECTURE
ARCHITECTURE
ARCHITECTURE
Phn m code:
ARCHITECTURE
V d v mch NAND:
M t kt ni mch:
Mch thc hin thao
tc NAND trn 2 u
vo (a,b) v gn (<=)
kt qu cho u ra x.
VD1: Full_adder
A(7:0)
C(7:0)
B(7:0)
Adder
library IEEE;
use IEEE.std_logic_1164.all;
ENTITY adder IS
PORT (A,B: IN std_logic_vector(7 downto 0);
C: OUT std_logic_vector(7 downto
0));
END adder;
A(7:0)
B(7:0)
Adder
Bi tp ti lp:
S kt hp gia mch
t hp v mch dy
DEMO
ENTITY example IS
PORT ( a, b, clk: IN BIT;
q: OUT BIT);
END example;
--------------------------------------ARCHITECTURE example OF example IS
SIGNAL temp : BIT;
BEGIN
temp <= a NAND b;
PROCESS (clk)
BEGIN
IF (clk'EVENT AND clk='1') THEN q<=temp;
END IF;
END PROCESS;
END example;
--------------------------------------Copyright by N.T.K - 8/2008
VD4: B dn knh
Multilpexor
VD4: B dn knh
Multilpexor
LIBRARY ieee;
USE ieee.std_logic_1164.all;
ENTITY mux IS
PORT ( a,b : IN STD_LOGIC_VECTOR (7 DOWNTO 0);
sel : IN STD_LOGIC_VECTOR(1 DOWNTO 0);
c : OUT STD_LOGIC_VECTOR (7 DOWNTO 0));
END ENTITY mux;
--------------------------------------ARCHITECTURE example OF mux IS
BEGIN
PROCESS (a, b, sel)
BEGIN
IF (sel = "00") THEN
c <= "00000000";
ELSIF (sel=01) THEN
c <= a;
ELSIF (sel = "10") THEN
c <= b;
ELSE
c <= ZZZZZZZZ;
END IF;
END PROCESS;
END example;
Copyright by N.T.K - 8/2008
Demostration
To workspace lm vic.
To mt mch thit k design.
Vit VHDL source code.
Thm file vo design.
Dch workspace.
a tn hiu vo dng waveform m phng.
Ni dung mn hc
3. Cc kiu d liu.
3.1.1. Signal
3.1.2. Variable
3.1.3. Constant
3.1.1. Signal
Signal
3.1.1. Signal
Phn loi:
3.1.1. Signal
External
Signal
Khai bo
trong Entity
Internal
Signal
Khai bo
trong Architecture
ENTITY myboard IS
ARCHITECTURE structure OF myboard IS
PORT ( [SIGNAL] a,b,c: inout bit;
SIGNAL x,y: bit;
data,extbus,result: inout bit_vector(0 to 7)); SIGNAL intbus: bit_vector(0 to 7);
END myboard;
Copyright BEGIN
by N.T.K - 8/2008
3.1.1. Signal
V tr khai bo signal:
Khai bo signal:
SIGNAL name: mode type
[:=initial_value]
Ch cn trong ENTITY
Copyright by N.T.K - 8/2008
3.1.1. Signal
3.1.1. Signal
3.1.1. Signal
V d v phm vi tc ng ca
signal
C
A
D
3.1.1. Signal
Mt c im quan trng ca
signal khi c s dng bn trong
mt phn ca m tun t (vd
PROCESS, FUNCTION, PROCEDURE)
l:
V nh tm hiu, hm sau hi
Copyright by N.T.K - 8/2008
Khai bo bin:
V d
v s
dng
variabl
e
trong
VHDL
LIBRARY ieee;
USE ieee.std_logic_1164.all;
--------------------------------------ENTITY count_ones IS
PORT ( din: IN STD_LOGIC_VECTOR (7 DOWNTO 0);
ones: OUT INTEGER RANGE 0 TO 8);
END count_ones;
--------------------------------------ARCHITECTURE ok OF count_ones IS
BEGIN
PROCESS (din)
VARIABLE temp: INTEGER RANGE 0 TO 8;
BEGIN
temp := 0;
FOR i IN 0 TO 7 LOOP
IF (din(i)='1') THEN
temp := temp + 1;
END IF;
END LOOP;
ones <= temp;
END PROCESS;
END Copyright
ok;
by N.T.K - 8/2008
LIBRARY ieee;
LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE ieee.std_logic_1164.all;
--------------------------------------------------------------------------------ENTITY mux IS
ENTITY mux IS
PORT ( a, b, c, d, s0, s1: IN STD_LOGIC; PORT ( a, b, c, d, s0, s1: IN STD_LOGIC;
y: OUT STD_LOGIC);
7y: OUT STD_LOGIC);
END mux;
END mux;
--------------------------------------------------------------------------------ARCHITECTURE not_ok OF mux IS
ARCHITECTURE ok OF mux IS
SIGNAL sel : INTEGER RANGE 0 TO 3; BEGIN
BEGIN
PROCESS (a, b, c, d, s0, s1)
PROCESS (a, b, c, d, s0, s1)
VARIABLE sel : INTEGER RANGE 0 TO
BEGIN
BEGIN
sel <= 0;
sel := 0;
IF (s0='1') THEN sel <= sel + 1;END IF; IF (s0='1') THEN sel := sel + 1; END IF;
IF (s1='1') THEN sel <= sel + 2;END IF; IF (s1='1') THEN sel := sel + 2; END IF;
CASE sel IS
CASE sel IS
WHEN 0 => y<=a;
WHEN 0 => y<=a;
WHEN 1 => y<=b;
WHEN 1 => y<=b;
WHEN 2 => y<=c;
WHEN 2 => y<=c;
WHEN 3 => y<=d;
WHEN 3 => y<=d;
END CASE;
END CASE;
END PROCESS;
END PROCESS;
END not_ok;
ok;
Copyright END
by N.T.K
- 8/2008
Hng s Constant l cc tn c gn
cho cc gi tr c th ca 1 kiu DL. S
dng hng s cho php ngi thit k
xy dng m hnh d hiu (betterdocumented) v d thay i.
Khai bo hng s:
V d v khai bo hng s:
Integer types
Real types
Enumerated types
Physical types
-2,147,483,647
=> +2,147,483,647
BEGIN
PROCESS(X)
VARIABLE a : INTEGER;
VARIABLE b : int_type;
BEGIN
a := 1; --Ok 1
a := -1; --Ok 2
a := 1.0; --error 3
END PROCESS;
END test;
-1.0E+38
=> +1.0E+38.
Cc kiu
d liu
lit k
nh ngha
trc
ENTITY traffic_light IS
PORT(sensor : IN std_logic;
clock : IN std_logic;
red_light : OUT std_logic;
IF (sensor = 1) THEN
green_light : OUT std_logic;
next_state <= green;
yellow_light : OUT std_logic);
ELSE
END traffic_light;
next_state <= red;
------------------------------------------------------------ END IF;
ARCHITECTURE simple OF traffic_light IS WHEN yellow =>
TYPE t_state is (red, green, yellow);
red_light <= 0;
Signal present_state, next_state : t_state; green_light <= 0;
BEGIN
yellow_light <= 1;
PROCESS(present_state, sensor)
next_state <= red;
BEGIN
END CASE;
CASE present_state IS
END PROCESS;
WHEN green =>
PROCESS
next_state <= yellow;
BEGIN
red_light <= 0;
WAIT UNTIL clockEVENT and clock=1;
green_light <= 1;
present_state <= next_state;
yellow_light <= 0;
END PROCESS;
WHEN red =>
END simple;
red_light <= 1;
green_light <= 0;
yellow_light <= 0;
Copyright by N.T.K - 8/2008
Primary unit
Secondary units
PACKAGE example IS
TYPE current IS RANGE 0 TO 1000000000
UNITS
na;
--nano amps
ua = 1000 na;
--micro amps
ma = 1000 ua;
--milli amps
a = 1000 ma;
--amps
END UNITS;
TYPE load_factor IS (small, med, big );
END example;
---------------------------------------------------------------USE WORK.example.ALL;
ENTITY delay_calc IS
PORT ( out_current : OUT current;
load : IN load_factor;
delay : OUT time);
END delay_calc;
ARCHITECTURE delay_calc OF delay_calc IS
BEGIN
delay <= 10 ns WHEN (load = small) ELSE
delay <= 20 ns WHEN (load = med) ELSE
delay <= 30 ns WHEN (load = big) ELSE
delay <= 10 ns;
out_current <= 100 ua WHEN (load = small)ELSE
out_current <= 1 ma WHEN (load = med) ELSE
out_current <= 10 ma WHEN (load = big) ELSE
out_current <= 100 ua;
Copyright by N.T.K - 8/2008
END delay_calc;
1D
1Dx1D
2D
Khai bo mng:
SIGNAL/VARIABLE/CONSTANT
signal_name: type_name [:=
TYPE data_bus IS ARRAY(0 TO 31) OF BIT;
initial_value];
VARIABLE X: data_bus;
VARIABLE Y: BIT;
Y := X(0);
--line 1
Y := X(15);
--line 2
Copyright by N.T.K - 8/2008
V d v mng 1Dx1D
V d v mng 2D
V d v mng 1D
PACKAGE array_example IS
TYPE data_bus IS ARRAY(0 TO 31) OF BIT;
TYPE small_bus IS ARRAY(0 TO 7) OF BIT;
END array_example;
------------------------------------------------------------------USE WORK.array_example.ALL;
ENTITY extract IS
PORT ( data : IN data_bus;
start : IN INTEGER;
data_out : OUT small_bus);
END extract;
ARCHITECTURE test OF extract IS
BEGIN
PROCESS(data, start)
BEGIN
FOR i IN 0 TO 7 LOOP
data_out(i) <= data(i + start);
END LOOP;
END PROCESS;
END test; Copyright by N.T.K - 8/2008
V d v mng 1Dx1D
V d v khai bo subtype
PACKAGE mypack IS
SUBTYPE eightbit IS BIT_VECTOR(0 TO 7);
SUBTYPE fourbit IS BIT_VECTOR(0 TO 3);
FUNCTION shift_right(val : BIT_VECTOR)
RETURN BIT_VECTOR;
END mypack;
------------------------------------------------------------------------------PACKAGE BODY mypack IS
FUNCTION shift_right(val : BIT_VECTOR) RETURN
BIT_VECTOR
IS VARIABLE result : BIT_VECTOR(0 TO (valLENGTH -1));
BEGIN
result := val;
IF (valLENGTH > 1) THEN
FOR i IN 0 TO (valLENGTH -2) LOOP
result(i) := result(i 1);
END LOOP;
result(valLENGTH -1) := 0;
ELSE
result(0) := 0;
END IF;
RETURN result;
END shift_right;
Copyright by N.T.K - 8/2008
END mypack;
V d v kiu bn ghi:
TYPE optype IS ( add, sub, mpy, div, jmp );
TYPE instruction IS
RECORD
opcode : optype;
src : INTEGER;
dst : INTEGER;
END RECORD;
PROCESS(X)
VARIABLE inst : instruction;
VARIABLE source, dest : INTEGER;
VARIABLE operator : optype;
BEGIN
source := inst.src;
--Ok line 1
dest := inst.src;
--Ok line 2
source := inst.opcode; --error line 3
operator := inst.opcode; --Ok line 4
inst.src := dest;
--Ok line 5
inst.dst := dest;
--Ok line 6
inst := (add, dest, 2); --Ok line 7
inst := (source);
--error line 8
END PROCESS;
PROCESS(X)
VARIABLE packet : data_packet;
BEGIN
packet.addr.key := 5;
--Ok
packet.addr := (10, 20); --Ok
packet.data(0) := (0, 0, 0, 0);
packet.data(10)(4) := 1; --error
packet.data(10)(0) := 1; --Ok
END PROCESS;
V
d
v
tru
y
cp
file
LIBRARY IEEE;
USE IEEE.std_logic_1164.ALL;
ENTITY rom IS
PORT(addr : IN INTEGER;
cs : IN std_logic;
data : OUT INTEGER);
END rom;
ARCHITECTURE rom OF rom IS
BEGIN
PROCESS(addr, cs)
VARIABLE rom_init : BOOLEAN := FALSE;
--line 1
TYPE rom_data_file_t IS FILE OF INTEGER; --line 2
FILE rom_data_file : rom_data_file_t IS IN /dlp/test1.dat; --line 3
TYPE dtype IS ARRAY(0 TO 63) OF INTEGER;
VARIABLE rom_data : dtype; --line 4
VARIABLE i : INTEGER := 0; --line 5
BEGIN
IF (rom_init = false) THEN --line 6
WHILE NOT ENDFILE(rom_data_file) --line 7
AND (i < 64) LOOP
READ(rom_data_file, rom_data(i)); --line 8
i := i + 1;
--line 9
END LOOP;
rom_init := true;
--line 10
END IF;
IF (cs = 1) THEN
--line 11
data <= rom_data(addr); --line 12
ELSE
data <= -1;
--line 13
END IF;
END PROCESS;
Copyright by N.T.K - 8/2008
Cc kiu DL c th tng
hp
ti mn hc Thit k nh
MT
Nhm: 6 ngi/nhm
ti mn hc Thit k nh
MT
ti c 2 phn:
ti phn 2 (C)
8051
PIC 16F84 VHDL & Verilog
AVR ATTiny64.
AVR AT90S1200.
AVR ATMega.
miniMIPS.
SuperH-2 (Aquarius).
MIPS I (YACC-Yet Another CPU) Verilog.
Yellow Star (MIPS R3000) Verilog.
OpenRISC 1000 (32/64bit RISC).
Copyright by N.T.K - 8/2008
ti phn 2 (others)
PCI Bridge.
Ethernet MAC 10/100 Mbps
VGA/LCD Controller.
PS2 Interfaces (y/c hardware).
UART Controller.
FPU (Floating Point Unit).
M ha AES.
M ha DES.
Copyright by N.T.K - 8/2008
Ch :
Nn lm cng mn n FPGA.
Yu cu:
Bo co:
MicroProcessor Design.
VHDL Programming by Examples (4th).
Websites:
www.opencores.org
www.asics.ws
Lch bo v: 17/11