Taximetro

TAXÍMETRO

Integrantes

Fs0mqI9n_400x400.png
*Erika Perez
*Camilo Perez
*Sebastian Caballero

Descripción

Un taxímetro es un aparato de medida mecánico o electrónico usualmente instalado en los llamados taxis, similar a un odómetro. Y mide el importe a cobrar en relación tanto a la distancia recorrida como el tiempo transcurrido, por esto en el siguiente informe se podrá observar el diseño de un taxímetro implementado en una FPGA (nexys2) donde las unidades a medir será por cada 20 segundo o por cada 1 metro recorrido dado que la circunferencia que simulara la llanta es de 1.3 cm de radio. El taxímetro tendrá como límite 132 unidades ya que se cuenta con un display de 4 dígitos de 7 segmentos en donde se podrá observar el valor a pagar limite el cual es de $9900 pesos.

Objetivos

• Realizar una aplicación que simule un taxímetro implementándolo en una FPGA (nexys2).
• Implementar un dispositivo a la FPGA que me permita calcular la distancia recorrida.

Diseño

La programación se realizó por medio de la plataforma ISE (Verilog) donde se configuro la FPGA para que el usuario al interactuar pueda poner en marcha el taxímetro mostrando el conteo de las unidades, el valor a pagar, resetearlo y volver a empezar.
-
-
-
El dispositivo que se implementó en la FPGA fue un encoder con módulo de herradura el cual permite medir velocidades, pero en nuestro caso lo utilizamos como medidor de pulsos en donde cada 20 pulsos ha dado una vuelta entera a la circunferencia, la cual equivale a 8.16 cm recorridos. Para recorrer 1 metro se necesitan de 240 pulsos.
Lista de precios
Unidad Precios
35 – 50 3.500
51 – 53 3.600
54 – 56 3.800
57 – 59 4.100
60 – 62 4.300
63 – 65 4.600
66 – 68 4.800
69 – 71 5.100
72 – 74 5.300
75 – 77 5.600
78 – 80 5.800
81 – 83 6.100
84 – 86 6.300
87 – 90 6.700
91 – 93 6.900
94 – 96 7.100
97 – 100 7.300
101 – 103 7.600
104 – 106 7.800
107 – 110 8.100
110 – 113 8.400
114 – 116 8.600
117 – 120 8.900
121 – 123 9.200
124 – 126 9.400
127 – 130 9.700
131 – 132 9.900

Máquina de estados

L.png

Marco Teórico

Nexys 2

Para este proyecto, tal y como se han venido desarrollando en los laboratorios de clase se implementaran los codigos en una Nexys—2, pero en este caso se usaran, sus puertos de Pmod, donde entraran los pulsos del encoder para convertirlos en distancia.
NEXYS2.jpg

Sensor con módulo de herradura

Este módulo incluye un sensor de herradura el cual funciona por infrarrojo, está compuesto por un comparador de referencia LM393 el cual se encarga de entregar señales de 1 lógico y 0 lógico a través de un emisor y un receptor infrarrojo que al poner un objeto en medio este envía la señal. Este circuito es utilizado para medir la velocidad de un motor, obteniendo una señal cuadrada que varía en su frecuencia dependiendo de la velocidad del motor. Este sensor se utiliza principalmente para medir la velocidad de las ruedas, haciendo la función de un encoder, siendo muy económico y con una interfaz muy sencilla.

Sensor de herradura: Infrarrojo
Comparador: LM393
modulo-sensor-de-velocidad-de-herradura-de-motor-lm393-15944-MCO20111327899_062014-F.jpg

Código

El siguiente código es la unión de cada módulo donde se compila para que este funcione correctamente:

module Top(conv_acum, res_det, pulso, clk, salidas,anodos, dp);
input conv_acum;
input res_det;
input pulso;
input clk;
output [6:0] salidas;
output [3:0] anodos;
output dp;
wire w_p, w_add;
wire [3:0] w_mil;
wire [3:0] w_cent;
wire [3:0] w_dece;
wire [3:0] w_uni;
 
Encoder enco(.pulso(pulso),.clk(clk),.p(w_p));
//db_fsm p(.clk(clk),.reset(pulso),.sw(pulso),.db(w_add));
distancia d(.p(w_p),.add(w_add));
//distance dis(.p(w_p),.add(w_add),.clk(clk),.dis(w_dis));
Acumulador acum(.conv_acum(conv_acum),.res_det(res_det),.add(w_add),.p(w_p),.mil(w_mil),.cent(w_cent),.dece(w_dece),.uni(w_uni));
//Display(dece,uni,deci,cent,clk,salidas,anodos,dp);
Display vista(.mil(w_mil),.cent(w_cent),.dece(w_dece),.uni(w_uni),.clk(clk),.salidas(salidas),.anodos(anodos),.dp(dp));
 
endmodule
module Encoder( pulso, clk, p
    );
input pulso;
input clk;
output reg p;
 
reg [40:0] cont=0;
reg clk2=0;
reg [1:0] next;
reg [1:0] actual;
 
parameter start=0, ent=1, sal=2;
 
always @(pulso, actual) begin
 
        case (actual)
 
        start:begin
        p=0;
        if(pulso==1) next=ent;
        else next = start;
        end
 
        ent:begin
        p=1;
        next= sal;
        end
 
        sal:begin
        p=0;
        if(pulso==0) next = start;
        else next = sal;
        end
 
        default:begin
        p=0;
        next=start;
        end
 
        endcase
 
end
always @ (negedge clk) begin
    if (cont<250000) cont=cont+1;
    else begin
    cont=0;
    clk2=~clk2;
    end
end
 
always @ (negedge clk2) begin
    actual=next;
end
 
endmodule

El siguiente código sirve para que el este convierta los pulsos del encoder en distancia recorrida:

module distancia(p, add);
input p;
output reg add;
 
reg [8:0] cont=0;
always @(posedge p) begin
        if (cont <20) begin
        cont=cont+1;
        add=0;
        end    
            else begin
            cont=0;
            add=1;
            end
 
end        
 
endmodule

El siguiente código sirve para que genere la maquina de estados, realizando las 4 funciones que tiene el taxímetro,
las cuales son el encendido, el inicio, el valor a pagar y pagarlo, también mostrara los valores a pagar.

module Acumulador(add, p,conv_acum, res_det, mil, cent, dece, uni);
input add, p;
input conv_acum;
input res_det;
output reg [3:0] mil=0;
output reg [3:0] cent=0;
output reg [3:0] dece=3;
output reg [3:0] uni=5;
 
reg [14:0] unidades=35;
 
always @( negedge p) begin
 
    if (conv_acum==1 & res_det==0) begin
        if (unidades>34 && unidades<132) begin
            if(add==1) begin
                unidades=unidades+1;
                        uni=uni+1;
                        if(uni>9)begin
                                dece=dece+1;
                                uni=0;
                                    if(dece>9)begin
                                    cent=cent+1;
                                    dece=0;
                                    uni=0;
                                        if (cent>9)begin
                                        mil=mil+1;
                                        cent=0;
                                        dece=0;
                                        uni=0;
                                        end
                                    end    
                        end            
            end
 
            else begin
            mil=mil;
            cent=cent;
            dece=dece;
            uni=uni;
            end
        end
    end    
 
    else if (conv_acum==0 & res_det==0) begin
        //precios
        if (unidades<25) begin
        mil=mil;
        cent=cent;
        dece=dece;
        uni=uni;
        end
            if (unidades>=25 && unidades<=50) begin
            unidades=0;
            mil=3;
            cent=5;
            dece=0;
            uni=0;
            end    
                //unidades entre 50 y 60
                else if (unidades>50 && unidades<=53) begin
                unidades=0;
                mil=3;
                cent=6;
                dece=0;
                uni=0;
                end    
                    else if (unidades>53 && unidades<=56) begin
                    unidades=0;
                    mil=3;
                    cent=8;
                    dece=0;
                    uni=0;
                    end    
                        else if (unidades>56 && unidades<=59) begin
                        unidades=0;
                        mil=4;
                        cent=1;
                        dece=0;
                        uni=0;
                        end    
                            //unidades entre 60 y 70
                            else if (unidades>59 && unidades<=62) begin
                            unidades=0;
                            mil=4;
                            cent=3;
                            dece=0;
                            uni=0;
                            end    
                                else if (unidades>62 && unidades<=65) begin
                                unidades=0;
                                mil=4;
                                cent=6;
                                dece=0;
                                uni=0;
                                end    
                                    else if (unidades>65 && unidades<=68) begin
                                    unidades=0;
                                    mil=4;
                                    cent=8;
                                    dece=0;
                                    uni=0;
                                    end    
                                        else if (unidades>68 && unidades<=71) begin
                                        unidades=0;
                                        mil=5;
                                        cent=1;
                                        dece=0;
                                        uni=0;
                                        end    
                                            //unidades entre 70 y 80
                                            else if (unidades>71 && unidades<=74) begin
                                            unidades=0;
                                            mil=5;
                                            cent=3;
                                            dece=0;
                                            uni=0;
                                            end    
                                                else if (unidades>74 && unidades<=77) begin
                                                unidades=0;
                                                mil=5;
                                                cent=6;
                                                dece=0;
                                                uni=0;
                                                end    
                                                    else if (unidades>77 && unidades<=80) begin
                                                    unidades=0;
                                                    mil=5;
                                                    cent=8;
                                                    dece=0;
                                                    uni=0;
                                                    end    
                                                        //]Uindades entre 80 y 90
                                                        else if (unidades>80 && unidades<=83) begin
                                                        unidades=0;
                                                        mil=6;
                                                        cent=1;
                                                        dece=0;
                                                        uni=0;
                                                        end    
                                                            else if (unidades>83 && unidades<=86) begin
                                                            unidades=0;
                                                            mil=6;
                                                            cent=3;
                                                            dece=0;
                                                            uni=0;
                                                            end    
                                                                else if (unidades>86 && unidades<=90) begin
                                                                unidades=0;
                                                                mil=6;
                                                                cent=7;
                                                                dece=0;
                                                                uni=0;
                                                                end    
                                                                    //unidades entre 90 y 100
                                                                    else if (unidades>90 && unidades<=93) begin
                                                                    unidades=0;
                                                                    mil=6;
                                                                    cent=9;
                                                                    dece=0;
                                                                    uni=0;
                                                                    end    
                                                                        else if (unidades>93 && unidades<=96) begin
                                                                        unidades=0;
                                                                        mil=7;
                                                                        cent=1;
                                                                        dece=0;
                                                                        uni=0;
                                                                        end
                                                                            else if (unidades>96 && unidades<=100) begin
                                                                            unidades=0;
                                                                            mil=7;
                                                                            cent=3;
                                                                            dece=0;
                                                                            uni=0;
                                                                            end    
                                                                                //Unidades de 100 a 110
                                                                                else if (unidades>100 && unidades<=103) begin
                                                                                unidades=0;
                                                                                mil=7;
                                                                                cent=6;
                                                                                dece=0;
                                                                                uni=0;
                                                                                end
                                                                                    else if (unidades>103 && unidades<=106) begin
                                                                                    unidades=0;
                                                                                    mil=7;
                                                                                    cent=8;
                                                                                    dece=0;
                                                                                    uni=0;
                                                                                    end    
                                                                                        else if (unidades>106 && unidades<=110) begin
                                                                                        unidades=0;
                                                                                        mil=8;
                                                                                        cent=1;
                                                                                        dece=0;
                                                                                        uni=0;
                                                                                        end    
                                                                                            // Unidades de 110 a 120
                                                                                            else if (unidades>110 && unidades<=113) begin
                                                                                            unidades=0;
                                                                                            mil=8;
                                                                                            cent=4;
                                                                                            dece=0;
                                                                                            uni=0;
                                                                                            end    
                                                                                                else if (unidades>113 && unidades<=116) begin
                                                                                                unidades=0;
                                                                                                mil=8;
                                                                                                cent=6;
                                                                                                dece=0;
                                                                                                uni=0;
                                                                                                end
                                                                                                    else if (unidades>116 && unidades<=120) begin
                                                                                                    unidades=0;
                                                                                                    mil=8;
                                                                                                    cent=9;
                                                                                                    dece=0;
                                                                                                    uni=0;
                                                                                                    end    
                                                                                                        //Unidades de 120 a 130
                                                                                                        else if (unidades>120 && unidades<=123) begin
                                                                                                        unidades=0;
                                                                                                        mil=9;
                                                                                                        cent=2;
                                                                                                        dece=0;
                                                                                                        uni=0;
                                                                                                        end
                                                                                                            else if (unidades>123 && unidades<=126) begin
                                                                                                            unidades=0;
                                                                                                            mil=9;
                                                                                                            cent=4;
                                                                                                            dece=0;
                                                                                                            uni=0;
                                                                                                            end    
                                                                                                                else if (unidades>126 && unidades<=130) begin
                                                                                                                unidades=0;
                                                                                                                mil=9;
                                                                                                                cent=7;
                                                                                                                dece=0;
                                                                                                                uni=0;
                                                                                                                end
                                                                                                                    //Unidades de 130 a limite
                                                                                                                    else  if(unidades>130 && unidades<=132)begin
                                                                                                                    unidades=0;
                                                                                                                    mil=9;
                                                                                                                    cent=9;
                                                                                                                    dece=0;
                                                                                                                    uni=0;
                                                                                                                    end    
                                                                                                                        else begin
                                                                                                                        unidades=uni;
                                                                                                                        mil=mil;
                                                                                                                        cent=cent;
                                                                                                                        dece=dece;
                                                                                                                        uni=uni;
                                                                                                                        end
 
    end
 
    else if (res_det==1 & conv_acum==0) begin
    unidades=0;
    mil=0;
    cent=0;
    dece=0;
    uni=0;
    end
 
        else if(res_det==1 & conv_acum==1) begin
        unidades=35;
        mil = 0;
        cent = 0;
        dece = 3;
        uni = 5;
        end
 
            else begin
            unidades=unidades;
            mil =mil;
            cent =cent;
            dece = dece;
            uni = uni;
        end
end
 
endmodule

El siguiente código sirve para que se muestre en los displays de siete segmentos de la FPGA las unidades corriendo y el valor a pagar

module Display
(    
    input[3:0] mil,
    input[3:0] cent,
     input[3:0] dece,
    input[3:0] uni,
    input clk,
    output reg[6:0] salidas,
    output reg[3:0] anodos,
    output reg dp
);
 
     reg [1:0]     actual;
     reg [1:0]  next;
     reg clk2=0;
     reg [25:0] cont=0;
 
    parameter  mil_disp=0, cent_disp=1, dece_disp=2, uni_disp=3;
 
    always @ (mil, cent, dece, uni, actual)begin
        case(actual)
 
        mil_disp: begin
            anodos = 4'b0111;
            dp=0;
            case (mil)     //gfedcba
 
            4'b0000: salidas  = 7'b1000000;
            4'b0001: salidas  = 7'b1111001;
            4'b0010: salidas  = 7'b0100100;
            4'b0011: salidas  = 7'b0110000;        
            4'b0100: salidas  = 7'b0011001;
            4'b0101: salidas  = 7'b0010010;
            4'b0110: salidas  = 7'b0000010;
            4'b0111: salidas  = 7'b1111000;    
            4'b1000: salidas  = 7'b0000000;
            4'b1001: salidas  = 7'b0010000;
            4'b1010: salidas  = 7'b0111111;
            default : salidas = 7'b1111111;
            endcase
                next=cent_disp;
        end
 
        cent_disp: begin
            anodos = 4'b1011;
            dp=1;
            case (cent)     //gfedcba
 
            4'b0000: salidas  = 7'b1000000;
            4'b0001: salidas  = 7'b1111001;
            4'b0010: salidas  = 7'b0100100;
            4'b0011: salidas  = 7'b0110000;
            4'b0100: salidas  = 7'b0011001;
            4'b0101: salidas  = 7'b0010010;
            4'b0110: salidas  = 7'b0000010;
            4'b0111: salidas  = 7'b1111000;
            4'b1000: salidas  = 7'b0000000;
            4'b1001: salidas  = 7'b0010000;
            4'b1010: salidas  = 7'b0111111;
            default : salidas = 7'b1111111;
            endcase
                next=dece_disp;
        end
 
        dece_disp: begin
             anodos = 4'b1101;
             dp=1;
            case (dece)     //gfedcba
 
            4'b0000: salidas  = 7'b1000000;
            4'b0001: salidas  = 7'b1111001;
            4'b0010: salidas  = 7'b0100100;
            4'b0011: salidas  = 7'b0110000;
            4'b0100: salidas  = 7'b0011001;
            4'b0101: salidas  = 7'b0010010;
            4'b0110: salidas  = 7'b0000010;
            4'b0111: salidas  = 7'b1111000;
            4'b1000: salidas  = 7'b0000000;
            4'b1001: salidas  = 7'b0010000;
            4'b1010: salidas  = 7'b0111111;
            default : salidas = 7'b1111111;
            endcase
                next=uni_disp;
        end
 
        uni_disp: begin
            anodos = 4'b1110;
            dp=1;
            case (uni)     //gfedcba
 
            4'b0000: salidas  = 7'b1000000;
            4'b0001: salidas  = 7'b1111001;
            4'b0010: salidas  = 7'b0100100;
            4'b0011: salidas  = 7'b0110000;
            4'b0100: salidas  = 7'b0011001;
            4'b0101: salidas  = 7'b0010010;
            4'b0110: salidas  = 7'b0000010;
            4'b0111: salidas  = 7'b1111000;
            4'b1000: salidas  = 7'b0000000;
            4'b1001: salidas  = 7'b0010000;
            4'b1010: salidas  = 7'b0111111;
            default : salidas = 7'b1111111;
            endcase
                next=mil_disp;
        end
 
        default: begin
            anodos=4'b1111;
            dp=1;
            salidas = 7'b1111111;
            next=mil_disp;
        end
 
        endcase
    end
 
    always @(posedge clk) begin
            if (cont < 12500) begin
            cont=cont+1;
            end
                else begin
                clk2= ~clk2;
                cont = 0;
                end
    end
 
    always @(posedge clk2) begin
            actual=next;
    end    
 
endmodule
Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-ShareAlike 3.0 License