Procesador de 8 bits con verilog

Share Embed


Descripción

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 ]
Lihat lebih banyak...

Comentarios

Copyright © 2017 DATOSPDF Inc.