Calculadora simple
Universidad de san Buenaventura

Integrantes

Ruben Dario Jordan Saenz (20141615043)oc.ude.gobbsu.aimedaca|nadrojr#oc.ude.gobbsu.aimedaca|nadrojr
Steban Ramírez (20141615045) oc.ude.gobbsu.aimedaca|zerimarsn#oc.ude.gobbsu.aimedaca|zerimarsn
Nicolás Cubillos (20141615083) oc.ude.gobbsu.aimedaca|sollibucn#oc.ude.gobbsu.aimedaca|sollibucn
Sergio Sánchez (20141615095)oc.ude.gobbsu.aimedaca|setrocds#oc.ude.gobbsu.aimedaca|setrocds

Resumen

En el presente documento se describe la creación de una calculadora simple, que es aplicada en una tarjeta programable FPGA Nexys2 Spartan 3E.

Introducción

Por medio del software Xilinx y el lenguaje de programación Verilog crear una calculadora simple que nos permita realizar las operaciones básicas matemáticas.

  1. Suma
  2. Resta
  3. Multiplicación
  4. División

Además nos muestre en el display los valores de A, B, y el de la respuesta.

Objetivos

Objetivos Generales

  • Calculadora que permita realizar las operaciones matemáticas básicas, y nos muestren los valores en el

Display de la tarjeta programable.

Objetivos Específicos

  1. La visualización de los valores de A y B en el display ocupando los displays 3 y 4, siendo estos los valores a operar.
  2. La visualización de la respuesta ocupando los displays 1 y 2.
  3. La capacidad de realizar las cuatro operaciones matemáticas básicas que son determinadas por los pulsadores de la Nexys 2;

Marco teórico

Calculadora

Calculadora

Una calculadora es una herramienta digital, mecánica o manual, que permite simplificar de forma significativa la velocidad con la cual se conocen los resultados de una operación aritmética.

Actualmente las calculadoras más comunes son las digitales, que se pueden clasificar como calculadoras Básicas y Científicas, que sus principales diferencias son la cantidad de funciones que se pueden realizar una en comparación a la otra.

Nexys 2

Nexys 2

"El Nexys-2 es una plataforma para diseño de sistemas digitales, basado en el FPGA Xilinx Spartan 3E. Con memorias SDRAM de 16MB y Flash ROM de 16MB, el Nexys-2 es ideal para procesadores embebidos como el Microblaze™ 32-bit RISC de Xilinx. El puerto USB2 junto a la colección de dispositivos I/O (leds, displays, pulsadores), puertos de datos y conectores de expansión, permiten obtener un amplio rango de diseños, que se pueden completar sin nesecidad de componentes adicionales." [2]

Diseño

Una calculadora que muestre los valores a operar y su resultado en el display de la FPGA y dependiendo de la operación seleccionada del resultado correcto.

Limitaciones

Las variables a operar no pueden exceder el valor 9 y el valor de la respuesta no puede exceder el valor de 99 (por que un Display soporta un máximo de valores de 8 bits).

Codificación

En los siguientes bloques mostramos la lógica del código.

Módulo de calculadora(OPERACIONES)

En este móodulo se realizan cada una de cada una de las operaciones.
En la suma se toman valores de A y B y se suman.
En la resta si el valor de A es mayor al de B re puede realizar la resta y muestran los valores, pero en caso contrario el valor va a ser indefinido.
En la multiplicación se hace una suma consecutiva de B veces el valor de A.
En la división se realiza como una resta consecutiva y el valor de resultado son las veces que se puede restar.(No fue descrito en el código.)

module calculadora #(parameter N=8)(swtch,s,resp, loadA, loadB);
 
   input loadA, loadB;
   input [N-1:0] swtch;
   input [1:0] s;
   output [2*N-1:0] resp;
   reg[N-1:0] A, B;
   wire [N:0] sum;
   wire [N-1:0] rest;
  wire [2*N-1:0] mult;
  wire [N:0] inc; 
  reg[6:0] C=0;
  reg[3:0] D=0;
  reg [1:0] current_state;
  reg [1:0] next_state;
  parameter d1=0,d2=1,d3=2;
  always @(posedge loadA)
  begin
  A<=swtch;
  end
  always @(posedge loadB)
  begin
  B<=swtch;
  end
  assign sum = A+B;
  assign rest= (B<A)? A-B:B-A;
  assign begin
