Sei sulla pagina 1di 20

DEPARTAMENTO DE ELÉCTRICA Y ELECTRÓNICA

CARRERA DE INGENIERÍA EN ELECTRÓNICA Y TELECOMUNICACIONES

Diseño VLSI

NRC: 8417

Laboratorio,

SEGUNDO PARCIAL

IP-Cores Picoblaze

PROFESOR: ING. PABLO FRANCISCO RAMOS VARGAS

INTEGRANTES:
JONATHAN CHASI
JOSE GUTIERREZ

MAYO-2020
1. TEMA: - IP-Cores Picoblaze.

2. OBJETIVOS:
 Solucionar el problema planteado mediante lenguaje VHDL y Assembler.
 Compilar los archivos .psm generados en la solución de los ejercicios en
una máquina virtual de 32 bits.
 Investigar el funcionamiento de la máquina virtual y evitar los inconvenientes
que esta genera.
3. Problemas.
3.1. Escribir un programa en assembler que realice 4 secuencias de luces
seleccionables con 2 bits de entrada.
Las secuencias son:
a) Rotación a la derecha
b) Rotación a la izquierda
c) Encendido extremos centro
d) Encendido centro – extremos

Diseño Assembler.
ADDRESS 000

main:
input s0, 01;

COMPARE s0,00
jump Z,derecha

COMPARE s0,01
jump Z,izquierda

COMPARE s0,02
jump Z,extremos

COMPARE s0,03
jump Z,centros

derecha:
load s2,80
OUTPUT s2,04 ; write to leds
SR0 s2 ; rotate to left => 10000000
OUTPUT s2,04 ; write to leds
SR0 s2 ; rotate to left => 01000000
OUTPUT s2,04 ; write to leds
SR0 s2 ; rotate to left => 00100000
OUTPUT s2,04 ; write to leds
SR0 s2 ; rotate to left => 00010000
OUTPUT s2,04 ; write to leds
SR0 s2 ; rotate to left => 00001000
OUTPUT s2,04 ; write to leds
SR0 s2 ; rotate to left => 00000100
OUTPUT s2,04 ; write to leds
SR0 s2 ; rotate to left => 00000010
OUTPUT s2,04 ; write to leds
jump main

izquierda:
load s2,01
OUTPUT s2,04 ; write to leds
SL0 s2 ; contrario X10000000
OUTPUT s2,04 ; write to leds
SL0 s2 ; rotate to left => 01000000
OUTPUT s2,04 ; write to leds
SL0 s2 ; rotate to left => 00100000
OUTPUT s2,04 ; write to leds
SL0 s2 ; rotate to left => 00010000
OUTPUT s2,04 ; write to leds
SL0 s2 ; rotate to left => 00001000
OUTPUT s2,04 ; write to leds
SL0 s2 ; rotate to left => 00000100
OUTPUT s2,04 ; write to leds
SL0 s2 ; rotate to left => 00000010
OUTPUT s2,04 ; write to leds
jump main

extremos:
load s2,81 ;10000001
OUTPUT s2,04 ; write to leds
load s2,42 ;01000010
OUTPUT s2,04
load s2,24 ;00100100
OUTPUT s2,04
load s2,18 ;00011000
OUTPUT s2,04
jump main

centros:
load s2,18 ;00011000
OUTPUT s2,04
load s2,24 ;00100100
OUTPUT s2,04
load s2,42 ;01000010
OUTPUT s2,04
load s2,81 ;10000001
OUTPUT s2,04
jump main

Codigo VHDL TopModule.


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 in this code.
library UNISIM;
use UNISIM.VComponents.all;

entity TopModule is
Port ( --RESET : in STD_LOGIC;
clk: in STD_LOGIC;--Reloj para el funcionamiento
INT : in STD_LOGIC;
LED : out STD_LOGIC_VECTOR (7 downto 0);--salida para el
movimiento de las luces
selec_luz : in STD_LOGIC_VECTOR (7 downto 0)--seleccionar la
secuencia de las luces
);
end TopModule;

architecture Behavioral of TopModule is

component embedded_kcpsm3
Port ( port_id : out std_logic_vector(7 downto 0);
write_strobe : out std_logic;
read_strobe : out std_logic;
out_port : out std_logic_vector(7 downto 0);
in_port : in std_logic_vector(7 downto 0);
interrupt : in std_logic;
interrupt_ack : out std_logic;
reset : in std_logic;
clk : in std_logic);
end component;

