Images

Introducción al kit Open3S250E (10): Configuración de USER CONSTRAINT

Antes de programar la FPGA hay que configurar entre otras cosas los pines que vas a usar. Esto se hace en un apartado del software de XILINX llamado USER CONSTRAINT.

En esta entrada veremos como hacerlo.  

En primer lugar hacemos clic en el siguiente enlace o link (o copiar y pegar en el espacio de direcciones de tu navegador):


Con el anterior enlace se abre una página que nos da información muy valiosa:



Te aconsejo que copies todo el texto y lo pegues en un documento Word, Bloc de Notas o similar.

En cualquier caso en el siguiente recuadro dejo  toda esa información para que la copies y la pegues más fácilmente:


##############################################Core3S250E################################################# NET "clk" LOC = "P129" ; NET "RST" LOC = "P69" ; NET "led[0]" LOC =" P52" ; NET "led[1]" LOC = "P53" ; NET "led[2]" LOC = "P54" ; NET "led[3]" LOC = "P58"; ############################################### Mother Board ######################################## NET "Buzzer" LOC = "p82" ; NET "DS18B20" LOC = "p83" ; #JOYSTICK NET "down" LOC = "p75" ; NET "up" LOC = "p70" ; NET "left" LOC = "p74" ; NET "right" LOC = "p71" ; NET "press" LOC = "p76" ; #8I/Os_1 NET "8I/Os_1_1" LOC = "p54" ; NET "8I/Os_1_2" LOC = "p58" ; NET "8I/Os_1_3" LOC = "p52" ; NET "8I/Os_1_4" LOC = "p53" ; NET "8I/Os_1_5" LOC = "p50" ; NET "8I/Os_1_6" LOC = "p51" ; NET "8I/Os_1_7" LOC = "p43" ; NET "8I/Os_1_8" LOC = "p44" ; #8I/Os_2 NET "8I/Os_2_1" LOC = "p94" ; NET "8I/Os_2_2" LOC = "p93" ; NET "8I/Os_2_3" LOC = "p92" ; NET "8I/Os_2_4" LOC = "p91" ; NET "8I/Os_2_5" LOC = "p88" ; NET "8I/Os_2_6" LOC = "p87" ; NET "8I/Os_2_7" LOC = "p86" ; NET "8I/Os_2_8" LOC = "p85" ; #16I/Os_2 NET "16I/Os_2_1" LOC = "p83" ; NET "16I/Os_2_2" LOC = "p82" ; NET "16I/Os_2_3" LOC = "p81" ; NET "16I/Os_2_4" LOC = "p77" ; NET "16I/Os_2_5" LOC = "p76" ; NET "16I/Os_2_6" LOC = "p75" ; NET "16I/Os_2_7" LOC = "p74" ; NET "16I/Os_2_8" LOC = "p71" ; NET "16I/Os_2_9" LOC = "p70" ; NET "16I/Os_2_10" LOC = "p68" ; NET "16I/Os_2_11" LOC = "p67" ; NET "16I/Os_2_12" LOC = "p66" ; NET "16I/Os_2_13" LOC = "p63" ; NET "16I/Os_2_14" LOC = "p62" ; NET "16I/Os_2_15" LOC = "p60" ; NET "16I/Os_2_16" LOC = "p59" ; #16I/Os_1 NET "16I/Os_1_1" LOC = "p126" ; NET "16I/Os_1_2" LOC = "p125" ; NET "16I/Os_1_3" LOC = "p124" ; NET "16I/Os_1_4" LOC = "p123" ; NET "16I/Os_1_5" LOC = "p122" ; NET "16I/Os_1_6" LOC = "p117" ; NET "16I/Os_1_7" LOC = "p116" ; NET "16I/Os_1_8" LOC = "p113" ; NET "16I/Os_1_9" LOC = "p112" ; NET "16I/Os_1_10" LOC = "p106" ; NET "16I/Os_1_11" LOC = "p105" ; NET "16I/Os_1_12" LOC = "p104" ; NET "16I/Os_1_13" LOC = "p103" ; NET "16I/Os_1_14" LOC = "p98" ; NET "16I/Os_1_15" LOC = "p97" ; NET "16I/Os_1_16" LOC = "p96" ; #32I/Os_1 NET "32I/Os_1_1" LOC ="p39"; NET "32I/Os_1_2" LOC ="p40"; NET "32I/Os_1_3" LOC ="p34"; NET "32I/Os_1_4" LOC ="p35"; NET "32I/Os_1_5" LOC ="p32"; NET "32I/Os_1_6" LOC ="p33"; NET "32I/Os_1_7" LOC ="p26"; NET "32I/Os_1_8" LOC ="p31"; NET "32I/Os_1_9" LOC ="p23"; NET "32I/Os_1_10" LOC ="p25"; NET "32I/Os_1_11" LOC ="p21"; NET "32I/Os_1_12" LOC ="p22"; NET "32I/Os_1_12" LOC ="p17"; NET "32I/Os_1_14" LOC ="p20"; NET "32I/Os_1_15" LOC ="p15"; NET "32I/Os_1_16" LOC ="p16"; NET "32I/Os_1_17" LOC ="p8"; NET "32I/Os_1_18" LOC ="p14"; NET "32I/Os_1_19" LOC ="p5"; NET "32I/Os_1_20" LOC ="p7"; NET "32I/Os_1_21" LOC ="p3"; NET "32I/Os_1_22" LOC ="p4"; NET "32I/Os_1_23" LOC ="p143"; NET "32I/Os_1_24" LOC ="p2"; NET "32I/Os_1_25" LOC ="p140"; NET "32I/Os_1_26" LOC ="p142"; NET "32I/Os_1_27" LOC ="p135"; NET "32I/Os_1_28" LOC ="p139"; NET "32I/Os_1_29" LOC ="p132"; NET "32I/Os_1_30" LOC ="p134"; NET "32I/Os_1_31" LOC ="p130"; NET "32I/Os_1_32" LOC ="p131"; #H1 NET "H1_1" LOC ="p131" ; NET "H1_2" LOC ="p130" ; NET "H1_3" LOC = "p134"; NET "H1_4" LOC = "p132"; NET "H1_5" LOC = "p139"; NET "H1_6" LOC = "p135"; NET "H1_7" LOC = "p142"; NET "H1_8" LOC = "p140"; NET "H1_9" LOC = "p2"; NET "H1_10" LOC = "P143"; NET "H1_11" LOC = "p4"; NET "H1_12" LOC ="p3" ; NET "H1_13" LOC = "p7"; NET "H1_14" LOC = "p5"; NET "H1_15" LOC = "p14"; NET "H1_16" LOC = "p8"; NET "H1_17" LOC = "p16"; NET "H1_18" LOC = "p15"; NET "H1_19" LOC = "p20"; NET "H1_20" LOC ="p17" ; NET "H1_21" LOC ="p22" ; NET "H1_22" LOC ="p21" ; NET "H1_23" LOC ="p25" ; NET "H1_24" LOC ="p23" ; NET "H1_25" LOC ="p31" ; NET "H1_26" LOC ="p26" ; NET "H1_27" LOC ="p33" ; NET "H1_28" LOC ="p32" ; NET "H1_29" LOC ="p35" ; NET "H1_30" LOC ="p34" ; NET "H1_31" LOC ="p40" ; NET "H1_32" LOC ="p39" ; NET "H1_33" LOC ="p44" ; NET "H1_34" LOC ="p43" ; NET "H1_35" LOC ="p51" ; NET "H1_36" LOC ="p50" ; NET "H1_37" LOC ="p53" ; NET "H1_38" LOC ="p52" ; NET "H1_39" LOC ="p58" ; NET "H1_40" LOC ="p54" ; #H2 NET "H2_1" LOC ="p126" ; NET "H2_2" LOC ="p125" ; NET "H2_3" LOC = "p124"; NET "H2_4" LOC = "p123"; NET "H2_5" LOC = "p122"; NET "H2_6" LOC = "p117"; NET "H2_7" LOC = "p116"; NET "H2_8" LOC = "p113"; NET "H2_9" LOC = "p112"; NET "H2_10" LOC = "P106"; NET "H2_11" LOC = "p105"; NET "H2_12" LOC ="p104" ; NET "H2_13" LOC = "p103"; NET "H2_14" LOC = "p98"; NET "H2_15" LOC = "p97"; NET "H2_16" LOC = "p96"; NET "H2_17" LOC = "p94"; NET "H2_18" LOC = "p93"; NET "H2_19" LOC = "p92"; NET "H2_20" LOC ="p91" ; NET "H2_21" LOC ="p88" ; NET "H2_22" LOC ="p87" ; NET "H2_23" LOC ="p86" ; NET "H2_24" LOC ="p85" ; NET "H2_25" LOC ="p83" ; NET "H2_26" LOC ="p82" ; NET "H2_27" LOC ="p81" ; NET "H2_28" LOC ="p77" ; NET "H2_29" LOC ="p76" ; NET "H2_30" LOC ="p75" ; NET "H2_31" LOC ="p74" ; NET "H2_32" LOC ="p71" ; NET "H2_33" LOC ="p70" ; NET "H2_34" LOC ="p68" ; NET "H2_35" LOC ="p67" ; NET "H2_36" LOC ="p66" ; NET "H2_37" LOC ="p63" ; NET "H2_38" LOC ="p62" ; NET "H2_39" LOC ="p60" ; NET "H2_40" LOC ="p59" ; #LCD1602 NET "RS" LOC = "p25" ; NET "R/W" LOC = "p31" ; NET "EN" LOC = "p26" ; NET "D0" LOC = "p33" ; NET "D1" LOC = "p32" ; NET "D2" LOC = "p35" ; NET "D3" LOC = "p34" ; NET "D4" LOC = "p40" ; NET "D5" LOC = "p39" ; NET "D6" LOC = "p44" ; NET "D7" LOC = "p43" ; NET "A" LOC = "p51" ; NET "K" LOC = "p50" ; #LCD12864 NET "RS" LOC ="p25" ; NET "R/W" LOC = "p31" ; NET "EN" LOC ="p26" ; NET "D0" LOC = "p33" ; NET "D1" LOC = "p32" ; NET "D2" LOC = "p35" ; NET "D3" LOC = "p34" ; NET "D4" LOC = "p40" ; NET "D5" LOC = "p39" ; NET "D6" LOC = "p44" ; NET "D7" LOC = "p43" ; NET "PSB" LOC ="p51" ; NET "RST" LOC ="p53" ; NET "A" LOC ="p58" ; NET "K" LOC ="p54" ;