case(current_state)
                d1:begin
                    if(D<<B) begin
                        C=C+A;
                        UN=UN;
                        DC=DC;
                        D=D+1;
                        next_state=d1;
                    end
                    else begin
                        C=C;
                        UN=UN;
                        DC=DC;
                        D=D;
                        next_state=d2;
                    end
                end
                d2:begin
                    C=C;
                    if(C>>9) begin
                        D=C-(C-10);
                        UN=D;
                        DC=C-D;
                    end
                    else begin
                        D=D;
                        UN=C;
                        DC=0;
                    end
                    next_state=d2;
                end
            endcase
         mult =C ;
  assign inc = A+1;
  assign resp = s[1]? (s[0]? inc : mult):(s[0]? rest : sum); 
  endmodule

Módulo del Reloj

    module clkseg(clk,v);
    input clk;
   output v;
   reg [16:0]cont;
   initial cont=0;
   assign v=cont[16];
   always @(posedge clk) cont<=cont+1;
   endmodule

Módulo de dígitos

module digitos(resp,uns,des,ces,unms, clk);
    input clk;
    input[15:0]    resp;
    output reg [3:0] uns,des,ces,unms;
    wire  clk;
    reg [3:0] de,ce,unm;
    reg [15:0] a;
    reg b;
    initial b=0;
    always @(posedge clk)
    begin
    if(b==0)begin
    de<=4'd0;
    ce<=4'd0;
    unm<=4'd0;
    a<=resp;
    b<=1;
    end
    else if(a>=16'd1000)begin
    a<=a-1000;
    unm<=unm+1;
    end
    else if(a>=16'd100)begin
    a<=a-100;
    ce<=ce+1;
    end
    else if(a>=16'd10)begin
    a<=a-10;
    de<=de+1;
    end else begin
    uns<=a;
    des<=de;
    ces<=ce;
    unms<=unm;
    b<=0;
    end  
  end
  endmodule

Módulo de siete segmentos

module mux_deco(v,un,de,ce,an,unm,seg);
    input v;
    input [3:0] un,de,ce,unm;
    output [3:0] an;
    output reg [6:0] seg;
    reg [1:0]cont;
    wire [3:0]in;    
   initial cont=0;
  always @(posedge v) cont=cont+1;
   assign in=cont[1]?(cont[0]? unm:ce):(cont[0]? de:un),
         an=cont[1]?(cont[0]? 4'b0111:4'b1011):(cont[0]? 4'b1101:4'b1110);

   always @(in)
    case(in)
        4'd0: seg=7'b0000001;
        4'd1: seg=7'b1001111;
        4'd2: seg=7'b0010010;
        4'd3: seg=7'b0000110;
        4'd4: seg=7'b1001100;
        4'd5: seg=7'b0100100;
        4'd6: seg=7'b0100000;
        4'd7: seg=7'b0001111;
        4'd8: seg=7'b0000000;
        4'd9: seg=7'b0000100;
        default: seg=7'b1111111;
    endcase

endmodule

Diagrama de flujo

Diagrama de estado

Operaciones

Operacines

Multiplicación

Multiplicaciones

División

División

Resultado

Resultado

Codigo Verilog

RTL

Referencias

[1] RAE, Diccionario de la lengua española [online], España: Real Academia de la lengua española, 2015. Disponible en [http://dle.rae.es/?w=calculadora&o=h]
[2]SIGMA ELECTRONICA LTDA, Nexys2 500K [online], Colombia: SIGMA ELECTRONICA LTDA, 2015. Disponible en [http://www.sigmaelectronica.net/contact_us.php]

Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-ShareAlike 3.0 License