Logo Studenta

Escuela Politécnica Superior de la Universidad de _ Grado en Ingeniería Electrónica de Comunicaciones _ Dise_o Electrónico _VHDL_ _ DISENOECO_

Esta es una vista previa del archivo. Inicie sesión para ver el archivo original

DISENOECO/.DS_Store
__MACOSX/DISENOECO/._.DS_Store
DISENOECO/archivos_practica.rar
 
top_system1.vhd
library ieee;
use ieee.std_logic_1164.all;
entity top_system1 is
 port(
 CLK : in std_logic;
 RST : in std_logic;
 ASTRB : in std_logic;
 DSTRB : in std_logic;
 DATA : inout std_logic_vector(7 downto 0);
 PWRITE : in std_logic;
 PWAIT : out std_logic;
 SWITCHES_I : in std_logic_vector(7 downto 0);
 PSH_BUTTON : in std_logic;
 LEDS_O : out std_logic_vector (7 downto 0));
end top_system1;
architecture rtl of top_system1 is
signal DIR, DIR_REG,DATO,DATO_REG,DATO_RD : std_logic_vector (7 downto 0);
signal DIR_VLD, DATO_VLD,CE_RD : std_logic;
begin -- rtl
 
 DUT:entity work.cnt_epp
 port map (
 CLK => CLK,
 RST => RST,
 ASTRB => ASTRB,
 DSTRB => DSTRB,
 DATA => DATA,
 PWRITE => PWRITE,
 PWAIT => PWAIT,
 DATO_RD => DATO_RD,
 CE_RD => CE_RD,
 DIR => DIR,
 DIR_VLD => DIR_VLD,
 DATO => DATO,
 DATO_VLD => DATO_VLD);
 
end rtl;
V01.dat
V02.dat
gen_funciones.ucf
NET "RELOJ" LOC = "L15"; 
# onBoard USB controller
 NET "ASTRB" LOC = "B9"; 
 NET "DSTRB" LOC = "A9"; 
 NET "PWRITE" LOC = "C15"; 
 NET "PWAIT" LOC = "F13"; 
 NET "DATA<0>" LOC = "A2"; 
 NET "DATA<1>" LOC = "D6"; 
 NET "DATA<2>" LOC = "C6"; 
 NET "DATA<3>" LOC = "B3"; 
 NET "DATA<4>" LOC = "A3"; 
 NET "DATA<5>" LOC = "B4"; 
 NET "DATA<6>" LOC = "A4"; 
 NET "DATA<7>" LOC = "C5"; 
# onBoard Pushbuttons
 NET "RST" LOC = "N4";
# DAC
NET "SYNC" LOC = "T3" ;
NET "D1" LOC = "R3" ;
NET "D2" LOC = "P6" ;
NET "SCLK" LOC = "N5" ;
top_system1.ucf
NET "CLK" LOC = "L15"; 
# onBoard USB controller
 NET "ASTRB" LOC = "B9"; 
 NET "DSTRB" LOC = "A9"; 
 NET "PWRITE" LOC = "C15"; 
 NET "PWAIT" LOC = "F13"; 
 NET "DATA<0>" LOC = "A2"; 
 NET "DATA<1>" LOC = "D6"; 
 NET "DATA<2>" LOC = "C6"; 
 NET "DATA<3>" LOC = "B3"; 
 NET "DATA<4>" LOC = "A3"; 
 NET "DATA<5>" LOC = "B4"; 
 NET "DATA<6>" LOC = "A4"; 
 NET "DATA<7>" LOC = "C5"; 
# onBoard Pushbuttons
 NET "PSH_BUTTON" LOC = "F5"; 
 NET "RST" LOC = "N4";
# onBoard LEDS
 NET "LEDS_O<0>" LOC = "U18";
 NET "LEDS_O<1>" LOC = "M14";
 NET "LEDS_O<2>" LOC = "N14";
 NET "LEDS_O<3>" LOC = "L14";
 NET "LEDS_O<4>" LOC = "M13"; 
 NET "LEDS_O<5>" LOC = "D4"; 
 NET "LEDS_O<6>" LOC = "P16";
 NET "LEDS_O<7>" LOC = "N12";
# onBoard SWITCHES
 NET "SWITCHES_I<0>" LOC = "A10";
 NET "SWITCHES_I<1>" LOC = "D14";
 NET "SWITCHES_I<2>" LOC = "C14";
 NET "SWITCHES_I<3>" LOC = "P15";
 NET "SWITCHES_I<4>" LOC = "P12"; 
 NET "SWITCHES_I<5>" LOC = "R5"; 
 NET "SWITCHES_I<6>" LOC = "T5"; 
 NET "SWITCHES_I<7>" LOC = "E4";
cnt_dac.vhd
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity cnt_dac is
 port (
 CLK : in std_logic;
 RST : in std_logic;
 DATO1 : in std_logic_vector(11 downto 0);
 DATO2 : in std_logic_vector(11 downto 0);
 DATO_OK : in std_logic;
 SYNC : out std_logic;
 SCLK : out std_logic;
 D1 : out std_logic;
 D2 : out std_logic);
end cnt_dac;
architecture RTL of cnt_dac is
 
begin -- RTL
 
 
end RTL;
cnt_dpram.vhd
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity cnt_dpram is
 port (
 CLK : in std_logic;
 RST : in std_logic;
 DIR : in std_logic_vector (7 downto 0);
 DIR_VLD : in std_logic;
 DATO : in std_logic_vector (7 downto 0);
 DATO_VLD : in std_logic;
 ADDRESS : out std_logic_vector(7 downto 0);
 DATA : out std_logic_vector(11 downto 0);
 WE_DP1 : out std_logic;
 WE_DP2 : out std_logic);
end cnt_dpram;
architecture RTL of cnt_dpram is
 constant dir_dpram1 : std_logic_vector( 7 downto 0) := x"A1";
 constant dir_dpram2 : std_logic_vector( 7 downto 0) := x"A2";
 
begin -- RTL
end RTL;
cnt_epp.vhd
library IEEE;
use IEEE.STD_LOGIC_1164.all;
entity cnt_epp is
 port (
 CLK : in std_logic;
 RST : in std_logic;
 ASTRB : in std_logic;
 DSTRB : in std_logic;
 DATA : inout std_logic_vector(7 downto 0);
 PWRITE : in std_logic;
 PWAIT : out std_logic;
 DATO_RD : in std_logic_vector(7 downto 0);
 CE_RD : out std_logic;
 DIR : out std_logic_vector (7 downto 0);
 DIR_VLD : out std_logic;
 DATO : out std_logic_vector (7 downto 0);
 DATO_VLD : out std_logic);
end ;
architecture rtl of cnt_epp is
 
begin
end rtl;
DAC121S101.vhd
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity DAC121S101 is
 port (
 VOUT : out real range 0.0 to 3.5;
 SYNC : in std_logic;
 SCLK : in std_logic;
 DIN : in std_logic);
end DAC121S101;
architecture rtl of DAC121S101 is
 signal dato_bin, reg_desp : std_logic_vector(15 downto 0) := (others => '0');
 signal cuenta : natural;
 constant tSCLK : time := 33 ns;
 constant tL, tH : time := 13 ns;
 constant tcs : time := 3 ns;
 constant tsud : time := 5 ns;
 constant tdhd : time := 4.5 ns;
 constant tSYNC : time := 20 ns;
 signal taux1, taux2 : time;
