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.
- Suma
- Resta
- Multiplicación
- 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
- 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.
- La visualización de la respuesta ocupando los displays 1 y 2.
- 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
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
"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
Multiplicación
División
Resultado
Codigo Verilog
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]