Ejemplo Uso de Procesador Picoblaze

Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 11

USO DE PROCESADOR PICOBLAZE

Descripción: Implementar un contador BCD de un dígito que se visualice en un display de la FPGA


BASYS 3, el sistema debe tener un botón de reinicio.

IMPLEMENTACIÓN PROGRAMA EN PICOBLAZE KCPSM6

1. Copie el siguiente código dentro de un archivo con extensión .psm llamado prog_rom.psm
y asegúrese de guardar.

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Elaborado por: ING. Omar Parra
; Asignatura: SDI2
; Descripcion: Este programa implementa un contador BCD
; de un digito con reset
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;Puertos
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
CONSTANT BTN, 00
CONSTANT SEG, 01
CONSTANT AN, 02
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;Constantes
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Codigo 7-segmentos {dp,g,f,e,d,c,b,a}
CONSTANT DIG_0, C0
CONSTANT DIG_1, F9
CONSTANT DIG_2, A4
CONSTANT DIG_3, B0
CONSTANT DIG_4, 99
CONSTANT DIG_5, 92
CONSTANT DIG_6, 82
CONSTANT DIG_7, F8
CONSTANT DIG_8, 80
CONSTANT DIG_9, 90
CONSTANT DIG_A, 88
CONSTANT DIG_B, 83
CONSTANT DIG_C, C6
CONSTANT DIG_D, E0
CONSTANT DIG_E, 86
CONSTANT DIG_F, 8E

ADDRESS 000

INICIALIZACION:
LOAD s0, DIG_0
STORE s0, 00 ; STORE in RAM[0]
LOAD s0, DIG_1
STORE s0, 01 ; STORE in RAM[1]
LOAD s0, DIG_2
STORE s0, 02 ; STORE in RAM[2]
LOAD s0, DIG_3
STORE s0, 03 ; STORE in RAM[3]
LOAD s0, DIG_4
STORE s0, 04 ; STORE in RAM[4]
LOAD s0, DIG_5
STORE s0, 05 ; STORE in RAM[5]
LOAD s0, DIG_6
STORE s0, 06 ; STORE in RAM[6]
LOAD s0, DIG_7
STORE s0, 07 ; STORE in RAM[7]
LOAD s0, DIG_8
STORE s0, 08 ; STORE in RAM[8]
LOAD s0, DIG_9
STORE s0, 09 ; STORE in RAM[9]
LOAD s0, DIG_A
STORE s0, 0A ; STORE in RAM[A]
LOAD s0, DIG_B
STORE s0, 0B ; STORE in RAM[B]
LOAD s0, DIG_C
STORE s0, 0C ; STORE in RAM[C]
LOAD s0, DIG_D
STORE s0, 0D ; STORE in RAM[D]
LOAD s0, DIG_E
STORE s0, 0E ; STORE in RAM[E]
LOAD s0, DIG_F
STORE s0, 0F ; STORE in RAM[F]

LOAD s1, FE
OUTPUT s1, AN ; Encender anodo 0

INICIO:
LOAD s0, 00 ; Inicializar contador

MOSTRAR:
LOAD sF, s0 ; Cargar valor de s0 en sF
FETCH sF, (sF) ; Consultar en tabla de busqueda el codigo 7seg
OUTPUT sF, SEG ; Escribir al puerto correspondiente a los segmentos
INPUT s1, BTN ; Leer puerto de boton de reset
TEST s1, 01 ; Verificar el valor del boton
JUMP C, INICIO
CALL wait ; Retardo para evidenciar el conteo
JUMP SUMAR

SUMAR:
ADD s0, 01 ; Incremento
COMPARE s0, 0A ; Comparar valor del contador
JUMP Z, INICIO
JUMP MOSTRAR

wait:
LOAD s8, 7D
loop:
CALL wait_1_ms
SUB s8, 01
JUMP NZ, loop
RETURN

wait_1_ms:
LOAD sA, FF
OuterLoop:
LOAD s9, FF
InnerLoop:
SUB s9, 01
JUMP nz, InnerLoop
SUB sA, 01
JUMP nz, OuterLoop
RETURN

