Documente Academic
Documente Profesional
Documente Cultură
Lab Baleiaj
Lab Baleiaj
Lucrarea de fa i propune :
realizarea unui program n Schematic, sub mediul de lucru Xilinx ISE, care s implementeze
un sistem de afiare cu multiplexare n timp pe un dispozitiv de 4 cifre alctuite din 7 segmente
(leduri).
realizarea unui program n limbaj VHDL, sub mediul de lucru Xilinx ISE, care s
implementeze un sistem de afiare cu multiplexare n timp pe un dispozitiv de 4 cifre alctuite din 7
segmente (leduri).
Referine:
Robert K. Dueck Digital Design with CPLD Applications and VHDL
Capitolul 2: Logic Functions & Gates
Capitolul 5: Combinational Logic Functions
Capitolul 9: Counters and Shift Registers
Programe necesare:
Cuprins:
Implementarea n Schematic................................................................................ 2
Implementare FPGA a programului n Schematic..............................................24
Implementarea n VHDL....................................................................................... 30
Implementare FPGA a programului n VHDL......................................................44
Implementarea n Schematic
Pentru realizarea acestuia deschidem aplicaia Xilinx ISE 10.1 i se creaz
un nou proiect: din meniul File se selecteaz New Project.
Se creaz o nou surs de tip Schematic: click dreapt n toolbarul Sources i se selecteaz
New Source
Opiunea Add Wire din bara de instrumente sau folosind scurttura Crtl + W va ajuta la
conectarea bistabililor i porilor:
Avnd selectat opiunea Add Wire se d click pe o intrare / ieire a unui simbol i se
deplaseaz cursorul pn la o intrare / ieire a simbolului cu care se dorete a fi conectat i apoi se
execut click- astfel conectarea este realizat.
Dup ce sunt aranjate firele se pot aduga markerele de intrare/ieire I/O Marker. n toolbar
Schematic Editor se selecteaz butonulI/O Marker i se plaseaz markerele la capetele firelor.
Acestea se seteaz automat ca fiind markere de intrare, respectiv de ieire.
Dup adugare se poate schimba numele dnd dublu click pe fiecare marker i schimbndu-i
numele n csua Name.
Salvm schema fcut. n continuare vom crea simbol pentru schem astfel: Tools -> Symbol
Wizard ->Using Schematic.
Putem schimba ordinea ieirilor i a intrrilor pentru facilitarea utilizrii (n coloana Order).
Se apas Next i va aprea fereastra Symbol Wizard - Option Page; se apas din nou Next i
va aprea fereastra Symbol Wizard Preview Page.
Realizm legturile ca n figura urmtoare. n continuare vom crea un BUS. Busul este o
modalitate de a reprezenta mai multe fire printr-unul singur. Exemplificm pentru intrrile data.
Denumim fiecare fir de intrare ca n figur. Crem un fir i i dm denumirea D(0:3), apoi adugm un
input.
Vom crea un simbol i pentru aceast schem care va arta n fel urmtor:
Construim o schem asemntoare cu cea din figur, n care, pe lng multiplexoare, avem i
un bloc Constant.
Digit3
S1 S0
vom copia cele 8 fiiere Schematic i cele 7 simboluri n folderul nostru, n cazul nostru numit
Baleiaj;
pentru a aduga fiierele dm click dreapta n panoul Sources alegem Add Source:
Vom face un simbol i pentru decodificatorul BCD 7 segmente care va arta astfel:
Cum ne-am obinuit i pentru aceast schem vom face un simbol care va arta astfel:
cnt1 := cnt1 + 1;
cnt2 := cnt2 + 1;
IF (cnt1 = 25000) THEN
clockout1 <= '1'; -- acest clock va avea o frecven de 1KHz
ELSIF (cnt1 = 50000) THEN
clockout1 <= '0';
cnt1 := 0;
END IF;
IF (cnt2 = 25000000) THEN
clockout2 <= '1'; ; -- acest clock va avea o frecven de 1Hz
ELSIF (cnt2 = 50000000) THEN
clockout2 <= '0';
cnt2 := 0;
END IF;
END IF;
END PROCESS;
END divizor_arch;
BlackBox
CB4CE (numrtor pe 4 bii (modulo 16) din Symbols->Categories->Counter)
divizor_ent
Constant
Acum, se conectez plcua FGPA la PC utiliznd cablul JTAG furnizat dup cum se arat n
figura de mai jos.
Cu placa FPGA alimentat se poate ncepe verificarea programului urmnd pai de mai jos:
Dup realizarea cu succes a testelor, cnd apare meniul selectai fiierul,se va alege
documentul generat mai devreme (ar trebui s existe doar unul dintre aceste fiiere n directorul
proiectului). Se selecteaz acel fiier i se apas Open. Pentru al doilea dispozitiv (Flash-ROM-ul de
pe plcu), se poate selecta Bypass, pentru c nu se folosete .
Odat cu atribuirea fiierelor programului, se face click dreapta pe dispozitivul din stnga i se
selecteaz Program; acest lucru va dura cteva secunde, dup care ar trebui s apar mesajul:
"Program Succeeded".
n cazul n care mesajul afiat este Program failed vom verifica dac avem bifat opiunea
Use HIGHZ instead of BYPASS. Parcurgem urmtorii pai:
n fereastra aprut bifm Use HIGHZ instead of BYPASS i apsm butonul OK.
Implementarea n VHDL
Pasul 1- Crearea registrului de deplasare pe 4 bii cu
ncrcare paralel
Se va crea o nou surs de tip VHDL Module; n fereastra Sources dm click-dreapta i
selectm New Source:
Se introduce numele fiierului (registru), iar ca tip de surs se selecteaz VHDL Module:
N <= P;
P <= R;
R <= DATAIN;
END IF;
END PROCESS;
END RDS16_arch;
M WHEN "00",
N WHEN "01",
P WHEN "10",
R WHEN "11",
"0000" WHEN OTHERS;
END mux16to4_arch;
END digsel_ent;
ARCHITECTURE digsel_arch OF digsel_ent IS
BEGIN
WITH sel SELECT
digitsel <= "0111" WHEN "00",
"1011" WHEN "01",
"1101" WHEN "10",
"1110" WHEN "11",
"1111" WHEN OTHERS;
END digsel_arch;
END bcd4to7_ent;
ARCHITECTURE bcd4to7_arch OF bcd4to7_ent IS
BEGIN
WITH input SELECT
output <=
"0000001" WHEN "0000", -- 0
"1001111" WHEN "0001", -- 1
"0010010" WHEN "0010", -- 2
"0000110" WHEN "0011", -- 3
"1001100" WHEN "0100", -- 4
"0100100" WHEN "0101", -- 5
"0100000" WHEN "0110", -- 6
"0001111" WHEN "0111", -- 7
"0000000" WHEN "1000", -- 8
"0000100" WHEN "1001", -- 9
"0001000" WHEN "1010", -- A
"1100000" WHEN "1011", -- b
"0110001" WHEN "1100", -- C
"1000010" WHEN "1101", -- d
"0110000" WHEN "1110", -- E
"0111000" WHEN "1111",
"1111111" WHEN OTHERS;
END bcd4to7_arch;
Codul este:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
---- Uncomment the following library declaration if instantiating
---- any Xilinx primitives n this code.
--library UNISIM;
--use UNISIM.VComponents.all;
ENTITY blackbox_ent IS
PORT( CLOCK : n STD_LOGIC;
RESET : n STD_LOGIC;
LOAD : n STD_LOGIC;
DATA : n STD_LOGIC_VECTOR(0 to 3);
segmente : OUT STD_LOGIC_VECTOR(0 to 6);
digits : OUT STD_LOGIC_VECTOR(0 to 3));
END blackbox_ent;
ARCHITECTURE blackbox_arch OF blackbox_ent IS
COMPONENT bcd4to7_ent
PORT( input : n STD_LOGIC_VECTOR(0 to 3);
output : OUT STD_LOGIC_VECTOR(0 to 6));
END COMPONENT;
COMPONENT digsel_ent
PORT( sel : n STD_LOGIC_VECTOR(0 to 1);
digitsel: OUT STD_LOGIC_VECTOR(0 to 3));
END COMPONENT;
COMPONENT mux16to4_ent
PORT( sel : n STD_LOGIC_VECTOR(0 to 1);
M, N, P, R : n STD_LOGIC_VECTOR(0 to 3);
DATA : OUT STD_LOGIC_VECTOR(0 to 3));
END COMPONENT;
COMPONENT num2biti_ent
PORT( CLK : n STD_LOGIC;
output : OUT STD_LOGIC_VECTOR(0 to 1));
END COMPONENT;
COMPONENT RDS16_ent
PORT( LOAD : n STD_LOGIC; -- e un fel de CLK
RESET: n STD_LOGIC;
DATAIN : n STD_LOGIC_VECTOR(0 to 3);
M, N, P, R: BUFFER STD_LOGIC_VECTOR(0 to 3));
END COMPONENT;
SIGNAL M, N, P, R : STD_LOGIC_VECTOR(0 to 3);
SIGNAL sel : STD_LOGIC_VECTOR(0 to 1);
SIGNAL BCDDATA: STD_LOGIC_VECTOR(0 to 3);
BEGIN
registru: RDS16_ent PORT MAP(LOAD, RESET, DATA, M, N, P, R);
mux: mux16to4_ent PORT MAP(sel, M, N, P, R, BCDDATA);
numarator: num2biti_ent PORT MAP(CLOCK, sel);
selector: digsel_ent PORT MAP(sel, digits);
bcd: bcd4to7_ent PORT MAP(BCDDATA, segmente);
END blackbox_arch;
PROCESS (clockin)
VARIABLE cnt1 : INTEGER := 0;
VARIABLE cnt2 : INTEGER := 0;
BEGIN
IF (clockin'EVENT and clockin='1') THEN
cnt1 := cnt1 + 1;
cnt2 := cnt2 + 1;
IF (cnt1 = 25000) THEN
clockout1 <= '1';
ELSIF (cnt1 = 50000) THEN
clockout1 <= '0';
cnt1 := 0;
END IF;
IF (cnt2 = 25000000) THEN
clockout2 <= '1';
ELSIF (cnt2 = 50000000) THEN
clockout2 <= '0';
cnt2 := 0;
END IF;
END IF;
END PROCESS;
END divizor_arch;
RESET : n STD_LOGIC;
LOAD : n STD_LOGIC;
DATA : n STD_LOGIC_VECTOR(0 to 3);
segmente : OUT STD_LOGIC_VECTOR(0 to 6);
digits : OUT STD_LOGIC_VECTOR(0 to 3));
END COMPONENT;
COMPONENT divizor_ent
PORT( clockin : n STD_LOGIC;
clockout1 : OUT STD_LOGIC; -- pentru baleiaj
clockout2 : OUT STD_LOGIC); -- pentru numarator
END COMPONENT;
COMPONENT num4biti_ent
PORT( CLK : n STD_LOGIC;
RESET : n STD_LOGIC;
output : OUT STD_LOGIC_VECTOR(0 to 3));
END COMPONENT;
SIGNAL CLOCKHF, CLOCKLF : STD_LOGIC;
SIGNAL DATA : STD_LOGIC_VECTOR(0 to 3); -- DATA de la numarator 4 biti
BEGIN
divizor: divizor_ent PORT MAP(CLOCK, CLOCKHF, CLOCKLF);
blackbox: blackbox_ent PORT MAP(CLOCKHF, RESET, CLOCKLF, DATA, segmente, digits);
numarator: num4biti_ent PORT MAP(CLOCKLF, RESET, DATA);
END baleiaj_arch;
Acum, se conectez plcua FGPA la PC utiliznd cablul JTAG furnizat dup cum se arat n
figura de mai jos.
Cu placa FPGA alimentat se poate ncepe verificarea programului urmnd pai de mai jos:
Se pornete programul iMPACT prin dublu-clic pe Configure Target Device din fereastra
Processes (n cazul n care apare un avertisment spunnd c nu exist nici un fiier de proiect
iMPACT, se va face clic pe OK) .
n cazul n care csua de dialog Configure Devices apare, se selecteaz Configure devices
using Boundary-Scan (JTAG) i Automatically connect to cable and identify Boundary-Scan
chain i se apas Finish.
Dup realizarea cu succes a testelor, cnd apare meniul selectai fiierul,se va alege
documentul generat mai devreme (ar trebui s existe doar unul dintre aceste fiiere n directorul
proiectului). Se selecteaz acel fiier i se apas Open. Pentru al doilea dispozitiv (Flash-ROM-ul de
pe plcu), se poate selecta Bypass, pentru c nu se folosete .
Odat cu atribuirea fiierelor programului, se face click dreapta pe dispozitivul din stnga i se
selecteaz Program; acest lucru va dura cteva secunde, dup care ar trebui s apar mesajul:
"Program Succeeded".
n cazul n care mesajul afiat este Program failed vom verifica dac avem bifat opiunea
Use HIGHZ instead of BYPASS. Parcurgem urmtorii pai:
n fereastra aprut bifm Use HIGHZ instead of BYPASS i apsm butonul OK.