begin
-------------------------------------------------------------------------------
 -- verificación de tiempos
 
 assert not(taux1 -taux2 <= tSCLK)
 report "VIOLACIÓN DEL TIEMPO PERIODO DE SCLK(tCS)"
 severity error;
 
 process (SCLK)
 variable aux1, aux2 : time;
 begin
 if SCLK'event and SCLK = '0' then
 taux1 <= now;
 taux2 <= taux1;
 
 if SCLK = '1' then
 aux2 := aux1;
 aux1 := now;
 assert not(aux1-aux2 <= tL)
 report "VIOLACIÓN DEL TIEMPO A NIVEL BAJO DE SCLK (tL)"
 severity error;
 else
 aux2 := aux1;
 aux1 := now;
 assert not(aux1-aux2 <= tH)
 report "VIOLACIÓN DEL TIEMPO A NIVEL ALTO DE SCLK (tH)"
 severity error;
 end if;
 end if;
 end process;
 process (SYNC)
 variable aux6, aux7 : time;
 begin
 aux7 := aux6;
 aux6 := now;
 if SYNC'event and SYNC = '0' then
 assert not(aux6-aux7 <= tSYNC)
 report "VIOLACIÓN DE LA DURACIÓN DEL TIEMPO DEL NIVEL ALTO DE SYNC (tSYNC)"
 severity error; 
 end if;
 if SYNC'event and SYNC = '1' then
 if SCLK='0' then
 assert not(SCLK'last_event <= tcs)
 report "VIOLACIÓN DEL TIEMPO tCS"
 severity error;
 end if; 
 end if;
 
 end process;
 -----------------------------------------------------------------------------
 -- Modelado de funcionamiento.
 process (SCLK, SYNC)
 begin
 if SYNC = '1' then
 cuenta <= 0;
 reg_desp <= (others => '0');
 elsif SCLK'event and SCLK = '0' then
 if cuenta < 16 then
 cuenta <= cuenta+1;
 reg_desp <= reg_desp(14 downto 0)&DIN;
 end if;
 end if;
 end process;
 process (cuenta, SYNC, reg_desp)
 begin
 if SYNC = '0' then
 if cuenta = 16 then
 dato_bin <= reg_desp;
 end if;
 end if;
 end process;
 process (dato_bin, cuenta)
 begin -- process
 if cuenta = 16 then
 case dato_bin(15 downto 14) is
 when "00" =>
 VOUT <= real(to_integer(unsigned(dato_bin(11 downto 0))))*3.3/4096.0;
 when "11" =>
 VOUT <= 3.4;
 when others =>
 VOUT <= 0.0;
 end case;
 end if;
 end process;
end rtl;
dpram_mem.vhd
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity dpram_mem is
 port (
 DIN :
in std_logic_vector(11 downto 0);
 ADDR_IN : in std_logic_vector(7 downto 0);
 WE : in std_logic;
 CLK : in std_logic;
 RST : in std_logic;
 ADDR_OUT : in std_logic_vector(7 downto 0);
 DOUT : out std_logic_vector(11 downto 0));
end entity;
architecture rtl of dpram_mem is
 
 
begin
 
 
end rtl;
epp_device.vhd
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
use std.textio.all;
use ieee.std_logic_textio.all;
entity epp_device is
 port (
 DATA : inout std_logic_vector(7 downto 0);
 PWRITE : out std_logic;
 DSTRB : out std_logic;
 ASTRB : out std_logic;
 PWAIT : in std_logic);
end epp_device;
architecture sim of epp_device is
 constant T_clk_epp : time := 100 ns; -- Internal clock period. 
 signal clk_epp : std_logic := '0'; -- Internal clock signal. 
 signal read_value : std_logic_vector(7 downto 0) := (others => '0');
constant dir_frec : std_logic_vector( 7 downto 0) := x"F0";
 constant dir_dpram1 : std_logic_vector( 7 downto 0) := x"A1";
constant dir_dpram2 : std_logic_vector( 7 downto 0) := x"A2";
 constant EPP_cicle_length : natural := 10;
begin
 -- internal clock signal generation.
 clk_epp <= not(clk_epp) after T_clk_epp/2;
 process
 procedure epp_cycle ( address : in std_logic_vector(7 downto 0);
 data_io : inout std_logic_vector(7 downto 0);
 r_w : in character) is
 
 begin
 wait until clk_epp = '1';
 PWRITE <= '0';
 wait until clk_epp = '1';
 ASTRB <= '0';
 data <= address;
 wait for T_clk_epp*EPP_cicle_length;
 ASTRB <= '1';
 wait until clk_epp = '1';
 data <= (others => 'Z');
 PWRITE <= '1';
 wait until clk_epp = '1';
 wait for T_clk_epp*EPP_cicle_length;
-------------------------------------------------------------------------------
 if r_w = 'w' then -- write cicle 
 PWRITE <= '0';
 data <= data_io;
 end if;
-------------------------------------------------------------------------------
 wait until clk_epp = '1';
 DSTRB <= '0';
 wait for T_clk_epp*EPP_cicle_length;
 if r_w = 'r' then
 data_io:= data;
 end if;
 DSTRB <= '1';
 wait until clk_epp = '1';
 data <= (others => 'Z');
 PWRITE <= '1';
 wait until clk_epp = '1';
 end procedure;
 variable dato : std_logic_vector(7 downto 0);
 variable dir : std_logic_vector(7 downto 0);
 begin
 --inicialización 
 data <= (others => 'Z');
 PWRITE <= '1';
 DSTRB <= '1';
 ASTRB <= '1';
 dir := (others => '0');
 wait for 130 ns;
 -- ciclos de lectura/escritura
 
 report "FIN CICLO R/W" severity failure;
 end process;
end sim;
gen_dir.vhd
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity gen_dir is
 port (
 CLK : in std_logic;
 RST : in std_logic;
 DIR : in std_logic_vector (7 downto 0);
 DIR_VLD : in std_logic;
 DATO : in std_logic_vector (7 downto 0);
 DATO_VLD : in std_logic;
 ADDR_OUT : out std_logic_vector(7 downto 0);
 DATO_OK : out std_logic);
end gen_dir;
architecture rtl of gen_dir is
 constant dir_frec : std_logic_vector( 7 downto 0) := x"F0";
 constant T_DAC : integer := 68; --pulsos dura la conversion mínima
 
begin
 end rtl;
gen_funciones.vhd
library ieee;
use ieee.std_logic_1164.all;
entity gen_funciones is
 port (
 RELOJ : in std_logic;
 RST : in std_logic;
 -- PUERTO EPP
 ASTRB : in std_logic;
 DSTRB : in std_logic;
 DATA : inout std_logic_vector(7 downto 0);
 PWRITE : in std_logic;
 PWAIT : out std_logic;
 -- DAC
 SYNC : out std_logic;
 SCLK : out std_logic;
 D1 : out std_logic;
 D2 : out std_logic);
end gen_funciones;
architecture rtl of gen_funciones is
 
 signal CLK : std_logic;
--SEÑALES DEL CONTROLADOR EPP--
 signal DIR : std_logic_vector (7 downto 0);
 signal DIR_VLD : std_logic;
 signal DATO : std_logic_vector (7 downto 0);
 signal DATO_VLD : std_logic;
 signal DATO_RD : std_logic_vector (7 downto 0);
 signal CE_RD : std_logic;
--SEÑALES DEL CONTROLADOR DPRAM--
 signal ADDRESS : std_logic_vector(7 downto 0);
 signal DATA_DP : std_logic_vector (11 downto 0); 
 signal WE_DP1 : std_logic;
 signal WE_DP2 : std_logic;
--SEÑALES DE LAS MEMORIAS DPRAM--
 signal DATO1 : std_logic_vector (11 downto 0);
 signal DATO2 : std_logic_vector (11 downto 0);
--SEÑALES DE GENERADOR DE _DIRECCIONES--
 signal ADDR_OUT : std_logic_vector(7 downto 0);
 signal DATO_OK : std_logic;
begin -- rtl
 
U_dcm :entity work.dcm
 port map
 (CLK_IN => RELOJ, 
 CLK_OUT => CLK,
 RESET => RST); 
 
 
 U_cnt_epp:entity work.cnt_epp
 port map (
 CLK => CLK,
 RST => RST,
 ASTRB => ASTRB,
 DSTRB => DSTRB,
 DATA => DATA,
 PWRITE => PWRITE,
 PWAIT => PWAIT,
 DATO_RD => DATO_RD,
 CE_RD => CE_RD,
 DIR => DIR,
 DIR_VLD => DIR_VLD,
 DATO => DATO,
 DATO_VLD => DATO_VLD);
 
 U_cnt_dpram:entity work.cnt_dpram
 port map (
 CLK => CLK,
 RST => RST,
 DIR => DIR,
 DIR_VLD => DIR_VLD,
 DATO => DATO,
 DATO_VLD => DATO_VLD,
 ADDRESS => ADDRESS,
 DATA => DATA_DP,
 WE_DP1 => WE_DP1,
 WE_DP2 => WE_DP2);
 
 U_dpram_mem1 : entity work.dpram_mem
 port map (
 DIN => DATA_DP,
 ADDR_IN => ADDRESS,
 WE => WE_DP1,
 CLK => CLK,
 RST => RST,
 ADDR_OUT => ADDR_OUT,
 DOUT => DATO1);
 
 U_dpram_mem2 : entity work.dpram_mem
 port map (
 DIN => DATA_DP,
 ADDR_IN => ADDRESS,
 WE => WE_DP2,
 CLK => CLK,
 RST => RST,
 ADDR_OUT => ADDR_OUT,
 DOUT => DATO2);
 U_gen_dir:entity work.gen_dir
 port map (
 CLK => CLK,
 RST => RST,
 DIR => DIR,
 DIR_VLD => DIR_VLD,
 DATO => DATO,
 DATO_VLD => DATO_VLD,
 ADDR_OUT => ADDR_OUT,
 DATO_OK => DATO_OK);
 
 U_cnt_dac :entity work.cnt_dac
 port map (
 CLK => CLK,
 RST => RST,
 DATO1 => DATO1,
 DATO2 => DATO2,
 DATO_OK => DATO_OK,
 SYNC => SYNC,
 SCLK => SCLK,
 D1 => D1,
 D2 => D2);
end rtl;
DAC121S101.pdf
DAC121S101/DAC121S101Q
February 19, 2010
12-Bit Micro Power, RRO Digital-to-Analog Converter
General Description
The DAC121S101 is a full-featured, general purpose 12-bit
voltage-output digital-to-analog converter (DAC) that can op-
erate from a single +2.7V to 5.5V supply and consumes just
177 µA of current at 3.6 Volts. The on-chip output amplifier
allows rail-to-rail output swing and the three wire serial inter-
face operates at clock rates up to 30 MHz over the specified
supply voltage range and is compatible with standard SPI™,
QSPI, MICROWIRE and DSP interfaces. Competitive de-
vices are limited to 20 MHz clock rates at supply voltages in
the 2.7V to 3.6V range.
The supply voltage for the DAC121S101 serves as its voltage
reference, providing the widest possible output dynamic
range. A power-on reset circuit ensures that the DAC output
powers up to zero volts and remains there until there is a valid
write to the device. A power-down feature reduces power
consumption to less than a microWatt.
The low power consumption and small packages of the
DAC121S101 make it an excellent choice for use in battery
operated equipment.
The DAC121S101 is a direct replacement for the AD5320 and
the DAC7512 and is one of a family of pin compatible DACs,
including the 8-bit DAC081S101 and the
10-bit DAC101S101.
The DAC121S101 operates over the extended industrial tem-
perature range of −40°C to +105°C while the DAC121S101Q
operates over the Grade 1 automotive temperature range of
−40°C to +125°C. The DAC121S101 is available in a 6-lead
TSOT and an 8-lead MSOP and the DAC121S101Q is avail-
able in the 6-lead TSOT only.
Features
■ DAC121S101Q is AEC-Q100 Grade 1 qualified and is
manufactured on an Automotive Grade Flow.
■ Guaranteed Monotonicity
■ Low Power Operation
■ Rail-to-Rail Voltage Output
■ Power-on Reset to Zero Volts Output
■ Wide Temperature Range of −40°C to +125°C
■ Wide Power Supply Range of +2.7V to +5.5V
■ Small Packages
■ Power Down Feature
Key Specifications
■ Resolution 12 bits
■ DNL +0.25, -0.15 LSB (typ)
■ Output Settling Time 8 µs (typ)
■ Zero Code Error 4 mV (typ)
■ Full-Scale Error −0.06 %FS (typ)
■ Power Consumption
■ — Normal Mode 0.64mW (3.6V) / 1.43mW (5.5V) typ
— Pwr Down Mode 0.14µW (3.6V) / 0.39µW (5.5V) typ
Applications
■ Battery-Powered Instruments
■ Digital Gain and Offset Adjustment
■ Programmable Voltage & Current Sources
■ Programmable Attenuators
■ Automotive
Pin Configuration
20114901 20114902
SPI™ is a trademark of Motorola, Inc.
© 2010 National Semiconductor Corporation 201149 www.national.com
D
A
C
1
2
1
S
1
0
1
/D
A
C
1
2
1
S
1
0
1
Q
 1
2
-B
it M
ic
ro
 P
o
w
e
r, R
R
O
 D
ig
ita
l-to
-A
n
a
lo
g
 C
o
n
v
e
rte
r
Ordering Information
Order Numbers Temperature Range Package Top Mark Feature
DAC121S101CIMM −40°C ≤ TA ≤ +105°C MSOP
X60C 
DAC121S101CIMMX −40°C ≤ TA ≤ +105°C MSOP T/R
DAC121S101CIMK −40°C ≤ TA ≤ +105°C TSOT
X61C 
DAC121S101CIMKX −40°C ≤ TA ≤ +105°C TSOT T/R
DAC121S101QCMK −40°C ≤ TA ≤ +125°C TSOT
X61Q
AEC-Q100 Grade 1
Qualified; Automotive
Grade Production FlowDAC121S101QCMKX −40°C ≤ TA ≤ +125°C TSOT T/R
DAC121S101EVAL Evaluation Board TSOT 
Block Diagram
20114903
Pin Descriptions
TSOT
(SOT-23)
Pin No.
MSOP
Pin No.
Symbol Description
1 4 VOUT DAC Analog Output Voltage.
2 8 GND Ground reference for all on-chip circuitry.
3 1 VA Power supply and Reference input. Should be decoupled to GND.
4 7 DIN
Serial Data Input. Data is clocked into the 16-bit shift register on the falling edges of SCLK
after the fall of SYNC.
5 6 SCLK Serial Clock Input. Data is clocked into the input shift register on the falling edges of this pin.
6 5 SYNC
Frame synchronization input for the data input. When this pin goes low, it enables the input
shift register and data is transferred on the falling edges of SCLK. The DAC is updated on
the 16th clock cycle unless SYNC is brought high before the 16th clock, in which case the
rising edge of SYNC acts as an interrupt and the write sequence is ignored by the DAC.
 2, 3 NC No Connect. There is no internal connection to these pins.
www.national.com 2
D
A
C
1
2
1
S
1
0
1
/D
A
C
1
2
1
S
1
0
1
Q
A.C. and Timing Characteristics
The following specifications apply for VA = +2.7V to +5.5V, RL = 2kΩ to GND, CL = 200 pF to GND, fSCLK = 30 MHz, input code
range 48 to 4047. Boldface limits apply for TMIN ≤ TA ≤ TMAX: all other limits TA = 25°C, unless otherwise specified.
Symbol Parameter Conductions Typical Limits
Units
(Limits)
fSCLK SCLK Frequency 30 MHz (max)
ts
Output Voltage Settling Time
(Note 10)
400h to C00h code
change, RL = 2kΩ
CL ≤ 200 pF 8 10 µs (max)
CL = 500 pF 12 µs
00Fh to FF0h code
change, RL = 2kΩ
CL ≤ 200 pF 8 µs
CL = 500 pF 12 µs
SR Output Slew Rate 1 V/µs
 Glitch Impulse Code change from 800h to 7FFh 12 nV-sec
 Digital Feedthrough 0.5 nV-sec
tWU Wake-Up Time
VA = 5V 6 µs
VA = 3V 39 µs
1/fSCLK SCLK Cycle Time 33 ns (min)
tH SCLK High time 5 13 ns (min)
tL SCLK Low Time 5 13 ns (min)
tSUCL
Set-up Time SYNC to SCLK Rising
Edge
 −15 0 ns (min)
tSUD Data Set-Up Time 2.5 5 ns (min)
tDHD Data Hold Time 2.5 4.5 ns (min)
tCS SCLK fall to rise of SYNC
VA = 5V 0 3 ns (min)
VA = 3V −2 1 ns (min)
tSYNC SYNC High Time
2.7 ≤ VA ≤ 3.6 9 20 ns (min)
3.6 ≤ VA ≤ 5.5 5 10 ns (min)
5 www.national.com
D
A
C
1
2
1
S
1
0
1
/D
A
C
1
2
1
S
1
0
1
Q
Transfer Characteristic
20114905
FIGURE 1. Input / Output Transfer Characteristic
Timing Diagram
20114906
FIGURE 2. DAC121S101 Timing
7 www.national.com
D
A
C
1
2
1
S
1
0
1
/D
A
C
1
2
1
S
1
0
1
Q
1.0 Functional Description
1.1 DAC SECTION
The DAC121S101 is fabricated on a CMOS process with an
architecture that consists of switches and a resistor string that
are followed by an output buffer. The power supply serves as
the reference voltage. The input coding is straight binary with
an ideal output voltage of:
VOUT = VA x (D / 4096)
where D is the decimal equivalent of the binary code that is
loaded into the DAC register and can take on any value be-
tween 0 and 4095.
1.2 RESISTOR STRING
The resistor string is shown in Figure 3. This string consists
of 4096 equal valued resistors with a switch at each junction
of two resistors, plus a switch to ground. The code loaded into
the DAC register determines which switch is closed, connect-
ing the proper node to the amplifier. This configuration guar-
antees that the DAC is monotonic.
20114907
FIGURE 3. DAC Resistor String
1.3 OUTPUT AMPLIFIER
The output buffer amplifier is a rail-to-rail type, providing an
output voltage range of 0V to VA. All amplifiers, even rail-to-
rail types, exhibit a loss of linearity as the output approaches
the supply rails (0V and VA, in this case). For this reason,
linearity is specified over less than the full output range of the
DAC. The output capabilities of the amplifier are described in
the Electrical Tables.
1.4 SERIAL INTERFACE
The three-wire interface is compatible with SPI, QSPI and
MICROWIRE, as well as most DSPs. See the Timing Diagram
for information on a write sequence.
A write sequence begins by bringing the SYNC line low. Once
SYNC is low, the data on the DIN line is clocked into the 16-
bit serial input register on the falling edges of SCLK. On the
16th falling clock edge, the last data bit is clocked in and the
programmed function (a change in the mode of operation and/
or a change in the DAC register contents) is executed. At this
point the SYNC line may be kept low or brought high. In either
case, it must be brought high for the minimum specified time
before the next write sequence as a falling edge of SYNC can
initiate the next write cycle.
Since the SYNC and DIN buffers draw more current when they
are high, they should be idled low between write sequences
to minimize power consumption.
1.5 INPUT SHIFT REGISTER
The input shift register, Figure 4, has sixteen bits. The first
two bits are "don't cares" and are followed by two bits that
determine the mode of operation (normal mode or one of
three power-down modes). The contents of the serial input
register are transferred to the DAC register on the sixteenth
falling edge of SCLK. See Timing Diagram, Figure 2.
20114908
FIGURE 4. Input Register Contents
Normally, the SYNC line is kept low for at least 16 falling
edges of SCLK and the DAC is updated on the 16th SCLK
falling edge. However, if SYNC is brought high before the 16th
falling edge, the shift register is reset and the write sequence
is invalid. The DAC register is not updated and there is no
change in the mode of operation or in the output voltage.
www.national.com 14
D
A
C
1
2
1
S
1
0
1
/D
A
C
1
2
1
S
1
0
1
Q
		DAC121S101/DAC121S101Q
		General Description
		Features
		Key Specifications
		Applications
		Pin Configuration
		Ordering Information
		Block Diagram
		Pin Descriptions
		Absolute Maximum Ratings
		Operating Ratings (Note 1, Note 2)
		Package Thermal Resistances
		Electrical Characteristics
		A.C. and Timing Characteristics
		Specification Definitions
		Transfer Characteristic
		FIGURE 1. Input / Output Transfer Characteristic
		Timing Diagram
FIGURE 2. DAC121S101 Timing
		Typical Performance Characteristics
		1.0 Functional Description
		1.1 DAC SECTION
		1.2 RESISTOR STRING
		FIGURE 3. DAC Resistor String
		1.3 OUTPUT AMPLIFIER
		1.4 SERIAL INTERFACE
		1.5 INPUT SHIFT REGISTER
		FIGURE 4. Input Register Contents
		1.6 POWER-ON RESET
		1.7 POWER-DOWN MODES
		TABLE 1. Modes of Operation
		2.0 Applications Information
		2.1 DSP/MICROPROCESSOR INTERFACING
		2.1.1 ADSP-2101/ADSP2103 Interfacing
		FIGURE 5. ADSP-2101/2103 Interface
		2.1.2 80C51/80L51 Interface
		FIGURE 6. 80C51/80L51 Interface
		2.1.3 68HC11 Interface
		FIGURE 7. 68HC11 Interface
		2.1.4 Microwire Interface
		FIGURE 8. Microwire Interface
		2.2 USING REFERENCES AS POWER SUPPLIES
		2.2.1 LM4130
		FIGURE 9. The LM4130 as a power supply
		2.2.2 LM4050
		FIGURE 10. The LM4050 as a power supply
		2.2.3 LP3985
		FIGURE 11. Using the LP3985 regulator
		2.2.4 LP2980
		FIGURE 12. Using the LP2980 regulator
		2.3 BIPOLAR OPERATION
		FIGURE 13. Bipolar Operation
		TABLE 2. Some Rail-to-Rail Amplifiers
		2.4 LAYOUT, GROUNDING, AND BYPASSING
		Physical Dimensions
PmodDA1.pdf
DDiiggiilleenntt PPmmooddDDAA11™™ DDiiggiittaall TToo 
AAnnaalloogg MMoodduullee CCoonnvveerrtteerr BBooaarrdd 
RReeffeerreennccee MMaannuuaall 
®
www.digi lent inc.com 
Revision: 04/12/05 
 
215 E Main Suite D | Pullman, WA 99163 
(509) 334 6306 Voice and Fax 
 
Doc: 502-063 page 1 of 1 
 
Copyright Digilent, Inc. All rights reserved. Other product and company names mentioned may be trademarks of their respective owners. 
Overview 
 
The Digilent PmodAD1 Digital to Analog 
Module Converter module (the DA1™) 
converts signals from digital to analog at up to 
one MSa per second. The DA1 uses a 6-pin 
header connector and at less than one square 
inch is small enough to be located where the 
reconstructed signal is needed. 
 
Features include: 
 
• two AD7303 8-bit D/A converter chips 
that convert up to one MSa per second 
• a 6-pin header and 6-pin connector 
• four D/A conversion channels 
• very low power consumption 
• small form factor (0.80” x 0.80”). 
 
Functional Description 
 
The DA1 can produce an analog output 
ranging from 0-3.3 volts. It has four 
simultaneous D/A conversion channels, each 
with an 8-bit converter that can process 
separate digital signals. 
 
The DA1 is equipped with two AD7303 digital 
to analog converters. Each converter has two 
channels through which digital signals can be 
converted to analog signals. 
 
Outputs are produced by sending commands 
via the SPI/MICROWIRE™ serial bus to the 
D/A converters. The two converters are 
connected in parallel so that commands are 
sent to both converters simultaneously. 
 
The DA1 is designed to work with Digilent 
system boards. Some system boards, like the 
Digilent Pegasus board, have a 6-pin header 
that can be connected to the DA1’s 6-pin 
header using a 6-pin cable. 
Other Digilent boards may need a Digilent 
Modular Interface Board (MIB) and a 6-pin 
cable to connect to the DA1. The MIB plugs 
into the system board and the cable connects 
the MIB to the DA1. 
 
The DA1 can be powered by voltage from 
either a Digilent system board or an outside 
device. Damage can result if power is supplied 
from both sources or if the outside device 
supplies more than 3V. For more information, 
see www.digilentinc.com. 
 
For information on the AD7303, see the Analog 
Devices data sheet at www.analog.com. 
 GND
 VCC
DA1 Circuit Diagram
AD7303
D/A
Converter
AD7303
D/A
Converter
D2
D1
2 Sync,
Clock
Analog Outputs
J1
 C
on
ne
ct
or
J2
 C
on
ne
ct
or
__MACOSX/DISENOECO/._archivos_practica.rar
DISENOECO/plib.docx
Pg 4
Cnt_epp-> separa linea de direcciones y línea de datos
Dpram_mem una memoria por cada tensión vo1 y vo2
Gen_dir en función de la frec seleccionada lee más rápido o más lento
Cnt_dac coger un dato de 12bits y aplica protocolo en serie
Dcm controlar la generación de la señal de reloj
*CLK, señal de reloj exclusiva para todos los modulos (para que el diseño sea síncrono)
Pg 5 6 y 7
Cnt epp: transforma protocolo USB en protocolo paralelo
Ciclo de lectura (escritura de la dirección: ASTRB=nivel bajo(acvtivado) y PWRITE=Nivel bajo y lectura del dato: DSTRB=nivel bajo(activado) y PWRITE NIVEL BAJO)
Ciclo escritura (escritura de dirección astrb y pwrite nivel bajo y escritura de dato )
Pg 7
Entidad cnt_epp
CICLO DE LECTURA
PWAIT -> genera estados de espera inv ASTRB e DTRB, no es necesario en esta aplicacion
DIR-> valor de la dirección de un ciclo de acceso
DIR_VLD->indica con un nivel alto y durante un periodo de la señal clk que hay una nueva dirección
Tenemos que detectar mediante un sistema secuencial el flanco de la señal ASTRB para sacar la señal DIR_VLD (dibujo santy) [Qo en reposo, Q1 dir_vld =1] DEBEMOS MODELAR LA MÁQUINA DE ESTADOS (mejor moore que mealy porque si no la salida S tiene un tiempo indefinido (moore es una maquina de mealy con biestables)), se puede solucionar con el proceso secuencial del biestable y la AND (asignación concurrente) (MEJOR SOLUCIÓN)
*CON UN PROCESO SECUENCIAL DONDE SE MODELAN LOS 3 BIESTABLES y SECUENCIAS CONCURRENTES (mejor solución)
O un proceso por cada biestable, o una máquina de estados
CICLO DE ESCRITURA
DATO-> valor del dato correspondiente a un ciclo de escritura
DATO_VLD-> indica con un nivel alto y durante un período de la señal clk que hay dato válido de un ciclo de escritura (nueva dirección)
***Modelado similar a ciclo de lectura pero con DSTRB (detectar su flanco de subida)***
Controlar la señal RD
DATO_RD-> dato de entrada a ser leído en un ciclo de lectura.
CE_RD-> señal de habilitación o de información que permanece a nivel bajo el mismo tiempo que la señal DSTRB durante el ciclo de lectura (para que el periférico ponga el dato)
Puerta tristate, ya que el puerto es bidireccional, y tenemos que aislar la entrada de la salida del pc para evitar problemas (es un cortocircuito)
**Se modela con una asignación concurrente, en el que una de las alternativas sea Z.
DATA <= DATO_RD When {DSTRB=0 AND PWRITE=1} else { OTHERS => ‘Z’ }
Creamos los procesos correspondientes a la lógica, algunos mediante sentencias concurrentes, 
APARTADO 1. DISEÑO DE CONTROLADOR DEL PUERTO PARALELO EPP
Testbench: Generar ciclos que simulen el ciclo de escritura y el ciclo de lectura, con epp_device sólo es válido para simulación (ojo que ponga sólo simulación en el ISE)
--ciclos de lectura/escritura
Realizar ciclos mediante las 3 constantes que selección la frecuencia y la ram de vo1 y vo2
Llamamos al proceso (añadir llamadas) para hacer el ciclo de escritura en una dirección e igualmente con el ciclo de lectura
Apartado 2. Descarga en la placa del controlador del puerto paralelo.
Top_system1 donde se instancia la entidad, tenemos que implementar dos biestables tipo D Pg 18, realizar multiplexor 
El bloque PSH_BUTTON = 0 => se visualiza la dirección registrada =1 => se visualiza el dato registrado
El bloque al que tiene conectado los 8 switches de la placa (puerto SWITCHES_I) deberá llevarlos a la entrada DATO_RD del componente cnt_epp cuando se realice un ciclo de lectura en la posición 32HEX.
__MACOSX/DISENOECO/._plib.docx
DISENOECO/practica_libre_2014_15.pdf
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ASIGNATURA 
Diseño Electrónico 
 
Grado en Ingeniería de Electrónica de 
Comunicaciones. 
 
Universidad de Alcalá 
 
Curso Académico 2014/2015 
Curso 3º – Cuatrimestre 1º 
 
 
Dpto. Electrónica 
 
 
 
 
 2 
 
1. Introducción 
 
La siguiente práctica tiene como objetivo el desarrollo en VHDL de un sistema digital que permite 
cubrir todas las fases del flujograma de diseño de sistemas electrónicos para configurar FPGAs u otro 
tipo de ASICs: modelado, simulación, síntesis, implementación y descarga en placa. 
 
Para su implementación se utilizarán la tarjeta de pruebas del
laboratorio Atlys de Digilent basada en 
una FPGA Spartan 6 (XC6SLX45-CSG324) de la firma comercial Xilinx que incorpora distintos 
periféricos de entrada/salida. 
 
Concretamente, se desea diseñar un generador de funciones que proporciona dos señales analógicas 
cuyas formas serán diferentes y controladas desde una aplicación ejecutada en Matlab. Ambas 
señales tendrán la misma frecuencia, que será seleccionada desde esta aplicación. La comunicación 
entre el PC y la tarjeta Atlys se va a realizar utilizando un cable USB. 
 
Además de alcanzar este objetivo, la presente práctica busca que el alumno pueda realizar un primer 
diseño de forma libre siguiendo unas pautas mínimas. Para ello el alumno deberá resolver problemas 
habituales en el diseño con FPGAs como son la búsqueda del tamaño óptimo de datos, sincronización 
entre etapas, diseño de máquinas de estado (FSMs) así como la instanciación de componentes 
diseñados previamente. 
 
Los problemas a los que el alumno se enfrentará en esta práctica son los habituales que se 
encontrará en diseños más complejos. 
 
2. Estructura 
 
El diseño a realizar consiste en el modelado en VHDL de un sistema digital que permite, una vez 
programado en una FPGA, generar dos señales analógicas Vo1 y Vo2 (figura 1) cuyas formas y 
frecuencia se van a poder seleccionar desde un archivo creado y ejecutado en Matlab, estos valores 
serán enviados a través de una conexión USB. 
 
Desde la aplicación de Matlab se enviará a través de un cable USB un periodo, formado por 256 
muestras, correspondientes a las forma de onda de las señales Vo1 y Vo2. Cada una de las muestras 
tendrá un tamaño de 12 bits. A su vez, la frecuencia de dichas señales también se podrá seleccionar 
desde la aplicación de Matlab utilizando un dato de 8 bits. Cada uno de los datos generados por la 
aplicación de Matlab está constituido por dos campos: dirección y valor. Con la dirección se 
selecciona el destino del campo valor pudiéndose trabajar con 3 distintas: 
 
 A1 HEX. Dato correspondiente a la forma de onda de la señal Vo1. 
 A2 HEX. Dato correspondiente a la forma de onda de la señal Vo2. 
 F0 HEX. Dato correspondiente a la selección de la frecuencia de Vo1 y Vo2. 
 
 
Los datos proporcionados por la aplicación de Matlab se envían a la placa de desarrollo Atlys a través 
de un cable USB. En esta última se encuentra el driver CY7C68013A que convierte los datos recibidos 
a un formato paralelo (EPP- Enhanced Parallel Port) y se envían a la FPGA. Cada uno de los datos 
correspondientes a las formas de onda de Vo1 y Vo2 tiene un tamaño de 12 bits, si bien se envían, 
desde el PC, en un formato de 8 bits. Por cada dato se realizan dos transferencias desde el PC. Para la 
frecuencia se utilizará solamente un dato de 8 bits. 
 
 
 3 
 
Los datos almacenados se enviarán a dos conversores digitales analógicos DAC121S101 de National 
Semiconductor presentes en la placa PmodDA1 de Digilent. Para introducir los datos en el DAC se 
utiliza un protocolo serie de tres líneas: reloj (SCLK), dato de entrada (DIN) y un pin de selección 
(SYNC). 
 
Las conexiones entre los diferentes elementos de la práctica se muestran en la Figura 1. 
 
 
Figura 1 Conexión del hardware a utilizar. 
El sistema a diseñar hace uso de un RELOJ de 100 MHz como señal de sincronismo de los diferentes 
módulos secuenciales. Esta señal de proporciona por medio de un oscilador presente en la placa 
Atlys. Por su parte, la entrada RST se va a utilizar como señal asíncrona de inicialización para llevar 
todos los módulos secuenciales a su estado inicial. 
 
3. Entidad gen_funciones. 
 
Con el fin de facilitar el trabajo, para el modelado del sistema de medida se realizará un diseño 
jerárquico en el que la entidad de mayor nivel se llamará gen_funciones, y cuya definición se 
realizará en el archivo gen_funciones.vhd siendo su declaración la mostrada en la Figura 2. 
 
entity gen_funciones is 
 port ( 
 RELOJ : in std_logic; 
 RST : in std_logic; 
 -- PUERTO EPP 
 ASTRB : in std_logic; 
 DSTRB : in std_logic; 
 DATA : inout std_logic_vector(7 downto 0); 
 PWRITE : in std_logic; 
 PWAIT : out std_logic; 
 -- DAC 
 SYNC : out std_logic; 
 SCLK : out std_logic; 
 D1 : out std_logic; 
 D2 : out std_logic); 
end gen_funciones; 
Figura 2 Declaración de la entidad gen_funciones. 
OSCILADOR
RESET
SYNC
SCLK
RELOJ
D1
RST
(100 MHz)
Vcc
VOUT DIN
SCLKGND
Vcc
DAC121S101
Vo2
SYNC
3.3V
D2
CABLE
USB
ASTRB 
DSTRB
DATA 
PWRITE 
PWAIT 
FPGA
XC6SLX45-CSG324
VOUT DIN
SCLKGND
Vcc
DAC121S101
Vo1
SYNC
3.3V
ATLYS 
DRIVER
CY7C68013A
PmodDA1
 
 4 
 
Para modelar la entidad gen_funciones se va a hacer uso de seis componentes (Figura 3). En la 
documentación de la práctica se proporcionan “los esqueletos” de archivos VHDL para modelar 
estos elementos, con excepción del DCM, los cuales se deberán completar con el código necesario 
para que realicen la función que posteriormente se detallará. Si bien, no se podrán modificar los 
puertos de cada una de las entidades. Además, el diseño de los componentes anteriores no podrá 
ser jerárquico y los nombres de las señales a utilizar para conectar los diferentes componentes de la 
entidad gen_funciones deberán ser los utilizados en la Figura 3. El incumplimiento de las 
restricciones anteriores conlleva a una calificación de No Apto. 
 
 
Figura 3 Estructura de la entidad gen_funciones. 
 
Brevemente, la funcionalidad de cada una de las entidades de la Figura 3 es: 
 
dcm. Es el gestor de reloj digital usado para la gestión de las señales de reloj de los módulos 
secuenciales. Se utiliza para reducir la asimetría de los relojes compensando el posible 
desfasaje entre ellas. 
 
cnt_epp. Entidad que recibe los datos con la temporización establecida en el protocolo EPP y 
proporciona dos salidas DIR y DATO, ambas de 8 bits con el valor de la dirección y dato 
incluidos. Se proporcionan sendas señales de validación: DIR_VLD para indicar que hay una 
nueva dirección y DATO_VLD para indicar que hay un nuevo dato. Ambas señales 
permanecen a nivel alto un periodo de la señal de reloj CLK (10 ns). 
 
dpram_mem. Entidad que modela una memoria de doble puerto en la que se guarda cada 
una de las 256 muestras correspondientes a un periodo de las señales Vo1 y Vo2. Cada 
muestra tiene un tamaño de 12 bits. De los dos puertos uno es de escritura y el otro de 
lectura. 
 
cnt_dac. Entidad que realiza la conversión al protocolo serie del dato de 12 bits a introducir 
en cada uno de los DACS. La entrada DATO_OK se utiliza como sincronismo, de forma que 
pasa a nivel alto, durante un periodo de la señal de reloj, para indicar que hay un nuevo dato 
a enviar a los DACs. 
 
gen_dir. Entidad que se encarga de proporcionar la dirección correspondiente a cada una de 
las muestras de un periodo de las señales Vo1 y Vo2. El ritmo al que se cambian esta 
dcm
CLK_IN
 
 RESET
CLK _OUT 
dpram_men
cnt_dpram cnt_epp
ASTRB 
 DSTRB 
 DATA
 
 PWRITE 
 PWAIT 
CLK 
 DATO_OK
DATO2 
RELOJ
 
RST
ASTRB 
DSTRB 
DATA 
PWRITE 
PWAIT 
RST 
CLK 
DATO_RD(7:0)
CE_RD
DIR_VLD
DATO_VLD
DIR
DATO
DIR_VLD
DATO_VLD
DIR
DATO
WE_DP1
WE_DP2
ADDRESS
DATA
DIR_VLD
DATO_VLD
DIR
DATOWE
CLK
RST
DIN
ADDR_IN
ADDRESS
DATA_DP
CLK RST
WE_DP1
WE_DP2
ADDR_OUT
DOUT
DATO1
RST
cnt_dac
dpram_men
WE
DIN
ADDR_IN
CLK RST
ADDR_OUT
DOUT
gen_dir
CLK RST
ADDR_OUT
 DATO_OK DATO_OK
DATO1
DATO2 
ADDR_OUTSYNC
SCLK
D1
D2 
CLK
SYNC
SCLK
D1
D2 
DIR_VLD
DATO_VLD
DIR
DATO
 
 5 
 
dirección variará en función del valor de frecuencia seleccionado desde la aplicación de 
Matlab. 
 
cnt_dpram. Entidad que gestiona la carga de los datos
proporcionados por el PC, a través del 
protocolo EPP, en cada una de las memorias dual-port. 
 
 
 
4. Entidad cnt_epp. 
 
La entidad cnt_epp es la encargada de actuar como interface entre el puerto USB del ordenador y el 
diseño. Los diferentes parámetros de las señales de salida son enviados desde un PC conectado a la 
tarjeta de FPGAs mediante dicho puerto. 
 
La tarjeta Atlys, tal y como se puede ver en la documentación del fabricante 
(http:/www.digilentinc.com), posee un puerto USB ( Figura 4) que comunica el PC con la FPGA a 
través de un driver de Cypress (CY7C68013A). Este driver se encarga de transformar los datos 
enviados con un protocolo USB a un protocolo EPP (Enhanced Parallel Port). Se trata de un protocolo 
paralelo que opera casi a la velocidad del bus ISA y ofrece un incremento de hasta 10 veces la 
velocidad de transmisión sobre un puerto paralelo convencional. 
 
 
Figura 4 Comunicación PC- CY7C68013A-FPGA. 
 
El protocolo EPP permite realizar comunicaciones paralelo con velocidades hasta 2 Mbyte/s. Para 
ello emplea un único bus DATA (Figura 5) para realizar transferencias de datos y de 
direcciones. Utilizando dos líneas adicionales, ASTRB (address strobe) y DSTRB (data strobe), para 
discernir entre ellos: ASTRB activa a nivel bajo indica que está teniendo lugar una transferencia de 
direcciones y DSTRB se utiliza para indicar que la transferencia en curso es de datos. Además, se 
dispone de la línea PWRITE (Write enable) para seleccionar el sentido (lectura o escritura) de la 
transferencia de datos: un nivel alto para la lectura y un nivel bajo para la escritura. Por otro lado, 
el puerto PWAIT, generado por el periférico, permite prolongar los ciclos de acceso insertando 
estados de espera. Para esta práctica no es necesario prolongar los ciclos de acceso. 
 
CY7C68013A
FPGA
Tarjeta Atlys
EPP
USB
http://www.digilentinc.com)/
 
 6 
 
 
Figura 5 Señales empleadas en el protocolo EPP. 
Un ciclo de lectura (Figura 6) se realiza cuando el PC quiere acceder al contenido de una posición del 
periférico, en este caso la FPGA, especificada por el valor indicado por el bus DATA (Dirección en la 
Figura 6). El ciclo se divide en dos partes: escritura de la dirección y lectura del dato. El ciclo de 
escritura de la dirección se inicia cuando PWRITE pasa a nivel bajo, continuando con un nivel bajo en 
ASTBR, a lo que el periférico responde con un nivel alto en PWAIT. Durante el nivel bajo de ASTBR se 
proporciona la dirección del periférico a la que se quiere acceder. El ciclo de escritura de la dirección 
finaliza cuando ASTBR pasa a nivel alto, instante que puede utilizar el periférico para leer el valor de 
la dirección. Si el periférico desea introducir estados de espera mantendrá PWAIT a nivel alto, en 
caso contrario la lleva a nivel bajo. A continuación se realiza el ciclo de lectura del dato, en el que es 
el periférico el que proporciona el dato, el cual debe estar estable antes de que se produzca el flanco 
de subida de DSTRB. El periférico puede utilizar el flanco de bajada de esta señal para poner el dato 
en el puerto DATA. 
 
 
 
Figura 6 Ciclo de lectura del protocolo EPP. 
 
Un ciclo de escritura (Figura 7) es aquel que realiza el PC para escribir un dato en una posición del 
periférico. En este caso, se realizan dos ciclos de escritura: de dirección y de dato. En la primera 
parte del ciclo se procede a escribir la dirección, de forma similar al de la Figura 6 y en la segunda 
parte del ciclo se procede a escribir un dato. En ella, la señal PWRITE se mantiene a nivel bajo, a la 
vez que el PC pone el dato a escribir en el periférico en DATA. El periférico puede utilizar el flanco de 
subida de DSTRB para leer el dato. 
 
 
CY7C68013A
CABLE USB
ASTRB
DSTRB
DATA
PWRITE
PWAIT
WAIT
DSTRB
ASTRB
WRITE
DATA[7:0] Dirección Dato
 
 7 
 
 
Figura 7 Ciclo de escritura del protocolo EPP. 
 
De acuerdo con el diagrama de bloques de la Figura 3, la declaración de la entidad cnt_epp. Se 
muestra en la Figura 8. 
 
entity cnt_epp is 
 port ( 
 CLK : in std_logic; 
 RST : in std_logic; 
 ASTRB : in std_logic; 
 DSTRB : in std_logic; 
 DATA : inout std_logic_vector(7 downto 0); 
 PWRITE : in std_logic; 
 PWAIT : out std_logic; 
 DATO_RD : in std_logic_vector(7 downto 0); 
 CE_RD : out std_logic; 
 DIR : out std_logic_vector (7 downto 0); 
 DIR_VLD : out std_logic; 
 DATO : out std_logic_vector (7 downto 0); 
 DATO_VLD : out std_logic); 
end ; 
Figura 8 Declaración de la entidad cnt_epp. 
 
El funcionamiento de los puertos, a parte de los implicados en el protocolo EPP, de la Figura 8 es: 
 DIR. Valor de la dirección de un ciclo de acceso. 
 DIR_VLD. Indica con un nivel alto y durante un periodo de la señal CLK que en DIR se 
encuentra la dirección de un ciclo de lectura o escritura. 
 DATO. Valor del dato correspondiente a un ciclo de escritura. 
 DATO_VLD. Indica con un nivel alto y durante un periodo de la señal CLK que en DATO hay 
un dato válido de un ciclo de escritura. 
 DATO_RD. Dato de entrada a ser leído en un ciclo de lectura. 
 CE_RD. Señal de habilitación que permanece a nivel bajo el mismo tiempo que la señal 
DSTRB durante un ciclo de lectura. 
 
En la Figura 9 se puede ver un cronograma detallado de la activación de los diferentes puertos de la 
entidad cnt_epp, tanto para un ciclo de lectura como de escritura. 
 
 
WAIT
DSTRB
ASTRB
WRITE
Dirección DatoDATA[7:0]
 
 8 
 
 
Figura 9. Cronogramas de funcionamiento del protocolo EPP. 
En esta práctica, todos los ciclos que se realizarán serán de escritura. Sin embargo, la entidad 
cnt_epp debe realizar la decodificación tanto de los ciclos de escritura como los de lectura. 
 
 
5. Entidad cnt_DAC. 
 
La entidad cnt_dac es la encargada de proporcionar las señales de control de los dos DAC121S101 de 
la placa PmodDA1, los cuales van a proporcionan las tensiones de salida Vo1 y Vo2 a partir de los 
datos almacenados en las memorias dual port. 
 
El DAC121S101 es un convertidor digital analógico de 12 bits con una interface serie que acepta 
diferentes protocolos (SPI™, QSPI, MICROWIRE). Para ello utiliza tres líneas de control: Din para 
introducir los bits del dato a convertir y SCLK y SYNC que sincronizan dicha transferencia. Para una 
correcta operación, la transferencia de datos debe cumplir el cronograma de la Figura 10, nótese 
como en la entrada DIN se proporciona un nuevo valor coincidiendo con el flanco de subida de SCLK. 
Las señales mostradas en el cronograma de la Figura 10 deben cumplir los tiempos mostrados en la 
Tabla 1. 
 
 
Figura 10 Cronograma de funcionamiento del DAC121S101. 
 
CICLO DE ESCRITURA CICLO DE LECTURA
 
 9 
 
 
 
 
Tabla 1. Valores límites de los tiempos de la Figura 10. 
 
 
Como se puede extraer de la Figura 10 el DAC recibe 16 bits: 12 del dato, más 4 (los de mayor peso) 
de control (Figura 11). Para esta práctica todos los bits de control deben ser 0. 
 
 
Figura 11 Trama de datos a enviar al DAC. 
 
 
El valor de la tensión V que proporciona el DAC121S101 viene dado por: 
 
4096
3.3*DATO
V  
 
donde DATO se corresponde con el dato binario de 12 bits introducido en el DAC. Junto con este 
enunciado se proporciona el archivo DAC121S101.pdf donde se puede encontrar una descripción 
más detalla del funcionamiento del conversor. 
 
La entidad cnt_adc se debe diseñar de forma que cada vez que se activa (nivel alto) DATO_OK se 
inicia el proceso de transferencia de los datos DATO1 y DATO2 a los DACs. Cuando DATO_OK pasa a 
nivel bajo se generan las señales SYNC, SCLK y DIN. Una vez que se han transferido todos los bits de 
los datos, el proceso se para hasta una nueva activación de DATO_OK. La declaración de la entidad 
cnt_dac
se muestra en la Figura 12 . 
 
 
 10 
 
 
entity cnt_dac is 
 port ( 
 CLK : in std_logic; 
 RST : in std_logic; 
 DATO1 : in std_logic_vector(11 downto 0); 
 DATO2 : in std_logic_vector(11 downto 0); 
 DATO_OK : in std_logic; 
 SYNC : out std_logic; 
 SCLK : out std_logic; 
 D1 : out std_logic; 
 D2 : out std_logic); 
end cnt_dac; 
Figura 12 Declaración de la entidad cnt_dac. 
 
El tiempo invertido en convertir un dato digital en una tensión analógica será igual al periodo de la 
señal SYNC, que es igual al de DATO_OK. Para que el diseño sea más sencillo se va a establecer para 
SCLK una frecuencia contante, fijando sus tiempos de nivel bajo (tL) y alto (tH) a 20 ns, valor mínimo 
que se puede conseguir, cumpliendo las especificaciones de la Tabla 1 con una señal CLK de 
frecuencia 100 MHz. El tiempo tSYNC vendrá determinado por la frecuencia de la señal que se quiere 
obtener. Teniendo en cuenta que el valor mínimo de tSYNC es de 20 ns, el tiempo mínimo para 
digitalizar un dato será: 
 
𝑇𝐷𝑚𝑖𝑛 = 16(𝑇𝐿𝑚𝑖𝑛 + 𝑇𝐻𝑚𝑖𝑛) + 𝑇𝑆𝑌𝑁𝐶𝑚𝑖𝑛 = 16(20 𝑛𝑠 + 20 𝑛𝑠) + 20 𝑛𝑠 = 660 𝑛𝑠 
 
Considerando que un periodo de una señal está formado por 256 muestras, la mayor frecuencia que 
se puede conseguir para las señales Vo1 y Vo2 será: 
 
𝑓𝑚𝑎𝑥 =
1
256 ∗ 660 𝑛𝑠
= 5.92 𝐾𝐻𝑧 
 
 
6. Memoria dual port. 
 
La memoria dual por será la encargada de almacenar un periodo de cada una de las señales a 
generar. Esta memoria tendrá una organización de 256x 12 bits, teniendo un puerto de sólo escritura 
y otro se sólo lectura. Tanto los ciclos de escritura como los de lectura son síncronos, utilizando la 
señal CLK para tal fin. Su declaración es la mostrada en la Figura 13, siendo la funcionalidad de cada 
uno de los puertos, la siguiente: 
 
DIN. Bus de datos correspondiente al puerto de solo escritura. 
ADDR_IN. Bus de dirección del puerto de sólo escritura. 
WE. Señal de validación de la operación de escritura. Es activa a nivel alto. 
DOUT. Bus de datos correspondientes al puerto de solo lectura. 
ADDR_OUT. Bus de dirección del puerto de sólo lectura. 
 
entity dpram_mem is 
 port ( 
 DIN : in std_logic_vector(11 downto 0); 
 ADDR_IN : in std_logic_vector(7 downto 0); 
 WE : in std_logic; 
 CLK : in std_logic; 
 RST : in std_logic; 
 ADDR_OUT : in std_logic_vector(7 downto 0); 
 DOUT : out std_logic_vector(11 downto 0)); 
end entity; 
Figura 13. Declaración de la entidad dpram_mem. 
 
 11 
 
En la Figura 14 se muestra un cronograma de funcionamiento de la entidad dpram_men. 
 
 
Figura 14. Ciclos de acceso al módulo dual port. 
7. Controlador de la memoria dual port 
 
Este módulo es el encargado de escribir en las memorias dual port del diseño la información que se 
envía a través del puerto paralelo (EPP). Dependiendo de la dirección seleccionada, el dato se 
almacenará en una u otra memoria. Hay que tener en cuenta que los datos que se envían desde el 
puerto EPP tienen un tamaño de 8 bits mientras que el dato de la memoria es de 12 bits. En 
consecuencia, se necesitan dos ciclos de escritura para proporcionar dicho dato. Así los 8 bits del 
dato correspondientes al primer ciclo de escritura se corresponden con los 8 bits de menor peso (bits 
7-0) del dato de la memoria y los 4 bits de menor peso del dato descrito en el segundo ciclo se 
corresponde con los 4 bits de mayor peso del dato a introducir en la memoria (bits 11-8). Además 
hay que tener en cuenta las siguientes consideraciones de diseño. 
 
 Un dato de 12 bits se proporciona con dos ciclos de escritura consecutivos en la misma 
dirección. 
 El dato sólo será escrito en la memoria si se han recibido los 12 bits con dos ciclos 
consecutivos de escritura. 
 A medida que se van enviando datos con la misma dirección, se irán almacenando en 
posiciones consecutivas. 
 Una vez almacenado un dato en la última posición de memoria (FFHEX), si se envían datos 
manteniendo la misma dirección, estos se irán almacenado desde la primera posición (00HEX) 
y en posiciones consecutivas. 
 Cuando se realiza un ciclo de escritura en una dirección diferente al anterior ciclo se entiende 
que el dato se corresponde con los 8 bits menos significativos de la posición 0 de la memoria 
que corresponde con dicha dirección. Esto es válido, siempre y cuando esta dirección se 
corresponda con una de las dos utilizadas en este diseño: A1HEX y A2 HEX. 
 Las memorias se pueden escribir parcialmente. 
 En la memoria dual port 1 se escribirán los datos cuya dirección es A1 HEX y en la dual port 2 
los correspondientes a la dirección A2HEX. 
 
En la Figura 15 se muestra un cronograma de funcionamiento del bloque controlador de las 
memorias dual port. 
 
 
Figura 15. Cronograma de funcionamiento del bloque controlador de las memorias dual port. 
 
 12 
 
En la Figura 16 se muestra la declaración de la entidad cnt_dpram que controla la gestión de las 
memorias dual port. 
 
entity cnt_dpram is 
 port ( 
 CLK : in std_logic; 
 RST : in std_logic; 
 DIR : in std_logic_vector (7 downto 0); 
 DIR_VLD : in std_logic; 
 DATO : in std_logic_vector (7 downto 0); 
 DATO_VLD : in std_logic; 
 ADDRESS : out std_logic_vector(7 downto 0); 
 DATA : out std_logic_vector(11 downto 0); 
 WE_DP1 : out std_logic; 
 WE_DP2 : out std_logic); 
end cnt_dpram; 
Figura 16. Declaración de la entidad cnt_dpram. 
8. Generador de la dirección de las memorias dual port. 
 
La entidad gen_dir se encarga de generar las direcciones de los puertos de sólo lectura de las 
memorias dual port. El ritmo al que cambian estas direcciones es proporcional al valor del dato 
seleccionado desde el puerto paralelo al escribir en la dirección F0HEX (Figura 3). Para modelar el 
funcionamiento de la entidad gen_dir se va a utilizar la estructura que se muestra en la Figura 17. En 
ella, VALOR_FREC se corresponde con el último dato escrito en la dirección F0HEX. 
 
 
Figura 17 Diagrama de bloques de la entidad gen_dir. 
 
El conjunto registro-sumador-truncador(T) modelan el generador de direcciones, en el que la 
frecuencia a las que estas se incrementan, viene dada por: 
 
 
CLKf
N
FRECVALOR
f 
162*
_
 
 
Donde fCLK representa la frecuencia de reloj de la señal de reloj (CLK) del diseño (100 MHz). El factor 
de división del prescaler (N) es igual al número mínimo de ciclos de reloj que se tarda en digitalizar 
un dato. Este valor, como se ha visto con anterioridad, sería 66: 64 para transmitir los 16 bits del 
dato y dos para llevar SYNC a nivel alto. Si bien se van a utilizar 4 pulsos de reloj para garantizar la 
temporización; así, se tendrá N=68. 
 
Para informar al módulo controlador de los DACS de que hay un nuevo dato a digitalizar, la entidad 
gen_dir proporciona la salida DATA_OK. Esta señal está retardada, con respecto a la dirección de la 
ADDR_OUT
Q
CE
+ T16168 8D
CLK
 VALOR_FREC 
16
Sistema
secuencial
DATO_OK
Prescaler
(N)
CNT
 
 13 
 
memoria dual port (ADDR_OUT) un periodo de CLK, para compensar el tiempo de acceso de la 
memoria (Figura 18). 
 
Figura 18. Retardo en la activación de DATO_OK. 
 
En la se muestra la declaración de la entidad gen_dir. 
 
entity gen_dir is 
 port ( 
 CLK : in std_logic; 
 RST : in std_logic; 
 DIR : in std_logic_vector (7 downto 0); 
 DIR_VLD : in std_logic; 
 DATO : in std_logic_vector (7 downto 0); 
 DATO_VLD : in std_logic; 
 ADDR_OUT : out std_logic_vector(7 downto 0); 
 DATO_OK : out std_logic); 
end gen_dir; 
Figura 19 Declaración de la entidad gen_dir. 
9. Entidad dcm 
 
Las FPGAs de la familia Spartan 6 dispone de 4 bloques para el control
de todos los aspectos 
relacionados con la frecuencia, la fase y el skew de la red de relojes de la FPGA. 
 
La FPGA recibe una señal de reloj externo de frecuencia 100 MHz. Sin embargo, con objeto de 
optimizar el funcionamiento del sistema y evitar al máximo problemas de forma y skew en la señal 
de reloj global del sistema, se propone el uso de un bloque DCM de los 4 disponibles. Por tanto, este 
elemento tendrá como entrada una señal (RELOJ) de 100 MHz y sacará una señal bien 
conformada de igual frecuencia (CLK). 
 
 
Esta entidad se creará con la herramienta CORE Generator del sistema de desarrollo ISE y tendrá una 
declaración similar a la mostrada en la Figura 19. 
 
entity dcm is 
port 
 (-- Clock in ports 
 CLK_IN : in std_logic; 
 -- Clock out ports 
 CLK_OUT : out std_logic; 
 -- Status and control signals 
 RESET : in std_logic 
 ); 
end dcm; 
Figura 19 Declaración de la entidad dcm. 
 
 
 14 
 
10. Información adicional. 
 
Formando parte del conjunto de archivos que se entregan con la práctica se encuentran los archivos 
que contienen las entidades definidas en la Figura 3, excepto la entidad dcm. Estos se deberán 
completar para obtener el funcionamiento deseado. Si bien, bajo ningún concepto se podrán 
modificar ni el número ni el nombre de sus puertos. 
 
En el archivo gen_funciones.vhd, en el que se modela la entidad gen_funciones, se realizará la 
interconexión de los componentes de la Figura 3. 
 
 
11. Consideraciones de diseño. 
 
 
 A la hora de codificar el diseño se aconseja el uso de EMACS ya que su código, 
mayoritariamente, está libre de errores y ayuda a una mejor comprensión del mismo. 
 
 No abusar en los niveles de anidación if-else. Su implementación es complicada y 
además infiere muchos recursos y penaliza de forma considerable la frecuencia máxima de 
reloj. 
 
 Con idea de optimizar el diseño, es importante analizar los resultados de los informes 
de síntesis e implementación. Estos aportan muchas veces información sobre señales que 
no se usan, señales no conectadas, etc. 
 
 No vale la excusa: “la simulación funcional va perfectamente”, ya que sentencias como 
por ejemplo wait for 10 ns no tiene una traducción sintetizable. Por tanto para validar 
el diseño se recomienda sintetizar cada módulo por separado, realizar un test-bench de cada 
uno de ellos y realizar simulaciones funcionales y temporales de todo por separado. 
 
 El diseño debe funcionar obligatoriamente a 100 MHz, sin embargo uno de los índices 
de mayor bondad de un diseño, además de obviamente gastar el menor número de 
recursos internos, es la máxima frecuencia de reloj. Esto se logra empleando 
mayoritariamente sistemas secuenciales los cuales son gobernados con una señale de reloj 
como máximo. 
 
 El diseño hace uso de la señal del oscilador de la placa Atlys cuya frecuencia de 100 MHz. 
 
 El nombre de todas las señales de reloj de los bloques secuenciales utilizados en el diseño 
deberá ser CLK. 
 
 Todos los elementos secuenciales modelados deben ser activos en el flanco de subida de la 
señal CLK. 
 
 Se debe verificar que en el diseño no se infieran latchs. 
 
 
 
 15 
 
12. Desarrollo de la práctica. 
 
Con el desarrollo de la práctica se pretenden abordar tanto aspectos de modelado en VHDL para 
síntesis como para simulación. Para ello se ha dividido en una serie de apartados de dificultad 
progresiva que llevan a la consecución del diseño final. Para cada uno de los apartados se indica la 
nota máxima que aporta (sobre un total de 10 puntos), pudiéndose modificar dicha nota a la baja en 
función de la consecución de los diferentes subapartados. 
 
Es importante tener en cuenta que la memoria de la práctica deberá incluir no sólo los resultados de 
la misma sino también los pasos que se han llevado a cabo para su desarrollo. En este sentido, para 
cada uno de los apartados y subapartados se especifica claramente, qué detalles se deberán incluir 
en la memoria. De este modo, cada párrafo marcado con el símbolo (*) indica que se deberá generar 
una entrada en la memoria incluyendo en la misma lo que se pide. Asimismo, se deberá incluir en la 
memoria, la referencia que aparece después del símbolo anteriormente mencionado. 
 
 
Apartado 1. Diseño del controlador del puerto paralelo (EPP). (1.5 puntos) 
 
En este apartado el alumno deberá llevar a cabo la especificación en VHDL del módulo que realiza el 
control del bus EPP (entidad cnt_epp) para su posterior simulación, síntesis, e implementación. 
 
 
La consecución de este apartado deberá responder a las siguientes cuestiones: 
 
1.1.- Comprobación de la funcionalidad del controlador del puerto paralelo. (1 punto) 
 
El alumno deberá modelar y simular funcionalmente la entidad cnt_epp para comprobar que 
funciona correctamente creando el correspondiente test bench (cnt_epp_tb.vhd). Para poder 
simular esta entidad se proporciona la entidad epp_device que se encarga de modelar el 
funcionamiento de un puerto EPP, la cual deberá ser completada por los alumnos. Esta es una 
entidad que se va a utilizar sólo en simulación con lo que se puede emplear cualquier construcción 
VHDL sin restricciones. La declaración de la entidad epp_device se muestra en la Figura 20. La Figura 
21 muestra la conexión entre los distintos modelos dentro del banco de pruebas cnt_epp_tb.vhd. 
 
entity epp_device is 
 port ( 
 DATA : inout std_logic_vector(7 downto 0); 
 PWRITE : out std_logic; 
 DSTRB : out std_logic; 
 ASTRB : out std_logic; 
 PWAIT : in std_logic); 
end epp_device; 
Figura 20. Declaración de la entidad epp_device. 
 
Figura 21. Conexiones a establecer en el test bench cnt_epp_tb. 
cnt_epp
AS TB 
 DS TB 
 DATA
 
 P WRITE 
 PWAIT 
CLK RST 
DATO_RD(7:0)
CE _RD
DIR_VLD
DATO_VLD
DIR
DATO
epp_device
ASTB 
DSTB 
DATA
 
PWRITE 
PWAIT 
cnt_epp_tb
 
 16 
 
En la entidad epp_device, para modelar los ciclos de acceso (lectura/ escritura), se utiliza el 
procedure epp_cycle cuya declaración se muestra en la Figura 22. Donde address se corresponde 
con la dirección sobre la que se realiza el ciclo y data_io se corresponde con el dato a leer o escribir 
en dicho ciclo y con r_w el tipo de operación a realizar: r para la lectura y w para la escritura. En la 
Figura 23 se muestra un cronograma de funcionamiento del puerto EPP. 
 
procedure epp_cycle ( address : in std_logic_vector(7 downto 0); 
 data_io : inout std_logic_vector(7 downto 0); 
 r_w : in character) is 
Figura 22. Declaración del procedure epp_cycle que modela los ciclos de acceso con el protocolo 
EPP. 
 
En el archivo epp_device.vhd, que se proporciona con este enunciado se han declarado las señales y 
constantes que se muestran en la Figura 23: 
 
clk_epp. Señal de reloj interna que sincroniza la activación de las diferentes señales. 
T_clk. Periodo de la señal clk_epp. 
N. Número de periodos clk_epp que están a nivel bajo las señales DSTRB y ASTRB. 
read_value. Se corresponde con el dato leído en un ciclo de lectura. 
dir_frec. Dirección utilizada para seleccionar la frecuencia de las tensiones de salida. 
dir_dpram1. Dirección asignada para los datos correspondientes a la tensión Vo1. 
dir_dpram2. Dirección asignada para los datos correspondientes a la tensión Vo2. 
 
 
 signal clk_epp : std_logic := '0'; -- Internal clock signal 
 constant T_clk : time := 100 ns; -- Internal clock period. . 
 constant N : natural := 10; -- Length EPP cicle 
 signal read_value : std_logic_vector(7 downto 0) := (others => '0'); 
 constant dir_frec : std_logic_vector( 7 downto 0) := x"F0"; 
 constant dir_dpram1 : std_logic_vector(
7 downto 0) := x"A1"; 
 constant dir_dpram2 : std_logic_vector( 7 downto 0) := x"A2"; 
Figura 23 señales y contantes declaradas en el archivo epp_device.vhd. 
En la Figura 24 se muestra como se activan las diferentes señales del puerto EPP sincronizadas con la 
señal clk_epp para un ciclo de escritura. Para el de lectura son similares. 
 
 
Figura 24. Temporización de un ciclo de escritura realizado por la entidad epp_device. 
 
En la memoria de la práctica se deberá añadir los siguientes puntos: 
 
 
(*)1.1.1.- Código VHDL de la entidad cnt_epp y del banco de pruebas utilizado en su simulación. 
También se debe proporcionar el código de la entidad epp_device. 
(*)1.1.2- Razonamiento de por qué se ha adoptado la solución presentada. 
 
 17 
 
(*)1.1.3.- Pantallazo de simulación donde se refleje que la entidad cnt_epp funciona correctamente. 
Para ello se realizarán tres ciclos de escritura, uno en cada uno de las direcciones que se van a utilizar 
en el diseño (dir_frec, dir_dpram1 y dir_dpram2) y una operación de lectura en la dirección a elegir 
por el alumno. 
 
1.2.- Simulación temporal del controlador del puerto paralelo . (0.5 puntos). 
 
Con el objetivo de comprobar las características temporales del controlador del puerto EPP, se debe 
llevar a cabo la síntesis y la implementación de la misma. El alumno debe tener en cuenta que la 
simulación temporal requiere más tiempo de simulación ya que se utiliza un modelo estructural del 
circuito junto con los retardos generados por las herramientas de implementación. En la memoria de 
la práctica se deberá añadir los siguientes datos: 
 
(*)1.2.1.- Tabla donde se incluya los recursos utilizados para la implementación del controlador del 
puerto EPP. Los datos anteriores serán extraídos del informe de síntesis. La tabla 2 muestra un 
ejemplo. 
 
Tabla 2. Recursos utilizados 
Slice Logic Utilization 
Number of Slice Registers 0 out of 54,576 0% 
Number of Slice LUTs 4 out of 27,288 1% 
Number used as logic 4 out of 27,288 1% 
Number using O6 output only 0 
Number using O5 output only 0 
Number using O5 and O6 4 
Number used as ROM 0 
Number used as Memory 0 out of 6,408 0% 
 
(*)1.2.2.- Medida del retardo entre el flanco activo de la señal de reloj y la activación de los puertos 
DIR_VLD y DATO_VLD. Se debe mostrar el resultado a través de pantallazos de simulación utilizando, 
para ello, dos cursores. 
(*)1.2.3.- Pantallazo de simulación donde se refleje el que la entidad cnt_epp funciona 
correctamente. 
 
 
Apartado 2. Descarga en placa del controlador del puerto paralelo. (1 puntos) 
 
En este apartado, el alumno deberá comprobar el funcionamiento del control del puerto EPP en la 
placa de pruebas. Para la consecución de este objetivo se deberá tener en cuenta los siguientes 
pasos: 
 
 
 
 
 18 
 
2.1.- Verificación práctica de la funcionalidad del controlador del puerto paralelo. (0.5 puntos) 
 
El alumno deberá especificar el modelo top_system1 cuya entidad se muestra en la Figura 25 y su 
estructura se muestra en la Figura 26. 
 
 
entity top_system1 is 
 port( 
 CLK : in std_logic; 
 RST : in std_logic; 
 ASTRB : in std_logic; 
 DSTRB : in std_logic; 
 DATA : inout std_logic_vector(7 downto 0); 
 PWRITE : in std_logic; 
 PWAIT : out std_logic; 
 SWITCHES_I : in std_logic_vector(7 downto 0); 
 PSH_BUTTON:in std_logic; 
 LEDS_O : out std_logic_vector (7 downto 0)); 
end top_system1; 
 
Figura 25. Declaración de la entidad top_system1. 
 
Figura 26. Sistema empleado para verificar el controlador del bus paralelo. 
 
La arquitectura del top_system1 incluye el componente cnt_epp y otros elementos adiciones que 
permitirán, a través del puerto EPP, leer el estado de los switches de la placa y sacar información por 
los leds en ella presentes. 
 
En la Figura 26 se muestra como se utilizan sendos registros (FF D) para registrar la dirección y el 
dato escrito. Los dos bloque marcados con ?, deben ser diseñados por el alumno teniendo en cuenta 
que: 
 
El bloque controlado con la señal PSH_BUTTON permite seleccionar que información se 
visualiza en los LEDS de forma que con un nivel bajo se selecciona la dirección registrada y 
con un alto el dato registrado. 
 
(100 MHz)
CABLE
USB
ASTRB 
DSTRB
DATA 
PWRITE 
PWAIT 
top_system1
ATLYS 
DRIVER
CY7C68013A
cnt_epp
CLK 
RST 
DATO_RD(7:0)
CE_RD
DIR_VLD
DATO_VLD
DIR
DATO
Q
CE
CLK RST 
D
FF D
Q
CE
CLK RST 
D
FF D
DIR_REG
DATO_REG
LEDS_O
RST PSH_BUTTON SWITCHES_I
CLK
 
 19 
 
El bloque al que tiene conectado los 8 switches de la placa (puerto SWITCHES_I) deberá 
llevarlos a la entrada DATO_RD del componente cnt_epp cuando se realice un ciclo de 
lectura en la posición 32HEX. 
 
Para comprobar que el modelo funciona se deberá llevar a cabo la descarga en placa. En los ficheros 
que se adjuntan a la práctica se incluye el fichero top_system1.ucf que contiene las restricciones 
asociadas a la asignación de los puertos de la entidad top_system1 con los pines de la FPGA. La 
Figura 27 muestra el contenido del fichero top_system1.ucf. 
 
 
 
NET "CLK" LOC = "L15"; 
# onBoard USB controller 
 NET "ASTRB" LOC = "B9"; 
 NET "DSTRB" LOC = "A9"; 
 NET "PWRITE" LOC = "C15"; 
 NET "PWAIT" LOC = "F13"; 
 NET "DATA<0>" LOC = "A2"; 
 NET "DATA<1>" LOC = "D6"; 
 NET "DATA<2>" LOC = "C6"; 
 NET "DATA<3>" LOC = "B3"; 
 NET "DATA<4>" LOC = "A3"; 
 NET "DATA<5>" LOC = "B4"; 
 NET "DATA<6>" LOC = "A4"; 
 NET "DATA<7>" LOC = "C5"; 
 
# onBoard Pushbuttons 
 NET "PSH_BUTTON" LOC = "F5"; 
 NET "RST" LOC = "N4"; 
 
# onBoard LEDS 
 NET "LEDS_O<0>" LOC = "U18"; 
 NET "LEDS_O<1>" LOC = "M14"; 
 NET "LEDS_O<2>" LOC = "N14"; 
 NET "LEDS_O<3>" LOC = "L14"; 
 NET "LEDS_O<4>" LOC = "M13"; 
 NET "LEDS_O<5>" LOC = "D4"; 
 NET "LEDS_O<6>" LOC = "P16"; 
 NET "LEDS_O<7>" LOC = "N12"; 
 
# onBoard SWITCHES 
 NET "SWITCHES_I<0>" LOC = "A10"; 
 NET "SWITCHES_I<1>" LOC = "D14"; 
 NET "SWITCHES_I<2>" LOC = "C14"; 
 NET "SWITCHES_I<3>" LOC = "P15"; 
 NET "SWITCHES_I<4>" LOC = "P12"; 
 NET "SWITCHES_I<5>" LOC = "R5"; 
 NET "SWITCHES_I<6>" LOC = "T5"; 
 NET "SWITCHES_I<7>" LOC = "E4"; 
Figura 27. Contenido del fichero top_system1.ucf. 
 
En la memoria de la práctica se deberá añadir los siguientes datos: 
 
(*)2.1.1.- Especificación en VHDL de los modelos top_system1 y el correspondiente banco de 
pruebas top_sytem1_tb. 
(*)2.1.2.- Pantallazos de la simulación funcional de los modelos anteriores donde se demuestre que 
funcionan correctamente. 
(*)2.1.3.- Pantallazos de la simulación temporal de los modelos anteriores donde se demuestre que 
funcionan correctamente. En este caso se deberá añadir una tabla donde se reflejen los recursos 
utilizados en su implementación (ver Tabla 2). 
 
 
 
 20 
 
 
2.2.- Descarga en placa de la entidad top_system1. (0.5 puntos) 
 
En este punto el alumno deberá descargar en placa la entidad top_system1. Los datos de entrada al 
diseño top_system1 se suministrarán a través del entorno mostrado en la Figura 28. 
 
 
Figura 28.Entorno para leer y escribir datos al díselo top_sytem1. 
 
En la memoria de la práctica se deberá añadir los siguientes puntos: 
 
(*)2.2.1.- Pantallazos como el de la Figura 28 donde se refleje que la entidad top_system1 
correctamente para las distintas operaciones. 
 
Para que este apartado sea considerado cómo válido, el alumno deberá mostrar al profesor que la 
descarga en placa funciona correctamente. 
 
 
Apartado 3. Diseño del controlador de los DACs . (1 puntos) 
 
En este apartado el alumno deberá especificar un módulo VHDL que implemente el sistema 
correspondiente al controlador de los DACs (entidad cnt_dac ). 
 
Este apartado se estructura en los siguientes subapartados.
3.1.- Simulación funcional del controlador de los DACs. (0.75 puntos) 
 
En este apartado se deberá realizar la simulación funcional de la entidad cnt_adc, realizando el 
correspondiente test bench. Para ello, junto con el enunciado de esta práctica se proporciona en el 
archivo DAC121S101.vhd en el que se modela el funcionamiento de dicho DAC. Este componente 
deberá ser utilizado por duplicado, ya que la entidad cnt_dac realiza el control de los dos 
DAC121S101 presentes en la placa PmodDAC1 que se va a conectar a la tarjeta Atlys. Así el test 
bench tendrá la estructura mostrada en la Figura 29. 
 
 21 
 
 
Figura 29 estructura del test bench utilizado para simular la entidad cnt_adc. 
 
En la memoria de la práctica se deberá añadir los siguientes datos: 
 
(*)3.1.1.- Código VHDL del módulo de control de los DACs y del banco de pruebas utilizado en su 
simulación. 
(*)3.1.2- Razonamiento de por qué se ha adoptado la solución presentada. 
(*)3.1.3.- Pantallazo de simulación funcional donde se refleje que le mencionado circuito funciona 
correctamente. Para ello en el banco de pruebas deberá incluir los estímulos necesarios para 
comprobar que para todas las operaciones el módulo funciona correctamente. 
 
 
3.2.- Simulación temporal del controlador de los DACs. (0.25 puntos) 
 
En este punto se llevará a cabo la simulación temporal del modelo VHD creado. En la memoria de la 
práctica se deberá añadir los siguientes puntos: 
 
(*)3.2.1.- Tabla donde se incluyan los recursos utilizados para la implementación (ver tabla 2). 
(*)3.2.2.- Pantallazo de simulación donde se refleje que el controlador de los DACs funciona 
correctamente. 
 
 
 
Apartado 4. Modelado de la memoria dual port. (0.75 puntos) 
 
En este apartado el alumno deberá analizar el módulo VHDL que implemente la memoria dual port 
(entidad dpram_mem). 
 
Este apartado se estructura en los siguientes subapartados. 
 
 
4.1.- Simulación funcional la memoria dual port. (0.5 puntos) 
 
En este apartado se deberá realizar la simulación funcional de la entidad dpram_mem para 
comprobar que funciona correctamente de forma individual. En la memoria de la práctica se deberá 
añadir los siguientes datos: 
 
(*)4.1.1.- Código VHDL del módulo y del banco de pruebas utilizado en la simulación. 
(*)4.1.2- Estudio detallado del funcionamiento de la memoria dual port 
(*)4.1.3.- Pantallazo de simulación donde se refleje que el mencionado circuito funciona 
correctamente. Para ello en el banco de pruebas deberá incluir los estímulos necesarios para 
comprobar que el módulo funciona correctamente. 
 
V OUT
DAC121S101 
S YNC
SCLK
DIN DATO_OK
DATO2 
DATO1
RS T
cnt_dac
SYNC
SCLK
D1
D2 
CLK
Vo1
V OUT
DAC121S101 
S YNC
SCLK
DIN
Vo2
 
 22 
 
 
4.2.- Simulación temporal del módulo la memoria dual port. (0.25 puntos) 
 
En este punto se llevará a cabo la simulación temporal de la entidad dpram_mem. En la memoria de 
la práctica se deberá añadir los siguientes puntos: 
 
(*)4.2.1.- Tabla donde se incluyan los recursos utilizados para la implementación (ver tabla 2). 
(*)4.2.2.- Pantallazo de simulación donde se refleje que el módulo funciona correctamente. 
 
 
 
Apartado 5. Implementación del controlador de las memorias dual port (2.5 puntos) 
 
En este apartado el alumno deberá especificar un módulo VHDL que implemente el controlador de 
las memorias dual port (entidad cnt_dpram). 
 
Este apartado se estructura en los siguientes subapartados. 
 
5.1.- Simulación funcional del controlador de la memoria dual port. (1.5 punto) 
 
En este apartado se deberá realizar la simulación funcional para comprobar que el mencionado 
módulo funciona correctamente de forma individual. En el banco de pruebas utilizado se deberá 
utilizar un procedimiento (procedure) para generar las señales DIR, DIR_VLD, DATO y DATO_VLD. 
 
En la memoria de la práctica se deberá añadir los siguientes datos: 
 
(*)5.1.1.- Código VHDL del módulo y del banco de pruebas utilizado en la simulación. 
(*)5.1.2- Razonamiento de por qué se ha adoptado la solución presentada. 
(*)5.1.3.- Pantallazo de simulación donde se refleje que el mencionado circuito funciona 
correctamente. Para ello en el banco de pruebas deberá incluir los estímulos necesarios para 
comprobar que el módulo funciona correctamente. 
 
 
5.2.- Simulación temporal del controlador de las memorias dual port. (0.5 puntos) 
 
En este punto se llevará a cabo la simulación temporal del controlador de las memorias dual port. En 
la memoria de la práctica se deberá añadir los siguientes puntos: 
 
(*)5.2.1.- Tabla donde se incluyan los recursos utilizados para la implementación (ver tabla 2). 
(*)5.2.2.- Pantallazo de simulación donde se refleje que el módulo de representación funciona 
correctamente. 
 
 
 
Apartado 6. Implementación del generador de la dirección de las memorias dual port (0.75 
puntos) 
 
En este apartado el alumno deberá especificar un módulo VHDL que implemente la entidad gen_dir. 
Este apartado se estructura en los siguientes subapartados. 
 
 
 
 
 
 23 
 
6.1.- Simulación funcional del generador de la dirección de las memorias dual port . (0.5 punto) 
 
En este apartado se deberá realizar la simulación funcional para comprobar que el mencionado 
módulo funciona correctamente de forma individual. En el banco de pruebas utilizado deberá utilizar 
el procedimiento (procedure) utilizado en la simulación del controlador de la memoria dual port. 
 
En la memoria de la práctica se deberá añadir los siguientes datos: 
 
(*)6.1.1.- Código VHDL del módulo y del banco de pruebas utilizado en la simulación. 
(*)6.1.2- Razonamiento de por qué se ha adoptado la solución presentada. 
(*)6.1.3.- Pantallazo de simulación donde se refleje que el mencionado circuito funciona 
correctamente. Para ello en el banco de pruebas deberá incluir los estímulos necesarios para 
comprobar que el módulo funciona correctamente. 
 
 
6.2.- Simulación temporal del generador de la dirección de las memorias dual port . (0.25 puntos) 
 
En este punto se llevará a cabo la simulación temporal del generador de la dirección de las memorias 
dual port. En la memoria de la práctica se deberá añadir los siguientes puntos: 
 
(*)6.2.1.- Tabla donde se incluyan los recursos utilizados para la implementación (ver tabla 2). 
(*)6.2.2.- Pantallazo de simulación donde se refleje que el módulo de representación funciona 
correctamente. 
 
 
Apartado 7. Implementación del diseño completo (2.5 puntos) 
 
En este apartado el alumno deberá especificar el módulo VHDL que implemente el diseño completo 
de esta práctica (entidad gen_funciones). 
 
Este apartado se estructura en los siguientes subapartados. 
 
7.1.- Simulación funcional de la entidad gen_funciones. (1 punto) 
 
En este apartado se deberá realizar la simulación funcional para comprobar que el diseño final 
funciona correctamente. Para esta simulación se proporcionan sendos archivos de datos Vo1.dat y 
Vo2.dat que contienen un periodo completo de dos señales en formato hexadecimal de 4 dígitos. 
Estos archivos deberán ser leídos por el módulo de simulación del puerto EPP (entidad epp_device1) 
para ser almacenados en la memoria dual port. La entidad epp_device1 se debe crear a partir de la 
entidad cnt_epp. 
 
En la memoria de la práctica se deberá añadir los siguientes datos: 
 
(*)7.1.1.- Código VHDL del banco de pruebas utilizado para su simulación. La entidad gen_funciones 
se proporciona con el enunciado. 
 (*)7.1.2.- Pantallazo de simulación donde se refleje que el mencionado circuito funciona 
correctamente. Para ello en el banco de pruebas deberá incluir los estímulos necesarios para 
comprobar que el módulo funciona correctamente. 
 
 
 
 
 
 
 24 
 
7.2.- Simulación temporal de la entidad gen_funciones. (0.5 puntos) 
 
En este punto se llevará a cabo la simulación temporal de todo el diseño. En la memoria de la 
práctica se deberá añadir los siguientes

Continuar navegando