RenHao

9x11_v3_16err

Apr 6th, 2015
300
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. module LCD_CTRL(clk, reset, datain, cmd, cmd_valid, dataout, output_valid, busy);
  2.  
  3.  
  4. input clk;
  5. input reset;
  6. input [7:0] datain;
  7. input [2:0] cmd;
  8. input cmd_valid;
  9.  
  10.  
  11. output reg [7:0] dataout;
  12. output reg output_valid;
  13. output reg busy;
  14.  
  15. reg [1:0]p_state,n_state;
  16. reg [7:0]data_buf[107:0];
  17. reg [3:0]ox,oy,cx,cy;
  18. reg [6:0]cnt;
  19. reg flag ;
  20. reg boundary;
  21. reg loaddone;
  22. reg IniDone1,IniDone2,IniDone3;
  23. //reg cnting;
  24. reg [9:0]tmp; // = 12*cy + cx;
  25. //data = 12y+x;
  26.  
  27. parameter Initial_S = 2'b00,
  28.              Load_Data = 2'b01,
  29.              Zoom_Fit  = 2'b10,
  30.              Zoom_In      = 2'b11;
  31.              
  32. parameter Left = 4'b0010 ,
  33.              Up = 4'b0010 ,
  34.              Right= 4'b1010 ,
  35.              Down = 4'b0111 ;
  36.  
  37. /* State control */
  38. always@(*)
  39. begin
  40.     if(reset)
  41.         p_state <= Initial_S ;
  42.     else
  43.         p_state <= n_state ;
  44. end
  45.  
  46. /* Next state logic */
  47. always@(posedge clk)
  48. begin
  49. if( (cmd_valid && !busy) )
  50.     case(cmd)
  51.         3'b000  :
  52.                             n_state = Load_Data;
  53.         3'b001  :
  54.                             n_state = Zoom_In;
  55.         3'b010  :
  56.                             n_state = Zoom_Fit;
  57.         3'b011  :
  58.             begin
  59.                             if( p_state == Zoom_Fit )   n_state = p_state ;
  60.                             else                               n_state = Zoom_In ;
  61.             end
  62.         3'b100  :
  63.             begin
  64.                             if( p_state == Zoom_Fit )   n_state = p_state ;
  65.                             else                               n_state = Zoom_In ;
  66.             end
  67.         3'b101  :
  68.             begin
  69.                             if( p_state == Zoom_Fit )   n_state = p_state ;
  70.                             else                               n_state = Zoom_In ;
  71.             end
  72.         3'b110  :
  73.             begin
  74.                             if( p_state == Zoom_Fit )   n_state = p_state ;
  75.                             else                               n_state = Zoom_In ;
  76.             end
  77.         default :       ;
  78.     endcase
  79. else if(loaddone)
  80.     n_state = Zoom_Fit;
  81. end
  82.  
  83. /* Output logic with Counter */
  84. always@(posedge clk)
  85. begin
  86.     case(p_state)
  87.             Initial_S   :
  88.                 begin
  89.                     //busy <= 0;
  90.                     //output_valid <= 0;
  91.                     cnt <= 0;
  92.                     loaddone <= 0;
  93.                     cx <= 0;
  94.                     cy <= 0;
  95.                     IniDone1 <= 0;
  96.                     IniDone2 <= 0;
  97.                     IniDone3 <= 0;
  98.                     flag <= 0;
  99.                 end
  100.             Load_Data   :
  101.                 begin
  102.                     if( cnt != 0 && !IniDone1)
  103.                         begin
  104.                             cnt <= 0;
  105.                             IniDone1 <= 1;
  106.                             loaddone <= 0;
  107.                         //  busy <= 1;
  108.                             //output_valid <= 0;
  109.                         end
  110.                     else if( cnt == 107)   
  111.                         begin
  112.                             cnt <= 0;
  113.                             loaddone <= 1;
  114.                             IniDone1 <= 0;
  115.                             cy <= 4'b0001 ;
  116.                             cx <= 4'b0001 ;
  117.                         end
  118.                     else if(!loaddone)
  119.                         begin
  120.                             IniDone1 <= 1;
  121.                             IniDone2 <= 0;
  122.                             IniDone3 <= 0;
  123.                             //output_valid <= 0;
  124.                         //  busy <= 1;
  125.                             cnt <= cnt + 1;
  126.                         end
  127.                 end
  128.             Zoom_Fit        :
  129.                 begin
  130.                     if( (cy != 4'b0001 || cx != 4'b0001) && !IniDone2)
  131.                         begin
  132.                             cy <= 4'b0001 ;
  133.                             cx <= 4'b0001 ;
  134.                         //  busy <= 1;
  135.                             //output_valid <= 0;
  136.                             IniDone2 <= 1;
  137.                             flag <= 0;
  138.                         end
  139.                     else if( cx == 4'b1010 && cy == 4'b0111 )  
  140.                         begin
  141.                         //  busy <= 0;
  142.                             //output_valid <= 0;
  143.                             //cx <= 4'b0001 ;
  144.                             //cy <= 4'b0001 ;
  145.                             loaddone <= 0;
  146.                             IniDone2 <= 0;
  147.                             flag <= 1;
  148.                         end
  149.                     else if( cx == 4'b1010 )
  150.                         begin
  151.                             cx <= 4'b0001;
  152.                             cy <= cy + 2 ;
  153.                         end
  154.                     else
  155.                         begin
  156.                             IniDone1 <= 0;
  157.                             IniDone2 <= 1;
  158.                             IniDone3 <= 0;
  159.                             //output_valid <= 1;
  160.                         //  busy <= 1;
  161.                             cx <= cx + 3 ;
  162.                             flag <= 0;
  163.                         end
  164.                 end
  165.            
  166.             Zoom_In     :
  167.                 begin
  168.                     if( (((cy != oy - 2) || (cx != ox - 2)) && !IniDone3) || (boundary && !busy) )
  169.                         begin
  170.                             cy <= oy - 2 ;
  171.                             cx <= ox - 2 ;
  172.                         //  busy <= 1;
  173.                             //output_valid <= 0;
  174.                             IniDone3 <= 1;
  175.                             flag <= 0;
  176.                         end
  177.                     else if( (cx == ox + 1) && (cy == oy + 1))
  178.                         begin
  179.                             //busy <= 0;
  180.                             //output_valid <= 0;
  181.                             cx <= ox - 2 ;
  182.                             cy <= oy - 2 ;
  183.                             //loaddone <= 0;
  184.                             IniDone3 <= 0;
  185.                             flag <= 1;
  186.                         end
  187.                     else if( cx == ox + 1 )
  188.                         begin
  189.                             cx <= ox - 2 ;
  190.                             cy <= cy + 1 ;
  191.                         end
  192.                     else
  193.                         begin
  194.                             IniDone1 <= 0;
  195.                             IniDone2 <= 0;
  196.                             IniDone3 <= 1;
  197.                             flag <= 0;
  198.                         //  output_valid <= 1;
  199.                             //busy <= 1;
  200.                             cx <= cx + 1 ;
  201.                            
  202.                         end
  203.                 end
  204.            
  205.             default     :
  206.                 begin
  207.                     //busy <= 0;
  208.                     //output_valid <= 0;
  209.                 end
  210.     endcase
  211. end
  212. /* Boundary condition */
  213. always@(*)
  214. begin
  215.     if(reset)
  216.         boundary = 0;
  217.     else if( (ox == Right) || (ox == Left) || (oy == Down) || (oy == Up))
  218.         boundary = 1;
  219.     else
  220.         boundary = 0;
  221. end
  222.  
  223. /* Busy and Output_valid control */
  224. always@(*)
  225. begin
  226.     case(p_state)
  227.             Initial_S   :
  228.             begin
  229.                             busy <= 0;
  230.                             output_valid <= 0;
  231.             end
  232.                            
  233.             Load_Data   :
  234.                 begin
  235.                     if( cnt != 0 && !IniDone1)
  236.                         begin
  237.                             busy <= 1;
  238.                             output_valid <= 1;
  239.                         end
  240.                     else if(!loaddone)
  241.                         begin
  242.                             output_valid <= 0;
  243.                             busy <= 1;
  244.                         end
  245.                 end
  246.             Zoom_Fit        :
  247.                 begin
  248.                    
  249.                     //if( /*cx == 4'b1010 && cy == 4'b0111*/ flag )
  250.                     //  begin
  251.                     //      busy <= 0;
  252.                     //      output_valid <= 0;
  253.                             //cx <= 4'b0001 ;
  254.                             //cy <= 4'b0001 ;
  255.                     //  end
  256.                     //else
  257.                     if( cx == 4'b1010 && cy == 4'b0111 && flag)
  258.                         begin
  259.                             busy <= 0;
  260.                             output_valid <= 0;
  261.                             //cx <= 4'b0001 ;
  262.                             //cy <= 4'b0001 ;
  263.                         end
  264.                     else if( (cy != 4'b0001 || cx != 4'b0001) && !IniDone2)
  265.                         begin
  266.                             busy <= 1;
  267.                             //output_valid <= 1;
  268.                         end
  269.                     else
  270.                         begin
  271.                             output_valid <= 1;
  272.                             busy <= 1;
  273.                         end
  274.                 end
  275.            
  276.             Zoom_In     :
  277.                 begin
  278.                     if( /*(cx == ox + 1) && (cy == oy + 1)*/ flag)
  279.                         begin
  280.                             busy <= 0;
  281.                             output_valid <= 0;
  282.                         end
  283.                     else if( ((cy != oy - 2) || (cx != ox - 2)) && !IniDone3)
  284.                         begin
  285.                             busy <= 1;
  286.                             //output_valid <= 1;
  287.                         end
  288.                     else
  289.                         begin
  290.                             output_valid <= 1;
  291.                             busy <= 1;
  292.                         end
  293.                 end
  294.            
  295.             default     :
  296.                     begin
  297.                         busy <= 0;
  298.                         output_valid <= 0;
  299.                     end
  300.     endcase
  301. end
  302. /* Cmd logic and origin control*/
  303. always@(*)
  304. begin
  305.     case(cmd)
  306.         3'b000  :
  307.                         begin
  308.                             ox = 6;
  309.                             oy = 5;
  310.                         end
  311.         3'b001  ://zoomin
  312.                         begin
  313.                             if(!boundary)
  314.                             begin
  315.                                 ox = 6;
  316.                                 oy = 5;
  317.                             end
  318.                             else
  319.                                 ;
  320.                         end
  321.         3'b010  ://zoomfit
  322.                         begin
  323.                             ox = 6;
  324.                             oy = 5;
  325.                         end
  326.         3'b011  :
  327.                         begin
  328.                         if( ox < Right )
  329.                             ox = ox + 1;
  330.                         else
  331.                             ox = ox ;
  332.                         end
  333.         3'b100  :
  334.                         begin
  335.                         if( ox > Left )
  336.                             ox = ox - 1;
  337.                         else
  338.                             ox = ox ;
  339.                         end
  340.         3'b101  :
  341.                         begin
  342.                         if( oy > Up )
  343.                             oy = oy - 1;
  344.                         else
  345.                             oy = oy ;
  346.                         end
  347.         3'b110  :
  348.                         begin
  349.                         if( oy < Down )
  350.                             oy = oy + 1 ; // oy = 3 ; // PASS
  351.                         else
  352.                             oy = oy ;
  353.                         end
  354.         /*default   :
  355.                         begin
  356.                             ;
  357.                         end*/
  358.     endcase
  359. end
  360.  
  361.  
  362.  
  363. /* Data processing */
  364. always@(*)
  365. begin
  366.     if(busy)
  367.     begin
  368.         case(n_state)
  369.             Load_Data   :
  370.                 begin
  371.                     data_buf[cnt] <= datain;
  372.                 end
  373.             default     :
  374.                 begin
  375.                     dataout <= data_buf[tmp];
  376.                 end
  377.         endcase
  378.     end
  379. end
  380. always@(*)
  381. begin
  382.     tmp <= 12*cy + cx;
  383. end
  384.  
  385. endmodule
Advertisement
Add Comment
Please, Sign In to add comment