2. Importe el archivo dentro de la herramienta pBlaze IDE. Para realizar la simulación de los
puertos de entrada y salida dentro de la herramienta es necesario usar la directiva DSIN
para definir un puerto de entrada y DSOUT para definir un puerto de salida. Reemplace la
definición de puertos de la siguiente manera

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Puertos
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
BTN DSIN 0
SEG DSOUT 1
AN DSOUT 2

3. Al presionar el botón F12, aparecerán los puertos con los que puede interactuar en la parte
superior derecha, tal como se muestra en la figura. Realice la simulación y verifique el
funcionamiento
4. Si la simulación funciona adecuadamente es momento de embeber el procesador KCPSM6
dentro de la FPGA BASYS 3; para esto cree un proyecto RTL nuevo en vivado con el nombre
“pBlaze_BCD” y agregue una fuente con el nombre Main.

5. Asegúrese de seleccionar la tarjera BASYS 3

6. Copie dentro del archivo Main el siguiente código donde se define y se instancia el módulo
del KCPSM6, así como la memoria de programa y se realizan las conexiones al puerto de
entrada y al puerto de salida.
BTN 01 AN
00
02 SEG

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;

-- Uncomment the following library declaration if instantiating


-- any Xilinx leaf cells in this code.
--library UNISIM;
--use UNISIM.VComponents.all;

entity Main is
Port ( CLK : in std_logic;
Reset : in std_logic;
seg : out std_logic_vector(7 downto 0);
an : out std_logic_vector(3 downto 0)
);
end Main;

architecture Behavioral of Main is


component kcpsm6 --Declaracion del componente KCPSM6.
generic( hwbuild : std_logic_vector(7 downto 0) := X"00";
interrupt_vector : std_logic_vector(11 downto 0) := X"3FF";
scratch_pad_memory_size : integer := 64);
port( address : out std_logic_vector(11 downto 0);
instruction : in std_logic_vector(17 downto 0);
bram_enable : out std_logic;
in_port : in std_logic_vector(7 downto 0);
out_port : out std_logic_vector(7 downto 0);
port_id : out std_logic_vector(7 downto 0);
write_strobe : out std_logic;
k_write_strobe : out std_logic;
read_strobe : out std_logic;
interrupt : in std_logic;
interrupt_ack : out std_logic;
sleep : in std_logic;
reset : in std_logic;
clk : in std_logic);
end component;

component prog_rom --Declaración del componente


generic( C_FAMILY : string := "S6"; --de la memoria de programa.
C_RAM_SIZE_KWORDS : integer := 1; --El nombre debe coincidir con
C_JTAG_LOADER_ENABLE : integer := 0); --el nombre de archivo PSM.
Port( address : in std_logic_vector(11 downto 0);
instruction : out std_logic_vector(17 downto 0);
enable : in std_logic;
rdl : out std_logic;
clk : in std_logic);
end component;

signal address : std_logic_vector(11 downto 0); --Señales para conectar


signal instruction : std_logic_vector(17 downto 0); --el componente KCPSM6
signal bram_enable : std_logic; --y la memoria de programa.
signal in_port : std_logic_vector(7 downto 0);
signal out_port : std_logic_vector(7 downto 0);
signal port_id : std_logic_vector(7 downto 0);
signal write_strobe : std_logic;
signal k_write_strobe : std_logic;
signal read_strobe : std_logic;
signal interrupt : std_logic;
signal interrupt_ack : std_logic;
signal kcpsm6_sleep : std_logic;
signal kcpsm6_reset : std_logic;
signal rdl : std_logic;

signal sBTN: std_logic_vector(7 downto 0):= (others=>'0'); --Señales para conectar


signal sAN: std_logic_vector(7 downto 0):= (others=>'0'); --entradas y salidas
signal sSEG: std_logic_vector(7 downto 0):= (others=>'0'); --del kcpsm6

begin

processor: kcpsm6 --Instanciación del módulo KCPSM6


generic map(hwbuild => X"00",
interrupt_vector => X"3FF", --Vector de interrupción
scratch_pad_memory_size => 64) --64, 128 o 256 bytes
port map(address => address,
instruction => instruction,
bram_enable => bram_enable,
port_id => port_id,
write_strobe => write_strobe,
k_write_strobe => k_write_strobe,
out_port => out_port,
read_strobe => read_strobe,
in_port => in_port,
interrupt => interrupt,
interrupt_ack => interrupt_ack,
sleep => kcpsm6_sleep,
reset => kcpsm6_reset,
clk => clk
);
kcpsm6_sleep <= '0';
interrupt <= interrupt_ack;

program_rom: prog_rom --Instancia del módulo de memoria de programa


generic map(C_FAMILY => "7S", --Familia 'S6', 'V6' or '7S'.
C_RAM_SIZE_KWORDS => 2, --Program size '1', '2' or '4'.
C_JTAG_LOADER_ENABLE => 1) --Include JTAG Loader when set to '1'.
port map(address => address, --Para Sparan-6 use 'S6', '1' y '1'.
instruction => instruction, --Para Virtex-6 use 'V6', '2' y '1'.
enable => bram_enable, --Para Artix-7, Kintex-7 o Virtex-7
rdl => rdl, --use '7S', '2' y '1'.
clk => clk
);

kcpsm6_reset <= rdl;

sBTN(0) <= Reset; -- Asignación del reset del contador en la posición 0 del vector BTN

input_ports: process(clk) --Proceso que incluye la lógica de multiplexado y


begin --registro relacionada con los puertos de entrada
if (rising_edge(clk)) then
case port_id is
when x"00" => --Leer puerto en la direccion 00h
in_port <= sBTN;
when others =>
in_port <= "XXXXXXXX";
end case;
end if;
end process;

AN <= sAN(3 downto 0); --Asignación de ánodos al vector AN


SEG <= sSEG; --Asignación de segmentos al vector SEG

output_ports: process(clk) --Proceso relacionado con los puertos de salida.


begin --La carga de los puertos de salida (resgistros)
if (rising_edge(clk)) then --es habilitada con la señal 'write_strobe'
if (write_strobe = '1') then
if port_id = x"01" then --Escribe el registro sSEG cuando la dirección
sSEG <= out_port; --del puerto es 01h. 00000001
end if;
if port_id = x"02" then --Escribe el registro sAN cuando la dirección
sAN <= out_port; --del puerto es 02h. 00000010
end if;
end if;
end if;
end process;

end Behavioral;

7. Descargue la carpeta “KCPSM6_Release9_30Sept14” de moodle, descomprímala y copie los


archivos “kcpsm6”, “kcpsm6.vhd” y “rom_form.vhd” dentro de la carpeta del proyecto
“pBlaze_BCD\pBlaze_BCD.srcs\sources_1\new” como se indica en las figuras. Copie
adicionalmente en esta carpeta el archivo prog_rom donde se encuentra el código en
assembler.

8. Ejecute la aplicación kcpsm6 y escriba el nombre del archivo .psm y presione enter. En este
caso escriba prog_rom. Si el código no contiene errores de sintaxis, la aplicación generará
el archivo de memoria de programa que se usará en vivado para implementar el programa
que se especificó. Si hay errores la herramienta lo indicará y se deberán corregir dichos
errores.
9. Si verifica el directorio “pBlaze_BCD\pBlaze_BCD.srcs\sources_1\new” se podrá observar
que se han generado archivos adicionales, dentro de estos el archivo “prog_rom.vhd” que
es la memoria de programa que se usará en vivado.

10. Guarde el proyecto y verifique que en la jerarquía se encuentren el modulo KCPSM6 y el


módulo prog_rom. En caso de que no aparezcan agregue las fuentes manualmente.
11. Cree un archivo constrain y copie lo siguiente. Posteriormente genere el Bitstream y
programe la FPGA.

