Universidad de Guadalajara Departamento de Electr´onica
Proyecto de asignatura Procesador de 8 bits Sistemas reconfigurables Eduardo V´azquez D´ıaz
[email protected] 8 de marzo de 2016
1
´Indice 1. Introducci´ on 1.1. El procesador . . . . . . . . . . . . . . . . . . . . . . . . . . .
3 3
2. Desarrollo 2.1. Unidad de Control . . . . . 2.2. Registro de instruccion (IR) 2.3. Registros (Memoria RAM) . 2.4. Instrucciones . . . . . . . .
3 4 6 7 8
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
3. Resultados 4. Ap´ endice 4.1. Makefile . . . . . . 4.2. cpu.v . . . . . . . . 4.3. cpu tb.cpp . . . . . 4.4. ram.v . . . . . . . 4.5. ram tb.cpp . . . . 4.6. Codigo sintetizable
8
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
2
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
10 11 11 15 17 18 20
Resumen Se construy´ o un procesador de 8 bits con 15 instrucciones, utilizando lenguaje verilog y software libre para dise˜ nar y simularlo. Posteriormente se implement´o en una tarjeta fpga spartan 3.
1.
Introducci´ on
El lenguaje de descripcion de hardware es una potente herramienta que facilita la creacion de prototipos electronicos. Permite expresar en un lenguaje sint´ actico, entendible para los humanos funciones especificas que pueden ser programadas en tarjetas FPGA las veces que sean requeridas hasta cumplir los requisitos del sistema a implementar. Un ejemplo de estos lenguajes es Verilog, que posee herramientas u ´tiles para simulaci´on y verificaci´on en entornos de software libre. El software libre da una gran ventaja; la mayor´ıa del software es documentado y respaldado por una comunidad que esta constantemente buscando mejorar la calidad del software. GNU/Linux es un buen ejemplo donde grandes comunidades se desenvuelven entorno al desarrollo y uso del software libre. Las herramientas que proporcionan los entornos GNU/Linux permiten desarrollar de manera eficiente utilizando scripts que automatizan las tareas de compilaci´ on y verificaci´ on del circuito a implementar en verilog.
1.1.
El procesador
Los procesadores se encuentran en pr´acticamente cualquier dispositivo inteligente, su arquitectura interna varia dependiendo del fabricante, las mas utilizadas son las arquitecturas x86 y ARM. La arquitectura del procesador dicta la longitud de los datos y de las instrucciones, al igual que el tipo de datos que maneja, sean n´ umeros enteros o de punto flotante.
2.
Desarrollo
El procesador se descompone en unidades mas peque˜ nas que realizan tareas especificas:
3
Figura 1: Diagrama de bloques del procesador
2.1.
Unidad de Control
La unidad de control es una maquina de estados, cada estado es explicado en la tabla ??.
4
Figura 2: Diagrama de estados de la unidad de control (CU) Estados Inicio: Las variables y conexiones internas se (re)inicializan a 0. Busqueda: Se pasa la instruccion completa al IR. Decodificacion: Se prepara para la ejecucion de la instruccion. Ejecucion: Se ejecuta la instruccion. Espera: Se espera a que se termine de ejecutar la instruccion.
5
Figura 3: Al activar RST todos los estados llevan al inicial.
2.2.
Registro de instruccion (IR)
La idea de enviarle instrucciones a la tarjeta spartan xc3s200 utilizando sus DIP SWITCH conllevo al dise˜ n´o de un IR de 8bits.
Figura 4: Los 4 bits mas significativos representan la operacion a realizar, con un total de 16 operaciones posibles. Los 4 bits menos significativos son el parametro de la operacion.
6
Figura 5: (11) Cada DIP-Switch representa un bit del IR. (13) CLK manual y reset.
2.3.
Registros (Memoria RAM)
La memoria RAM cuenta con 16 registros de proposito general de 4 bits cada uno, lo que permite utilizar la misma longitud para el bus de datos y el bus de direcci´ on.
Figura 6: Arquitectura interna de la memoria RAM utilizada para guardar los registros de proposito general.
7
2.4.
Instrucciones Instruccion ldaxx = 0000 ldxxa = 0001 andaxx = 0010 addaxx subaxx jzxx jmpxx nop movaxx nandaxx oraxx noraxx xoraxx xnoraxx nota
3.
= = = = = = = = = = = =
0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110
Parametros xxxx xxxx xxxx
Descripcion Carga el dato del registro xxxx al acumulador. a Carga el dato a en el registro xxxx. Aplica la operacion AND logica a nivel de bits entre a y el registro xxxx, el resultado se guarda en a. Suma el contenido del registro xxxx a a. Resta el contenido del registro xxxx a a. Salta a la direccion xxxx del pc si a = 0. Salta a la direccion xxxx del pc. No hace nada. Pon xxxx en el acumulador. Similar a andaxx pero la operacion NAND. Similar a nandaxx pero la operacion OR. Similar a oraxx pero la operacion NOR. Similar a noraxx pero la operacion XOR. Similar a xoraxx pero la operacion XNOR. Aplica la operacion NOT a a.
xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx -
Resultados
Figura 7: Simulacion de instrucciones.
8
Figura 8: Instruccion 0x89.
Figura 9: Instruccion 0x20.
9
Figura 10: Instruccion 0x8E
4.
Ap´ endice
Documento hecho en LATEX. Para ver los archivos sintetizables ver seccion Codigo sintetizable m´ as abajo. Los archivos descritos a continuacion son para simularse y utilizarse en conjunto:= Linux (o sistemas basados en Unix) + Verilator + GTKWave.
10
4.1.
Makefile
Makefile MAIN = cpu TESTBENCH = ${MAIN} t b . cpp a l l : c o m p i l e run s i m u l a t e compile : / u s r / b i n / v e r i l a t o r −Wall −−c c −−t r a c e $ {MAIN} . v −−exe ${TESTBENCH} s e d ’ s /VERILATOR ROOT = \/ u s r \/ b i n /VERILATOR ROOT = \/ u s r \/ s h a r e \/ rm o b j d i r /V${MAIN} .mk mv V${MAIN} .mk o b j d i r / make −j −C o b j d i r / −f V${MAIN} .mk V${MAIN} run : o b j d i r /V${MAIN} simulate : gtkwave $ {MAIN} . vcd
4.2.
cpu.v
cpu.v /∗ v e r i l a t o r l i n t o f f WIDTH ∗/ module cpu #(parameter d a t a w i d t h = 4 , parameter a d d r w i d t h = 4 , parameter op width = 4, parameter op param = 4, parameter p c w i d t h = 8) ( input wire clk , rst , i n p u t w i r e [ ( op width+op param ) − 1 : 0 ] i n s t r u c t i o n , output r e g [ da ta w id th − 1 : 0 ] a ); r e g [ da t a w id t h − 1 : 0 ] r e g [ da t a w id t h − 1 : 0 ] r e g [ addr width − 1 : 0 ]
datain ; dataout ; addr ; 11
r e g [ op width − 1 : 0 ] r e g [ pc width − 1 : 0 ] r e g [ ( op width+op param ) − 1 : 0 ] reg
currentState , nextState ; pc ; ir ; dir ;
parameter // C i c l o s d e l CPU START = 0 , FETCH = 1 , DECODE = 2 , EXECUTE = 3 , WAIT = 4 ; parameter // O p e r a c i o n e s l d a x x = 0 , l d x x a = 1 , andaxx = 2 , addaxx = 3 , subaxx = 4 , j z x x = 5 , jmpxx = 6 , nop = 7 , movaxx = 8 , nandaxx = 9 , oraxx = 1 0 , noraxx = 1 1 , xoraxx = 1 2 , xnoraxx = 1 3 , nota = 1 4 ; ram cpu mem ( . c l k ( c l k ) , . r s t ( r s t ) , . rw ( d i r ) , . addr ( addr ) , . datain ( datain ) , . dataout ( dataout ) ) ; always @( p o s e d g e c l k , p o s e d g e r s t ) i f ( r s t ) c u r r e n t S t a t e c l k = ! ram−>c l k ; ram−>e v a l ( ) ; gtkw−>dump( c l k ) ; c l k ++; ram−>c l k = ! ram−>c l k ; w h i l e ( ram−>d a t a o u t != 1 5 ) { 19
i f ( j %2) i ++; ram−>addr = i ; ram−>e v a l ( ) ; gtkw−>dump( c l k ) ; ram−>c l k = ! ram−>c l k ; c l k ++; j ++; } f o r ( i = 0 ; i < 6 ; i ++) { ram−>r s t = i == 2 ; ram−>e v a l ( ) ; gtkw−>dump( c l k ) ; ram−>c l k = ! ram−>c l k ; c l k ++; } i f ( Verilated : : gotFinish ()) exit (0); gtkw−>c l o s e ( ) ; exit (0); return 0; }
4.6.
Codigo sintetizable
ram.v module ram #(parameter d a t a w i d t h = 4 , parameter a d d r w i d t h = 4 ) ( i n p u t w i r e c l k , r s t , rw , i n p u t w i r e [ addr width − 1 : 0 ] i n p u t w i r e [ d at a w id th − 1 : 0 ] output r e g [ da ta w id th − 1 : 0 ] ); r e g [ da t a w id t h − 1 : 0 ] 20
addr , datain , dataout data [ 0 : ( a d d r w i d t h ∗ a d d r w i d t h ) − 1 ] ;
r e g [ da t a w id t h − 1 : 0 ]
i;
parameter WRITE = 1 , READ = 0 ; always @( p o s e d g e c l k , p o s e d g e r s t ) i f ( rst ) begin f o r ( i = 0 ; i < ( a d d r w i d t h ∗ a d d r w i d t h )−1 ; i = i + 1 ) data [ i ]