signal wr_stb : std_logic;


signal rd_stb : std_logic;
signal port_id : std_logic_vector(7 downto 0);
signal out_port: std_logic_vector(7 downto 0);
signal in_port : std_logic_vector(7 downto 0);
signal mem_addr : std_logic_vector(7 downto 0);
signal data_to_memory : std_logic_vector(7 downto 0);
signal data_from_memory : std_logic_vector(7 downto 0);
signal wr_en : std_logic;
signal mem_en : std_logic;
signal in_proc : std_logic_vector(7 downto 0);
signal out_proc : std_logic_vector(7 downto 0);
signal aux_led : std_logic_vector(7 downto 0);
begin

-- instantiation
Processor: embedded_kcpsm3
port map(
port_id => port_id,
write_strobe => wr_stb,
read_strobe => rd_stb,
out_port => out_port,
in_port => in_port,
interrupt => INT,
reset => '0',
clk => clk
);

input_ports: process (port_id)


begin
case port_id is
when "00000001" => in_port <= selec_luz;--ingresamos el valor del
puerto 1 en la variable selec_luz
when others => in_port <= "XXXXXXXX";
end case;
end process input_ports;

output_ports: process(port_id)
begin
case port_id is
when "00000100" => LED <= out_port;--colocar la respuesta del
puerto 3 en la variable LED
-- out_proc <= "XXXXXXXX";
when others => aux_led <= "XXXXXXXX";
--
end case;
end process output_ports;
end Behavioral;

Análisis.- En el codigo principal TopModule lo unico que se debe cambiar son las nuevas
entradas y salidas de la entidad, los puertos de entrada y salida que se van a usar para ingresar
los datos, en este caso se usan 2 puertos diferentes, el puerto 1 para leer la secuencias a
realizar y el puerto 4 para la salida del resultado, en este caso seran los leds, estos puertos se
pueden verificar en el codigo del Diseño Assembler.

Codigo del Test bench


LIBRARY ieee;
USE ieee.std_logic_1164.ALL;

-- Uncomment the following library declaration if using


-- arithmetic functions with Signed or Unsigned values
--USE ieee.numeric_std.ALL;

ENTITY Test_Bench_LEDS IS
END Test_Bench_LEDS;

ARCHITECTURE behavior OF Test_Bench_LEDS IS

COMPONENT TopModule
PORT(
--Colocar las variables de la entidad del TopModule
clk : IN std_logic;
INT : IN std_logic;
LED : OUT std_logic_vector(7 downto 0);
selec_luz : IN std_logic_vector(7 downto 0)
);
END COMPONENT;

--Inputs
--Inicializamos las variables
signal clk : std_logic := '0';
signal INT : std_logic := '0';
signal selec_luz : std_logic_vector(7 downto 0) := (others => '0');

--Outputs
signal LED : std_logic_vector(7 downto 0);

-- Clock period definitions


constant clk_period : time := 10 ns;

BEGIN

-- Instantiate the Unit Under Test (UUT)


uut: TopModule PORT MAP (
clk => clk,
INT => INT,
LED => LED,
selec_luz => selec_luz
);

--Proceso para la generacion del reloj


clk_process :process
begin
clk <= '0';
wait for clk_period/2;
clk <= '1';
wait for clk_period/2;
end process;
-- Stimulus process
stim_proc: process
begin
-- Generamos el reloj de 1ns
wait for 1 ns;

wait for clk_period*10;


wait;
end process;
--Proceso para cambiar la secuencia que tendran las luces
process
begin
selec_luz<="00000000";
wait for 400 ns;--Tiempo para cambiar la secuencia
selec_luz<="00000001";
wait for 400 ns;--Tiempo para cambiar la secuencia
selec_luz<="00000010";
wait for 300 ns;--Tiempo para cambiar la secuencia
selec_luz<="00000011";
wait for 400 ns;--Tiempo para cambiar la secuencia
selec_luz<="00000000";
wait; -- simulation stops here
end process;
END;

Análisis.- El TestBench se lo genera automaticamente del TopModule en el software, los