Lo que nos muestra es a dónde están conectados los pines de la FPGA en la placa Core3S250E, y a la DVK601 (una vez montadas correctamente ambas).

Lo que vamos a utilizar aquí es la señal de reloj de entrada (la Core3S250E tiene su propio reloj), y como salidas los 4 LEDs L4, L3, L2 y L1.


Si observamos el principio del documento,

##############################################Core3S250E##############################
NET "clk" LOC = "P129" ;
 
NET "RST" LOC = "P69" ;
 
NET "led[0]" LOC =" P52" ;
NET "led[1]" LOC = "P53" ;
NET "led[2]" LOC = "P54" ;
NET "led[3]" LOC = "P58";
 
############################################### Mother Board ########################################

Vemos que el reloj “clk” va conectado al pin P129 de la FPGA, y que los LEDs van conectados a los pines P52, P53, P54 y P58. Expresado de otra forma:

L4 -> P52
L3 -> P53
L3 -> P54
L4 -> P58

Clk -> P129

Esto va a ser importante para establecer los USER CONSTRAINT (algo así como “restricciones de usuario” en inglés).

En el campo “Top Module”, escribimos LEDA_blog:



Tras esto abrimos el desplegable USER CONSTRAINTS:




Dentro de las opciones en dicho desplagable, hacemos doble clic en “I/O Pin Planning (PlanAhead)  Pre-Stnthesis“ (con LEDA_blog escrito en el campo Top Module como acabamos de explicar),


