`timescale 1ns / 1ps ////////////////////////////////////////////////////////////////////////////////// // Company: // Engineer: // // Create Date: 12:08:44 06/28/2016 // Design Name: // Module Name: FSM_controller // Project Name: // Target Devices: // Tool versions: // Description: // // Dependencies: // // Revision: // Revision 0.01 - File Created // Additional Comments: // ////////////////////////////////////////////////////////////////////////////////// `include "def.v" module FSM_control ( input rst , input clk , output [`DATAWIDTH-1:0] data_in , output reg tft_rst , output reg enable , input busy , output reg RS ); parameter INITIAL = 2'b00, DATA_CHECK = 2'b01, COMMAND = 2'b10, // PARAMETERS = 3'b110, COMPLETED = 2'b11; //internal signals reg [1:0] state, next_state ; reg [`DISPCOUNT-1:0] count = 0; reg [`DATAWIDTH-1:0] data = 0; reg [`DATACOUNT-1:0] counter = 0; assign data_in = data ; always@(posedge clk) begin if(~rst) count <= 0; else if((count == `DISPMAXCOUNT) || (counter == 57)) count <= 0; else count <= count + 1'b1; end //count logic for data sent always@(posedge clk) begin if(~rst) counter <= 0; else if(counter == 58) counter <= 58; else if((state == COMMAND) && busy) counter <= counter + 1'b1; end //present state logic always@(posedge clk) begin if(~rst) state <= INITIAL; else state <= next_state; end //next state logic always@(*) begin case(state) INITIAL : if(tft_rst && (count == `DISPMAXCOUNT)) next_state = DATA_CHECK ; else next_state = INITIAL ; DATA_CHECK : if(((data == 8'hB0) && (RS == 0)) && busy) next_state = COMMAND ; else next_state = DATA_CHECK ; COMMAND : /*if(busy && ((data == 8'h29) && (enable == 0))) next_state = INITIAL ; else*/ next_state = COMMAND ; default : next_state = INITIAL ; endcase end //output logic always@(*) begin case(state) INITIAL : begin tft_rst = 1'b0 ; enable = 1 ; if(count == `DISPMAXCOUNT) tft_rst = 1'b1 ; RS = 1'b0 ; data = 8'h00 ; end DATA_CHECK : begin RS = 1'b0 ; data = 8'hB0 ; if(count == `DISPMAXCOUNT) enable = 1'b0 ; end COMMAND : begin if(counter == 0) begin RS = 1'b1 ; data = 8'h80 ; //serial DOUT enable control end else if(counter == 1) begin RS = 1'b0 ; data = 8'hC0 ; end else if(counter == 2) begin RS = 1'b1 ; data = 8'h0A ; //P-Gamma level end else if(counter == 3) begin RS = 1'b1 ; data = 8'h0A ; //N-Gamma level end else if(counter == 4) begin RS = 1'b0 ; data = 8'hC1 ; //BT & VC Setting end else if(counter == 5) begin RS = 1'b1 ; data = 8'h45 ; end else if(counter == 6) begin RS = 1'b1 ; data = 8'h07 ; //VCI1 = 2.5V end else if(counter == 7) begin RS = 1'b0 ; data = 8'hC2 ; //DC1.DC0 Setting end else if(counter == 8) begin RS = 1'b1 ; data = 8'h33 ; end else if(counter == 9) begin RS = 1'b0 ; data = 8'hC5 ; end else if(counter == 10) begin RS = 1'b1 ; data = 8'h00 ; end else if(counter == 11) begin RS = 1'b1 ; data = 8'h42 ; //VCM Setting VCOM voltage level for reduce the flicker issue end else if(counter == 12) begin RS = 1'b1 ; data = 8'h80 ; //VCM Register Enable end else if(counter == 13) begin RS = 1'b0 ; data = 8'hB1 ; end else if(counter == 14) begin RS = 1'b1 ; data = 8'hD0 ; //Frame Rate Setting end else if(counter == 15) begin RS = 1'b1 ; data = 8'h11 ; end else if(counter == 16) begin RS = 1'b0 ; data = 8'hB4 ; end else if(counter == 17) begin RS = 1'b1 ; data = 8'h02 ; //00: Column inversion; 02: Dot2 inversion end else if(counter == 18) begin RS = 1'b0 ; data = 8'hB6 ; //RM.DM Setting end else if(counter == 19) begin RS = 1'b1 ; data = 8'h00 ; end else if(counter == 20) begin RS = 1'b1 ; data = 8'h02 ; end else if(counter == 21) begin RS = 1'b1 ; data = 8'h3B ; end else if(counter == 22) begin RS = 1'b0 ; data = 8'hB7 ; // Entry Mode end else if(counter == 23) begin RS = 1'b1 ; data = 8'h07 ; end else if(counter == 24) begin RS = 1'b0 ; data = 8'h36 ; //Color filter setting end else if(counter == 25) begin RS = 1'b1 ; data = 8'h2B ; //row/column exchange end else if(counter == 26) begin RS = 1'b0 ; data = 8'hF0 ; //Enter ENG , must be set before gamma setting end else if(counter == 27) begin RS = 1'b1 ; data = 8'h36 ; end else if(counter == 28) begin RS = 1'b1 ; data = 8'hA5 ; end else if(counter == 29) begin RS = 1'b1 ; data = 8'hD3 ; end else if(counter == 30) begin RS = 1'b0 ; data = 8'hE5 ; //Open gamma function , must be set before gamma setting end else if(counter == 31) begin RS = 1'b1 ; data = 8'h80 ; end else if(counter == 32) begin RS = 1'b0 ; data = 8'hE5 ; end else if(counter == 33) begin RS = 1'b1 ; data = 8'h01 ; end else if(counter == 34) begin RS = 1'b0 ; data = 8'hB3 ; end else if(counter == 35) begin RS = 1'b1 ; data = 8'h00 ; end else if(counter == 36) begin RS = 1'b0 ; data = 8'hE5 ; end else if(counter == 37) begin RS = 1'b1 ; data = 8'h00 ; end else if(counter == 38) begin RS = 1'b0 ; data = 8'hF0 ; //Exit ENG , must be set before gamma setting end else if(counter == 39) begin RS = 1'b1 ; data = 8'h36 ; end else if(counter == 40) begin RS = 1'b1 ; data = 8'hA5 ; end else if(counter == 41) begin RS = 1'b1 ; data = 8'h53 ; end else if(counter == 42) begin RS = 1'b0 ; data = 8'hE0 ; //Gamma setting end else if(counter == 43) begin RS = 1'b1 ; data = 8'h00 ; end else if(counter == 44) begin RS = 1'b1 ; data = 8'h35 ; end else if(counter == 45) begin RS = 1'b1 ; data = 8'h33 ; end else if(counter == 46) begin RS = 1'b1 ; data = 8'h00 ; end else if(counter == 47) begin RS = 1'b1 ; data = 8'h00 ; end else if(counter == 48) begin RS = 1'b1 ; data = 8'h00 ; end else if(counter == 49) begin RS = 1'b1 ; data = 8'h00 ; end else if(counter == 50) begin RS = 1'b1 ; data = 8'h35 ; end else if(counter == 51) begin RS = 1'b1 ; data = 8'h33 ; end else if(counter == 52) begin RS = 1'b1 ; data = 8'h00 ; end else if(counter == 53) begin RS = 1'b1 ; data = 8'h00 ; end else if(counter == 54) begin RS = 1'b1 ; data = 8'h00 ; end else if(counter == 55) begin RS = 1'b0 ; data = 8'h3A ; //interface setting end else if(counter == 56) begin RS = 1'b1 ; data = 8'h55 ; end else if(counter == 57) begin RS = 1'b0 ; data = 8'h11 ; //Exit sleep mode if((data == 8'h11) && busy) enable = 1'b1; end else if(counter == 58) begin if(count == `DISPMAXCOUNT) begin RS = 1'b0 ; data = 8'h29 ; //Display on end else if((data == 8'h11) && (count == `DISPMAXCOUNT-2)) enable = 1'b0; else if(data == 8'h29 && busy) begin enable = 1'b1 ; data = 8'h29 ; end end end default : begin RS = 1'b0 ; data = 8'h00 ; tft_rst = 1'b0 ; enable = 1'b1 ; end endcase end endmodule