unicos cambios a realizar son en el process del reloj el cual lo cambiamos a 1ns y se genero
un nuevo proces para dar diferentes valores a la variable selec_luz, de tal forma que la
secuencia de las luces pueda variar en las 4 opciones que se planteo en el ejercicio.
Diagrama RTL principal.

Figura 1.Diagrama RTL

Simulacion Luces:

Figura 2. Secuencia de luces a la derecha.

En la siguiente simulación podemos observar la secuencia de las luces a la derecha que se


genera en la variable Led, este va variando en toda la longitud de 8 bits, cuando el valor de
selec_luz vale ‘0’.
Figura 3. Secuencia de luces a la izquierda.

En la siguiente simulación podemos observar la secuencia de las luces a la izquierda que se


genera en la variable Led, este va variando en toda la longitud de 8 bits, cuando el valor de
selec_luz vale ‘1’.

Figura 4. Secuencia de luces de extremo a centro.

En la siguiente simulación podemos observar la secuencia de las luces desde los extremos
hacia el centro, que se genera en la variable Led, este va variando en toda la longitud de 8
bits, cuando el valor de selec_luz vale ‘2’.
Figura 5. Secuencia de luces de centro a extremo.

En la siguiente simulación podemos observar la secuencia de las luces desde el centro hacia
los extremos, que se genera en la variable Led, este va variando en toda la longitud de 8 bits,
cuando el valor de selec_luz vale ‘3’.
3.2. Escribir un programa en assembler que realice una calculadora de cuatro
operaciones (suma, resta, multiplicación y división) con dos operandos de 4 bits
que se ingresan por los puertos 1 y 2 respectivamente. El tipo de operación se
selecciona en el puerto 3. El resultado de la operación se expresa en 8 bits en el
puerto de salida 4. El complemento a 2 del resultado se obtiene en el puerto de
salida 5.
Diseño Assembler.
ADDRESS 000

main:
input s0, 01;
input s1, 02;
input s2, 03;
LOAD s7,s0
LOAD s8,00

COMPARE s2,00
jump Z,Suma

COMPARE s2,01
jump Z,Resta

COMPARE s2,02
jump Z,Multiplicacion
COMPARE s2,03
jump Z,Division

Suma:
ADD s0,s1
OUTPUT s0,04
XOR s0,FF
ADD s0,01
OUTPUT s0,05
jump main

Resta:
SUB s0,s1 ;s0 mayor
OUTPUT s0,04
XOR s0,FF
ADD s0,01
OUTPUT s0,05
jump main

Multiplicacion:
COMPARE s1,01
jump NZ,mtp
OUTPUT s0,04
XOR s0,FF
ADD s0,01
OUTPUT s0,05
jump main
mtp:
SUB s1,01;
ADD s0,s7
jump Multiplicacion

Division:
SUB s0,s1 ;S0 mayor
jump NC,dvs ;
OUTPUT s8,04
XOR s8,FF
ADD s8,01
OUTPUT s8,05
jump main
dvs:
ADD s8,01
jump Division

Código VHDL TopModule.


----------------------------------------------------------------------------------
-- Company:
-- Engineer:
--
-- Create Date: 13:42:06 06/10/2011
-- Design Name:
-- Module Name: TopModule - Behavioral
-- Project Name:
-- Target Devices:
-- Tool versions:
-- Description:
--
-- Dependencies:
--
-- Revision:
-- Revision 0.01 - File Created
-- Additional Comments:
--
----------------------------------------------------------------------------------
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 in this code.
library UNISIM;
use UNISIM.VComponents.all;

entity TopModule is
Port ( --RESET : in STD_LOGIC;
clk : in STD_LOGIC; --Clk para el funcionamiento
INT : in STD_LOGIC;
respuesta : out STD_LOGIC_VECTOR (7 downto 0);--Respuesta de
la operacion
r_complemento : out STD_LOGIC_VECTOR (7 downto
0);--Complemento de la respuesta
numero1 : in STD_LOGIC_VECTOR (7 downto 0);--
numero 1 para la operacion
numero2 : in STD_LOGIC_VECTOR (7 downto 0);--
numero 2 para la operacion
operacion : in STD_LOGIC_VECTOR (7 downto 0)--tipo d
operacion se consiera los 2 ultimos bits
);
end TopModule;

