Ejemplo Uso de Procesador Picoblaze
Ejemplo Uso de Procesador Picoblaze
Ejemplo Uso de Procesador Picoblaze
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.
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;
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;
begin
sBTN(0) <= Reset; -- Asignación del reset del contador en la posición 0 del vector BTN
end Behavioral;
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.
# 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]