# Clock signal
set_property PACKAGE_PIN W5 [get_ports CLK]
set_property IOSTANDARD LVCMOS33 [get_ports CLK]
# create_clock -add -name sys_clk_pin -period 10.00 -waveform {0 5} [get_ports
CLK100MHZ]

# Switches
#set_property PACKAGE_PIN V17 [get_ports {sw[0]}]
# set_property IOSTANDARD LVCMOS33 [get_ports {sw[0]}]
#set_property PACKAGE_PIN V16 [get_ports {sw[1]}]
# set_property IOSTANDARD LVCMOS33 [get_ports {sw[1]}]
#set_property PACKAGE_PIN W16 [get_ports {sw[2]}]
#set_property IOSTANDARD LVCMOS33 [get_ports {sw[2]}]
#set_property PACKAGE_PIN W17 [get_ports {sw[3]}]
#set_property IOSTANDARD LVCMOS33 [get_ports {sw[3]}]
#set_property PACKAGE_PIN W15 [get_ports {sw[4]}]
#set_property IOSTANDARD LVCMOS33 [get_ports {sw[4]}]
#set_property PACKAGE_PIN V15 [get_ports {sw[5]}]
#set_property IOSTANDARD LVCMOS33 [get_ports {sw[5]}]
#set_property PACKAGE_PIN W14 [get_ports {sw[6]}]
#set_property IOSTANDARD LVCMOS33 [get_ports {sw[6]}]
#set_property PACKAGE_PIN W13 [get_ports {sw[7]}]
#set_property IOSTANDARD LVCMOS33 [get_ports {sw[7]}]
#set_property PACKAGE_PIN V2 [get_ports {sw[8]}]
#set_property IOSTANDARD LVCMOS33 [get_ports {sw[8]}]
#set_property PACKAGE_PIN T3 [get_ports {sw[9]}]
#set_property IOSTANDARD LVCMOS33 [get_ports {sw[9]}]
#set_property PACKAGE_PIN T2 [get_ports {sw[10]}]
#set_property IOSTANDARD LVCMOS33 [get_ports {sw[10]}]
#set_property PACKAGE_PIN R3 [get_ports {sw[11]}]
#set_property IOSTANDARD LVCMOS33 [get_ports {sw[11]}]
#set_property PACKAGE_PIN W2 [get_ports {sw[12]}]
#set_property IOSTANDARD LVCMOS33 [get_ports {sw[12]}]
#set_property PACKAGE_PIN U1 [get_ports {sw[13]}]
#set_property IOSTANDARD LVCMOS33 [get_ports {sw[13]}]
#set_property PACKAGE_PIN T1 [get_ports {sw[14]}]
#set_property IOSTANDARD LVCMOS33 [get_ports {sw[14]}]
#set_property PACKAGE_PIN R2 [get_ports {sw[15]}]
#set_property IOSTANDARD LVCMOS33 [get_ports {sw[15]}]
# LEDs
#set_property PACKAGE_PIN U16 [get_ports {LED[0]}]
# set_property IOSTANDARD LVCMOS33 [get_ports {LED[0]}]
#set_property PACKAGE_PIN E19 [get_ports {LED[1]}]
# set_property IOSTANDARD LVCMOS33 [get_ports {LED[1]}]
#set_property PACKAGE_PIN U19 [get_ports {LED[2]}]
# set_property IOSTANDARD LVCMOS33 [get_ports {LED[2]}]
#set_property PACKAGE_PIN V19 [get_ports {LED[3]}]
# set_property IOSTANDARD LVCMOS33 [get_ports {LED[3]}]
#set_property PACKAGE_PIN W18 [get_ports {LED[4]}]
# set_property IOSTANDARD LVCMOS33 [get_ports {LED[4]}]
#set_property PACKAGE_PIN U15 [get_ports {LED[5]}]
# set_property IOSTANDARD LVCMOS33 [get_ports {LED[5]}]
#set_property PACKAGE_PIN U14 [get_ports {LED[6]}]
# set_property IOSTANDARD LVCMOS33 [get_ports {LED[6]}]
#set_property PACKAGE_PIN V14 [get_ports {LED[7]}]
# set_property IOSTANDARD LVCMOS33 [get_ports {LED[7]}]
#set_property PACKAGE_PIN V13 [get_ports {LED[8]}]
# set_property IOSTANDARD LVCMOS33 [get_ports {LED[8]}]
#set_property PACKAGE_PIN V3 [get_ports {LED[9]}]
# set_property IOSTANDARD LVCMOS33 [get_ports {LED[9]}]
#set_property PACKAGE_PIN W3 [get_ports {LED[10]}]
# set_property IOSTANDARD LVCMOS33 [get_ports {LED[10]}]
#set_property PACKAGE_PIN U3 [get_ports {LED[11]}]
# set_property IOSTANDARD LVCMOS33 [get_ports {LED[11]}]
#set_property PACKAGE_PIN P3 [get_ports {LED[12]}]
# set_property IOSTANDARD LVCMOS33 [get_ports {LED[12]}]
#set_property PACKAGE_PIN N3 [get_ports {LED[13]}]
# set_property IOSTANDARD LVCMOS33 [get_ports {LED[13]}]
#set_property PACKAGE_PIN P1 [get_ports {LED[14]}]
# set_property IOSTANDARD LVCMOS33 [get_ports {LED[14]}]
#set_property PACKAGE_PIN L1 [get_ports {LED[15]}]
# set_property IOSTANDARD LVCMOS33 [get_ports {LED[15]}]