architecture Behavioral of TopModule is

component embedded_kcpsm3
Port ( port_id : out std_logic_vector(7 downto 0);
write_strobe : out std_logic;
read_strobe : out std_logic;
out_port : out std_logic_vector(7 downto 0);
in_port : in std_logic_vector(7 downto 0);
interrupt : in std_logic;
interrupt_ack : out std_logic;
reset : in std_logic;
clk : in std_logic);
end component;

signal wr_stb : std_logic;


signal rd_stb : std_logic;
signal port_id : std_logic_vector(7 downto 0);
signal out_port: std_logic_vector(7 downto 0);
signal in_port : std_logic_vector(7 downto 0);
signal mem_addr : std_logic_vector(7 downto 0);
signal data_to_memory : std_logic_vector(7 downto 0);
signal data_from_memory : std_logic_vector(7 downto 0);
signal wr_en : std_logic;
signal mem_en : std_logic;
signal in_proc : std_logic_vector(7 downto 0);
signal out_proc : std_logic_vector(7 downto 0);
signal aux_res : std_logic_vector(7 downto 0);
signal aux_com: std_logic_vector(7 downto 0);

begin

-- instantiation
Processor: embedded_kcpsm3
port map(
port_id => port_id,
write_strobe => wr_stb,
read_strobe => rd_stb,
out_port => out_port,
in_port => in_port,
interrupt => INT,
reset => '0',
clk => clk
);
input_ports: process (port_id)
begin
case port_id is
when "00000001" => in_port <= numero1;--Ingresamos el numero1
por el registro 1
when "00000010" => in_port <= numero2;--Ingresamos el numero2
por el registro 2
when "00000011" => in_port <= operacion;--Ingresamos la
operacion por el registro 3
when others => in_port <= "XXXXXXXX";
end case;
end process input_ports;

output_ports: process(port_id)
begin
if(port_id="00000100" )then
respuesta <= out_port;--colocar la respuesta del registro 4 en la variable
respuesta
elsif(port_id="00000101" )then
r_complemento <= out_port;--colocar la respuesta del registro 5 en la
variable r_complemento
else
aux_res <= "XXXXXXXX";
end if;
end process output_ports;

end Behavioral;

Análisis.- En el codigo principal TopModule lo unico que se debe cambiar son las nuevas
entradas y salidas de la entidad, los puertos de entrada y salida que se van a usar para ingresar
los datos, en este caso se usarán los puertos 1 y 2 para el ingreso del primer y segundo
número, el puerto 3 para ingresar el tipo de operación, el puerto 4 para mostrar el resultado
y el puerto 5 para obener el complemento a 2 del resultado, estos puertos se pueden verificar
en el codigo del Diseño Assembler.
Código Test Bench.
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;

-- Uncomment the following library declaration if using


-- arithmetic functions with Signed or Unsigned values
--USE ieee.numeric_std.ALL;

ENTITY Test_Bench IS
END Test_Bench;

ARCHITECTURE behavior OF Test_Bench IS

-- Component Declaration for the Unit Under Test (UUT)

COMPONENT TopModule
PORT(
-- Colocar todas las variable de la entidad del TopMoudle
clk : IN std_logic;
INT : IN std_logic;
respuesta : OUT std_logic_vector(7 downto 0);
r_complemento : OUT std_logic_vector(7 downto 0);
numero1 : IN std_logic_vector(7 downto 0);
numero2 : IN std_logic_vector(7 downto 0);
operacion : IN std_logic_vector(7 downto 0)
);
END COMPONENT;
--Inputs
--Inicializo las variables de la entidad
signal clk : std_logic := '0';
signal INT : std_logic := '0';
signal numero1 : std_logic_vector(7 downto 0) := (others => '0');
signal numero2 : std_logic_vector(7 downto 0) := (others => '0');
signal operacion : std_logic_vector(7 downto 0) := (others => '0');
--Outputs
signal respuesta : std_logic_vector(7 downto 0);
signal r_complemento : std_logic_vector(7 downto 0);

-- Clock period definitions


constant clk_period : time := 10 ns;

