Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- module LCD_CTRL(clk, reset, datain, cmd, cmd_valid, dataout, output_valid, busy);
- input clk;
- input reset;
- input [7:0] datain;
- input [2:0] cmd;
- input cmd_valid;
- output reg [7:0] dataout;
- output reg output_valid;
- output reg busy;
- reg [1:0]p_state,n_state;
- reg [7:0]data_buf[107:0];
- reg [3:0]ox,oy,cx,cy;
- reg [6:0]cnt;
- reg flag ;
- reg boundary;
- reg loaddone;
- reg IniDone1,IniDone2,IniDone3;
- //reg cnting;
- reg [9:0]tmp; // = 12*cy + cx;
- //data = 12y+x;
- parameter Initial_S = 2'b00,
- Load_Data = 2'b01,
- Zoom_Fit = 2'b10,
- Zoom_In = 2'b11;
- parameter Left = 4'b0010 ,
- Up = 4'b0010 ,
- Right= 4'b1010 ,
- Down = 4'b0111 ;
- /* State control */
- always@(*)
- begin
- if(reset)
- p_state <= Initial_S ;
- else
- p_state <= n_state ;
- end
- /* Next state logic */
- always@(posedge clk)
- begin
- if( (cmd_valid && !busy) )
- case(cmd)
- 3'b000 :
- n_state = Load_Data;
- 3'b001 :
- n_state = Zoom_In;
- 3'b010 :
- n_state = Zoom_Fit;
- 3'b011 :
- begin
- if( p_state == Zoom_Fit ) n_state = p_state ;
- else n_state = Zoom_In ;
- end
- 3'b100 :
- begin
- if( p_state == Zoom_Fit ) n_state = p_state ;
- else n_state = Zoom_In ;
- end
- 3'b101 :
- begin
- if( p_state == Zoom_Fit ) n_state = p_state ;
- else n_state = Zoom_In ;
- end
- 3'b110 :
- begin
- if( p_state == Zoom_Fit ) n_state = p_state ;
- else n_state = Zoom_In ;
- end
- default : ;
- endcase
- else if(loaddone)
- n_state = Zoom_Fit;
- end
- /* Output logic with Counter */
- always@(posedge clk)
- begin
- case(p_state)
- Initial_S :
- begin
- //busy <= 0;
- //output_valid <= 0;
- cnt <= 0;
- loaddone <= 0;
- cx <= 0;
- cy <= 0;
- IniDone1 <= 0;
- IniDone2 <= 0;
- IniDone3 <= 0;
- flag <= 0;
- end
- Load_Data :
- begin
- if( cnt != 0 && !IniDone1)
- begin
- cnt <= 0;
- IniDone1 <= 1;
- loaddone <= 0;
- // busy <= 1;
- //output_valid <= 0;
- end
- else if( cnt == 107)
- begin
- cnt <= 0;
- loaddone <= 1;
- IniDone1 <= 0;
- cy <= 4'b0001 ;
- cx <= 4'b0001 ;
- end
- else if(!loaddone)
- begin
- IniDone1 <= 1;
- IniDone2 <= 0;
- IniDone3 <= 0;
- //output_valid <= 0;
- // busy <= 1;
- cnt <= cnt + 1;
- end
- end
- Zoom_Fit :
- begin
- if( (cy != 4'b0001 || cx != 4'b0001) && !IniDone2)
- begin
- cy <= 4'b0001 ;
- cx <= 4'b0001 ;
- // busy <= 1;
- //output_valid <= 0;
- IniDone2 <= 1;
- flag <= 0;
- end
- else if( cx == 4'b1010 && cy == 4'b0111 )
- begin
- // busy <= 0;
- //output_valid <= 0;
- //cx <= 4'b0001 ;
- //cy <= 4'b0001 ;
- loaddone <= 0;
- IniDone2 <= 0;
- flag <= 1;
- end
- else if( cx == 4'b1010 )
- begin
- cx <= 4'b0001;
- cy <= cy + 2 ;
- end
- else
- begin
- IniDone1 <= 0;
- IniDone2 <= 1;
- IniDone3 <= 0;
- //output_valid <= 1;
- // busy <= 1;
- cx <= cx + 3 ;
- flag <= 0;
- end
- end
- Zoom_In :
- begin
- if( (((cy != oy - 2) || (cx != ox - 2)) && !IniDone3) || (boundary && !busy) )
- begin
- cy <= oy - 2 ;
- cx <= ox - 2 ;
- // busy <= 1;
- //output_valid <= 0;
- IniDone3 <= 1;
- flag <= 0;
- end
- else if( (cx == ox + 1) && (cy == oy + 1))
- begin
- //busy <= 0;
- //output_valid <= 0;
- cx <= ox - 2 ;
- cy <= oy - 2 ;
- //loaddone <= 0;
- IniDone3 <= 0;
- flag <= 1;
- end
- else if( cx == ox + 1 )
- begin
- cx <= ox - 2 ;
- cy <= cy + 1 ;
- end
- else
- begin
- IniDone1 <= 0;
- IniDone2 <= 0;
- IniDone3 <= 1;
- flag <= 0;
- // output_valid <= 1;
- //busy <= 1;
- cx <= cx + 1 ;
- end
- end
- default :
- begin
- //busy <= 0;
- //output_valid <= 0;
- end
- endcase
- end
- /* Boundary condition */
- always@(*)
- begin
- if(reset)
- boundary = 0;
- else if( (ox == Right) || (ox == Left) || (oy == Down) || (oy == Up))
- boundary = 1;
- else
- boundary = 0;
- end
- /* Busy and Output_valid control */
- always@(*)
- begin
- case(p_state)
- Initial_S :
- begin
- busy <= 0;
- output_valid <= 0;
- end
- Load_Data :
- begin
- if( cnt != 0 && !IniDone1)
- begin
- busy <= 1;
- output_valid <= 1;
- end
- else if(!loaddone)
- begin
- output_valid <= 0;
- busy <= 1;
- end
- end
- Zoom_Fit :
- begin
- //if( /*cx == 4'b1010 && cy == 4'b0111*/ flag )
- // begin
- // busy <= 0;
- // output_valid <= 0;
- //cx <= 4'b0001 ;
- //cy <= 4'b0001 ;
- // end
- //else
- if( cx == 4'b1010 && cy == 4'b0111 && flag)
- begin
- busy <= 0;
- output_valid <= 0;
- //cx <= 4'b0001 ;
- //cy <= 4'b0001 ;
- end
- else if( (cy != 4'b0001 || cx != 4'b0001) && !IniDone2)
- begin
- busy <= 1;
- //output_valid <= 1;
- end
- else
- begin
- output_valid <= 1;
- busy <= 1;
- end
- end
- Zoom_In :
- begin
- if( /*(cx == ox + 1) && (cy == oy + 1)*/ flag)
- begin
- busy <= 0;
- output_valid <= 0;
- end
- else if( ((cy != oy - 2) || (cx != ox - 2)) && !IniDone3)
- begin
- busy <= 1;
- //output_valid <= 1;
- end
- else
- begin
- output_valid <= 1;
- busy <= 1;
- end
- end
- default :
- begin
- busy <= 0;
- output_valid <= 0;
- end
- endcase
- end
- /* Cmd logic and origin control*/
- always@(*)
- begin
- case(cmd)
- 3'b000 :
- begin
- ox = 6;
- oy = 5;
- end
- 3'b001 ://zoomin
- begin
- if(!boundary)
- begin
- ox = 6;
- oy = 5;
- end
- else
- ;
- end
- 3'b010 ://zoomfit
- begin
- ox = 6;
- oy = 5;
- end
- 3'b011 :
- begin
- if( ox < Right )
- ox = ox + 1;
- else
- ox = ox ;
- end
- 3'b100 :
- begin
- if( ox > Left )
- ox = ox - 1;
- else
- ox = ox ;
- end
- 3'b101 :
- begin
- if( oy > Up )
- oy = oy - 1;
- else
- oy = oy ;
- end
- 3'b110 :
- begin
- if( oy < Down )
- oy = oy + 1 ; // oy = 3 ; // PASS
- else
- oy = oy ;
- end
- /*default :
- begin
- ;
- end*/
- endcase
- end
- /* Data processing */
- always@(*)
- begin
- if(busy)
- begin
- case(n_state)
- Load_Data :
- begin
- data_buf[cnt] <= datain;
- end
- default :
- begin
- dataout <= data_buf[tmp];
- end
- endcase
- end
- end
- always@(*)
- begin
- tmp <= 12*cy + cx;
- end
- endmodule
Advertisement
Add Comment
Please, Sign In to add comment