黑金开发板板上实现的液晶刷屏程序(1)
1、首先介绍一下手中的资源配置
(声明:本人只是黑金开发板的用户,并非黑金技术支持)
FPGA芯片型号:Cyclone IV,EP4CE15
液晶参数:SSD1289,320*240,RGB(565)
开发板from:黑金淘宝官网
TFT液晶from:黑金淘宝官网
2、向上一张贴图:
3、贴上自己的源码:
1)显示部分代码:
1 module TFT( 2 //system 3 CLK, 4 RSTn, 5 //tft signal 6 LCD_CS, 7 LCD_RS, 8 LCD_RD, 9 LCD_WR, 10 LCD_RST, 11 LCD_DATA 12 ); 13 14 input CLK; 15 input RSTn; 16 //TIF signal wire 17 output LCD_CS; 18 output LCD_RS; 19 output LCD_RD; 20 output LCD_WR; 21 output LCD_RST; 22 output [15:0] LCD_DATA; 23 24 reg LCD_CS; 25 reg LCD_RS; 26 reg LCD_WR; 27 reg [15:0] LCD_DATA; 28 29 assign LCD_RD = 1'b1; 30 assign LCD_RST = 1'b1; 31 32 reg [3:0] state_lcd_write; 33 reg [7:0] addr_command; 34 reg [16:0] LCD_DATA_TEMP; 35 reg [31:0] count_dot; 36 reg [15:0] count_delay; 37 always @(posedge CLK or negedge RSTn) 38 if(!RSTn) 39 begin 40 state_lcd_write <= 4'd0; 41 LCD_CS <= 1'b1; 42 LCD_WR <= 1'b1; 43 LCD_RS <= 1'b0; 44 LCD_DATA <= 16'd0; 45 addr_command <= 8'd0; 46 LCD_DATA_TEMP <= 17'd0; 47 count_dot <= 16'd0; 48 count_delay <= 16'd0; 49 end 50 else 51 begin 52 case(state_lcd_write) 53 4'd0: 54 if(count_delay == 16'd2499)//init delay 55 begin 56 state_lcd_write <= 4'd1; 57 count_delay <= 16'd0; 58 end 59 else 60 begin 61 state_lcd_write <= 4'd0; 62 count_delay <= count_delay + 1'b1; 63 end 64 4'd1: 65 if(count_delay == 16'd999)//dot delay 66 begin 67 state_lcd_write <= 4'd2; 68 LCD_CS <= 1'b1; 69 LCD_WR <= 1'b1; 70 LCD_DATA_TEMP<=display_command(addr_command); 71 count_delay <= 16'd0; 72 end 73 else 74 begin 75 state_lcd_write <= 4'd1; 76 count_delay <= count_delay + 1'b1; 77 end 78 4'd2: 79 if(LCD_DATA_TEMP[16])//data 80 begin 81 state_lcd_write <= state_lcd_write + 1'b1; 82 LCD_CS <= 1'b0; 83 LCD_RS <= 1'b0; 84 LCD_WR <= 1'b0; 85 LCD_DATA<= LCD_DATA_TEMP[15:0]; 86 end 87 else //command 88 begin 89 state_lcd_write <= state_lcd_write + 1'b1; 90 LCD_CS <= 1'b0; 91 LCD_RS <= 1'b1; 92 LCD_WR <= 1'b0; 93 LCD_DATA<= LCD_DATA_TEMP[15:0]; 94 end 95 4'd3: 96 state_lcd_write <= state_lcd_write + 1'b1; 97 4'd4: 98 begin 99 state_lcd_write <= state_lcd_write + 1'b1; 100 LCD_CS <= 1'b1; 101 end 102 4'd5: 103 begin 104 state_lcd_write <= state_lcd_write + 1'b1; 105 LCD_WR <= 1'b1; 106 end 107 4'd6:if(addr_command == 8'd83) //red 108 begin 109 count_dot <= count_dot + 1'b1; 110 state_lcd_write <= 4'd1; 111 if(count_dot == 32'd76800 ) 112 begin 113 addr_command <= 8'd84; 114 count_dot <= 32'd1; 115 end 116 else state_lcd_write <= 4'd1; 117 end 118 else if(addr_command == 8'd84) //white 119 begin 120 count_dot <= count_dot + 1'b1; 121 state_lcd_write <= 4'd1; 122 if(count_dot ==32'd76800 ) 123 begin 124 addr_command <= 8'd83; 125 count_dot <= 32'd0; 126 end 127 else state_lcd_write <= 4'd1; 128 end 129 else 130 begin 131 addr_command <= addr_command + 1'b1; 132 state_lcd_write <= 4'd0; 133 end 134 4'd7:state_lcd_write <= 4'd7; 135 136 137 endcase 138 end 139 140 function [16:0] display_command; 141 input [7:0]addr; 142 begin 143 case (addr) 144 8'd0:display_command = {1'b1,16'h0000}; 145 8'd1:display_command = {1'b0,16'h0001}; 146 147 8'd2:display_command = {1'b1,16'h0003}; 148 8'd3:display_command = {1'b0,16'h6664}; 149 150 8'd4:display_command = {1'b1,16'h000C}; 151 8'd5:display_command = {1'b0,16'h0000}; 152 153 8'd6:display_command = {1'b1,16'h000D}; 154 8'd7:display_command = {1'b0,16'h080C}; 155 156 8'd8:display_command = {1'b1,16'h000E}; 157 8'd9:display_command = {1'b0,16'h2B00}; 158 159 8'd10:display_command = {1'b1,16'h001E}; 160 8'd11:display_command = {1'b0,16'h00B0}; 161 162 8'd12:display_command = {1'b1,16'h0001}; 163 8'd13:display_command = {1'b0,16'h2B3F}; 164 165 8'd14:display_command = {1'b1,16'h0002}; 166 8'd15:display_command = {1'b0,16'h0600}; 167 168 8'd16:display_command = {1'b1,16'h0010}; 169 8'd17:display_command = {1'b0,16'h0000}; 170 171 8'd18:display_command = {1'b1,16'h0011};//set display control mode 172 8'd19:display_command = {1'b0,16'h6070}; 173 174 8'd20:display_command = {1'b1,16'h0005}; 175 8'd21:display_command = {1'b0,16'h0000}; 176 177 8'd22:display_command = {1'b1,16'h0006}; 178 8'd23:display_command = {1'b0,16'h0000}; 179 180 8'd24:display_command = {1'b1,16'h0016}; 181 8'd25:display_command = {1'b0,16'hEF1C}; 182 183 8'd26:display_command = {1'b1,16'h0017}; 184 8'd27:display_command = {1'b0,16'h0003}; 185 8'd28:display_command = {1'b1,16'h0007}; 186 8'd29:display_command = {1'b0,16'h0233}; 187 8'd30:display_command = {1'b1,16'h000B}; 188 8'd31:display_command = {1'b0,16'h0000}; 189 8'd32:display_command = {1'b1,16'h000F}; 190 8'd33:display_command = {1'b0,16'h0000}; 191 8'd34:display_command = {1'b1,16'h0041}; 192 8'd35:display_command = {1'b0,16'h0000}; 193 8'd36:display_command = {1'b1,16'h0042}; 194 8'd37:display_command = {1'b0,16'h0000}; 195 196 8'd38:display_command = {1'b1,16'h0048}; 197 8'd39:display_command = {1'b0,16'h0000}; 198 199 8'd40:display_command = {1'b1,16'h0049}; 200 8'd41:display_command = {1'b0,16'h013F}; 201 202 8'd42:display_command = {1'b1,16'h004A}; 203 8'd43:display_command = {1'b0,16'h0000}; 204 205 8'd44:display_command = {1'b1,16'h004B}; 206 8'd45:display_command = {1'b0,16'h0000}; 207 208 8'd46:display_command = {1'b1,16'h0044};//horizontal ram address 209 8'd47:display_command = {1'b0,16'hEF00}; 210 211 8'd48:display_command = {1'b1,16'h0045};//v 212 8'd49:display_command = {1'b0,16'h0000}; 213 214 8'd50:display_command = {1'b1,16'h0046}; 215 8'd51:display_command = {1'b0,16'h013f}; 216 217 8'd52:display_command = {1'b1,16'h0030}; 218 8'd53:display_command = {1'b0,16'h0707}; 219 220 8'd54:display_command = {1'b1,16'h0031}; 221 8'd55:display_command = {1'b0,16'h0204}; 222 223 8'd56:display_command = {1'b1,16'h0032}; 224 8'd57:display_command = {1'b0,16'h0204}; 225 226 8'd58:display_command = {1'b1,16'h0033}; 227 8'd59:display_command = {1'b0,16'h0502}; 228 229 8'd60:display_command = {1'b1,16'h0034}; 230 8'd61:display_command = {1'b0,16'h0507}; 231 232 8'd62:display_command = {1'b1,16'h0035}; 233 8'd63:display_command = {1'b0,16'h0204}; 234 235 8'd64:display_command = {1'b1,16'h0036}; 236 8'd65:display_command = {1'b0,16'h0204}; 237 238 8'd66:display_command = {1'b1,16'h0037}; 239 8'd67:display_command = {1'b0,16'h0502}; 240 241 8'd68:display_command = {1'b1,16'h003A}; 242 8'd69:display_command = {1'b0,16'h0302}; 243 244 8'd70:display_command = {1'b1,16'h003B}; 245 8'd71:display_command = {1'b0,16'h0302}; 246 247 8'd72:display_command = {1'b1,16'h0023}; 248 8'd73:display_command = {1'b0,16'h0000}; 249 250 8'd74:display_command = {1'b1,16'h0024}; 251 8'd75:display_command = {1'b0,16'h0000}; 252 253 8'd76:display_command = {1'b1,16'h0025}; 254 8'd77:display_command = {1'b0,16'h8000}; 255 256 8'd78:display_command = {1'b1,16'h004E};//光标位置X 257 8'd79:display_command = {1'b0,16'h00ef}; 258 259 8'd80:display_command = {1'b1,16'h004F};//光标位置Y 260 8'd81:display_command = {1'b0,16'h013f}; 261 262 8'd82:display_command = {1'b1,16'h0022};//开始RAM显示 263 8'd83:display_command = {1'b0,16'hf800}; 264 8'd84:display_command = {1'b0,16'hffff}; 265 266 default:display_command = {1'b0,16'h0000}; 267 endcase 268 end 269 endfunction 270 271 272 endmodule
2)引脚配置TCL文件:
1 set_location_assignment PIN_K15 -to LCD_CS 2 set_location_assignment PIN_J16 -to LCD_RS 3 set_location_assignment PIN_L16 -to LCD_RST 4 set_location_assignment PIN_L14 -to LCD_RD 5 set_location_assignment PIN_K16 -to LCD_WR 6 7 set_location_assignment PIN_T14 -to LCD_DATA[15] 8 set_location_assignment PIN_R13 -to LCD_DATA[14] 9 set_location_assignment PIN_T15 -to LCD_DATA[13] 10 set_location_assignment PIN_R14 -to LCD_DATA[12] 11 set_location_assignment PIN_P14 -to LCD_DATA[11] 12 set_location_assignment PIN_L9 -to LCD_DATA[10] 13 set_location_assignment PIN_N14 -to LCD_DATA[9] 14 set_location_assignment PIN_N12 -to LCD_DATA[8] 15 set_location_assignment PIN_L13 -to LCD_DATA[7] 16 set_location_assignment PIN_M11 -to LCD_DATA[6] 17 set_location_assignment PIN_R16 -to LCD_DATA[5] 18 set_location_assignment PIN_K12 -to LCD_DATA[4] 19 set_location_assignment PIN_P16 -to LCD_DATA[3] 20 set_location_assignment PIN_P15 -to LCD_DATA[2] 21 set_location_assignment PIN_N16 -to LCD_DATA[1] 22 set_location_assignment PIN_N15 -to LCD_DATA[0] 23 # 24 25 set_location_assignment PIN_A9 -to CLK 26 set_location_assignment PIN_M1 -to RSTn
谢谢指正!如需要交流,请留言!