#7 segment display
set_property PACKAGE_PIN W7 [get_ports {seg[0]}]
set_property IOSTANDARD LVCMOS33 [get_ports {seg[0]}]
set_property PACKAGE_PIN W6 [get_ports {seg[1]}]
set_property IOSTANDARD LVCMOS33 [get_ports {seg[1]}]
set_property PACKAGE_PIN U8 [get_ports {seg[2]}]
set_property IOSTANDARD LVCMOS33 [get_ports {seg[2]}]
set_property PACKAGE_PIN V8 [get_ports {seg[3]}]
set_property IOSTANDARD LVCMOS33 [get_ports {seg[3]}]
set_property PACKAGE_PIN U5 [get_ports {seg[4]}]
set_property IOSTANDARD LVCMOS33 [get_ports {seg[4]}]
set_property PACKAGE_PIN V5 [get_ports {seg[5]}]
set_property IOSTANDARD LVCMOS33 [get_ports {seg[5]}]
set_property PACKAGE_PIN U7 [get_ports {seg[6]}]
set_property IOSTANDARD LVCMOS33 [get_ports {seg[6]}]
set_property PACKAGE_PIN V7 [get_ports seg[7]]
set_property IOSTANDARD LVCMOS33 [get_ports seg[7]]
set_property PACKAGE_PIN U2 [get_ports {an[0]}]
set_property IOSTANDARD LVCMOS33 [get_ports {an[0]}]
set_property PACKAGE_PIN U4 [get_ports {an[1]}]
set_property IOSTANDARD LVCMOS33 [get_ports {an[1]}]
set_property PACKAGE_PIN V4 [get_ports {an[2]}]
set_property IOSTANDARD LVCMOS33 [get_ports {an[2]}]
set_property PACKAGE_PIN W4 [get_ports {an[3]}]
set_property IOSTANDARD LVCMOS33 [get_ports {an[3]}]

##Buttons
set_property PACKAGE_PIN U18 [get_ports Reset]
set_property IOSTANDARD LVCMOS33 [get_ports Reset]
#set_property PACKAGE_PIN T18 [get_ports btnU]
#set_property IOSTANDARD LVCMOS33 [get_ports btnU]
#set_property PACKAGE_PIN W19 [get_ports btnL]
#set_property IOSTANDARD LVCMOS33 [get_ports btnL]
#set_property PACKAGE_PIN T17 [get_ports btnR]
#set_property IOSTANDARD LVCMOS33 [get_ports btnR]
#set_property PACKAGE_PIN U17 [get_ports btnD]
#set_property IOSTANDARD LVCMOS33 [get_ports btnD]

También podría gustarte