BEGIN
-- Instantiate the Unit Under Test (UUT)
uut: TopModule PORT MAP (
clk => clk,
INT => INT,
respuesta => respuesta,
r_complemento => r_complemento,
numero1 => numero1,
numero2 => numero2,
operacion => operacion
);
-- Clock process definitions
--Generar el reloj para la simulacion
clk_process :process
begin
clk <= '0';
wait for clk_period/2;
clk <= '1';
wait for clk_period/2;
end process;

-- Stimulus process
stim_proc: process
begin
-- hold reset state for 1 ns.
--Genero el reloj de 1 ns
wait for 1 ns;
wait for clk_period*10;
-- insert stimulus here
wait;
end process;
--Proceso para dar valor a los numero y la operacion
process
begin
numero1 <= "00001100";
numero2 <= "00000010";
operacion <= "00000000";
wait for 400 ns;--Tiempo despues para cambiar la operacion
operacion <="00000001";
wait for 600 ns;--Tiempo despues para cambiar la operacion
operacion <="00000010";
wait for 800 ns;--Tiempo despues para cambiar la operacion
operacion <="00000011";
wait; -- simulation stops here
end process;
END;

Análisis.- El TestBench se lo genera automaticamente del TopModule en el software, los


unicos cambios a realizar son en el process del reloj el cual lo cambiamos a 1ns y se genero
un nuevo process para dar diferentes valores a las variales, en este caso para realizar las
operaciones se uso los mismo numeros (numero1=12, numero2=2), pero las operaciones
cambian en tiempos distintos, calculando el tiempo que demora la memoria en realizar una
operación.
Diagrama RTL principal.

Figura 6. Diagrama RTL


Simulacion Operaciones:
Suma:

Figura 7. Suma.

En la simulación podemos observar el valor de la variable numero1 y numero2, la variable


operación que nos indicara el tipo de operación que se va a realizar en este caso la suma con
el valor de ‘0’, en la variable respuesta el resultado en este caso ‘14’ y por último en
r_complemente indicara el valor de la respuesta en complemento a 2.

Resta:

Figura 8. Resta.
En la simulación podemos observar el valor de la variable numero1 y numero2, la variable
operación que nos indicara el tipo de operación que se va a realizar en este caso la resta con
el valor de ‘1’, en la variable respuesta el resultado en este caso ‘12’ y por último en
r_complemente indicara el valor de la respuesta en complemento a 2.
Multiplicación:

Figura 8. Multiplicación.

En la simulación podemos observar el valor de la variable numero1 y numero2, la variable


operación que nos indicara el tipo de operación que se va a realizar en este caso la resta con
el valor de ‘2’, en la variable respuesta el resultado en este caso ‘24’ y por último en
r_complemente indicara el valor de la respuesta en complemento a 2.
División:

Figura 8. División.

En la simulación podemos observar el valor de la variable numero1 y numero2, la variable


operación que nos indicara el tipo de operación que se va a realizar en este caso la resta con
el valor de ‘3’, en la variable respuesta el resultado en este caso ‘6’ y por último en
r_complemente indicara el valor de la respuesta en complemento a 2.
4. Conclusiones.
 Los ejercicios en lenguaje Assembler se solucionaron leyendo el manual
KCPSM3_Manual, usando las instrucciones y banderas correctamente.
 En la configuración de la máquina virtual se debe colocar que use 2GB de memoria
RAM como mínimo de la PC para que funcione correctamente.
5. Recomendaciones.
 Siempre se debe verificar los puertos a usar en el programa Assembler ya que suelen
confundirse con los registros, si no se comprende correctamente el esquema del
KCPSM3.
 Se recomienda usar una computadora de 8GB de RAM como mínimo puesto que la
máquina virtual consume 2GB, al ser menos la memoria del dispositivo este se vuelve
demasiado lento y no permite realizar otras operaciones en la PC.
 Se puede crear un TestBench automáticamente en el software Xilinx de esta forma
facilita la simulación, como se explicó en los códigos del TestBench.
6. Bibliografía.
 Muñoz, D. (2015). Picoblaze parte2. Recuperado 2020, de
https://www.youtube.com/watch?v=G4w2BqStTaQ&t=423s
 Chapman, K. (2003). KCPSM3 Manual. En KCPSM3 Manual (Vol. Rev7, pp. 1-
75). Recuperado de:
https://www.xilinx.com/support/documentation/ip_documentation/ug129.pdf
7. Anexos.

Potrebbero piacerti anche