A continuación pulsamos yes:


Lo que sucederá es que se abrirá la otra parte del paquete del software de XILINX, el PlanAhead (del cual en el proceso de instalación se crea otro icono de acceso directo en el escritorio). Tarda un poco en abrirse, por lo menos en mi caso, si es su caso también, paciencia, es normal. 


Clic en “close”:


Clic en “No”.


Abrimos el desplegable led1:




Ahora nos vamos a la ventana “Package”:


y hacemos clic en el icono de la barra vertical izquierda llamada “I/O ports in an I/O bank” (con led1[0] seleccionado por el clic que ya hemos hecho en él),


Ahora es cuando tenemos que hacer uso de la asignación de pines del diseño del Core3S250E anteriormente vista, la recordamos:
  
Led1[0] -> L4 -> P52
Led1[1] -> L3 -> P53
Led1[2] -> L3 -> P54
Led1[3] -> L4 -> P58

Clk -> P129

Y con el cursos vamos buscando el pin P52 en la figura:



Hacemos doble clic en él y se obtiene:


En la ventana “Package”:



Y en la ventana “I/O ports”:


Repetimos el proceso para led1[1], led1[2] y led1[3],


Pero aún no hemos acabado. Recuerde el lector que aun hay que asignar el puerto P129 a clk. Para ello hacemos uso del scroll (barra de desplazamiento en este caso vertical) de la ventana I/O Ports a la derecha, desplazando la hasta abajo del todo. Luego desplegamos los “Scalar ports”.



Una vez desplegado el “Scalar ports” volvemos a hacer uso del scroll y seleccionamos clk:



Volvemos a repetir el proceso ya explicado para led1[0], led1[1], led1[2] y led1[3],  ahora para clk:


Ahora damos al icono “Save Design”, y ya tenemos el USER CONSTRAINT para este proyecto.


Y esto ya hemos configurado los USER CONSTRAINT, y estamos más cerca de programar la FPGA y hacer funcionar el hardware.

0 comentarios: