////////////////////////////////////////////////////////////////////////////////// // Company: Universidad Pontificia Bolivariana Seccional Bucaramanga, Semillero ADT // Engineer: Holguer A Becerra // // Create Date: 18:07:43 03/11/2010 // Design Name: // Module Name: Encoder // Project Name: // Target Devices: // Tool versions: // Description: // // Dependencies: // // Revision: // Revision 0.01 - File Created // Additional Comments: // ////////////////////////////////////////////////////////////////////////////////// module encoder(A,B,reset,encoder_pos,dir_out,zero); // numero de pulsos del encoder parameter NUM_OF_PULSES=9'd500; input A;// Entrada A del Encoder input B;// Entrada B del Encoder input reset; output [8:0]encoder_pos;// salida del encoder respecto al punto de iniciacion output [1:0]dir_out;// direccion para donde va el rotor del encoder, dependiendo de la conexion A y B, cuando se inicia es 0, y 2 o 1 de acuerdo al sentido de giro output zero;// Dependiendo del punto de iniciacion, esta salida marca un pulso si pasa nuevamente por la posicion inicial reg [8:0]counter=9'd0; reg [1:0]dir_out_temp=2'd0; assign dir_out[1:0]=dir_out_temp[1:0]; assign encoder_pos[8:0]=counter[8:0]; // paso por zero assign zero=(counter==9'd0); // conteo de pulsos always@(posedge A,negedge reset) begin if(!reset) begin counter<=9'd0; end else begin if(B) begin if(counter==9'd0)counter<=NUM_OF_PULSES-1'b1; else counter<=counter-9'd1; end else begin if(counter==(NUM_OF_PULSES-1'b1))counter<=9'd0; else counter<=counter+9'd1; end end end // sentido de giro always@(posedge A, negedge reset) begin if(!reset) begin dir_out_temp<=2'd0; end else begin if(B) begin dir_out_temp<=2'b01; end else begin dir_out_temp<=2'b10; end end end endmodule