From: Thomas Pietrzak Date: Sun, 14 Oct 2018 21:41:12 +0000 (+0200) Subject: lcd boot sequence X-Git-Url: https://git.thomaspietrzak.com/?a=commitdiff_plain;h=cb43355070653ff8f966c1029da1a4a49ab68f42;p=testlcd.git lcd boot sequence --- diff --git a/lcd.ucf b/lcd.ucf index f24b1fa..fe142f9 100644 --- a/lcd.ucf +++ b/lcd.ucf @@ -7,51 +7,51 @@ NET "LED<1>" LOC = "T19" | IOSTANDARD = LVTTL | SLEW = QUIETIO | DRIVE = 4 ; NET "BUTTON" LOC = "T14" | IOSTANDARD = LVTTL | PULLDOWN ; -//NET "RL" LOC = "A13" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8 ; -//NET "TB" LOC = "B13" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8 ; +NET "RL" LOC = "A13" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8 ; +NET "TB" LOC = "B13" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8 ; /* LCD Input control */ -//NET "dclk" LOC = "A14" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8 ; -//NET "vsync" LOC = "B15" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8 ; -//NET "hsync" LOC = "A15" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8 ; -//NET "de" LOC = "A16" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8 ; +NET "dclk" LOC = "A14" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8 ; +NET "vsync" LOC = "B15" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8 ; +NET "hsync" LOC = "A15" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8 ; +NET "de" LOC = "A16" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8 ; /* Data red */ -//NET "tft_r_pins<7>" LOC = "A17" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8 ; -//NET "tft_r_pins<6>" LOC = "B17" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8 ; -//NET "tft_r_pins<5>" LOC = "A18" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8 ; -//NET "tft_r_pins<4>" LOC = "C18" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8 ; -//NET "tft_r_pins<3>" LOC = "A19" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8 ; -//NET "tft_r_pins<2>" LOC = "B19" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8 ; -//NET "tft_r_pins<1>" LOC = "A20" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8 ; -//NET "tft_r_pins<0>" LOC = "B20" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8 ; +NET "tft_r_pins<7>" LOC = "A17" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8 ; +NET "tft_r_pins<6>" LOC = "B17" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8 ; +NET "tft_r_pins<5>" LOC = "A18" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8 ; +NET "tft_r_pins<4>" LOC = "C18" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8 ; +NET "tft_r_pins<3>" LOC = "A19" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8 ; +NET "tft_r_pins<2>" LOC = "B19" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8 ; +NET "tft_r_pins<1>" LOC = "A20" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8 ; +NET "tft_r_pins<0>" LOC = "B20" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8 ; /* Data green */ -//NET "tft_g_pins<7>" LOC = "D19" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8 ; -//NET "tft_g_pins<6>" LOC = "D18" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8 ; -//NET "tft_g_pins<5>" LOC = "E17" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8 ; -//NET "tft_g_pins<4>" LOC = "D20" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8 ; -//NET "tft_g_pins<3>" LOC = "D21" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8 ; -//NET "tft_g_pins<2>" LOC = "D22" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8 ; -//NET "tft_g_pins<1>" LOC = "E22" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8 ; -//NET "tft_g_pins<0>" LOC = "F18" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8 ; +NET "tft_g_pins<7>" LOC = "D19" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8 ; +NET "tft_g_pins<6>" LOC = "D18" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8 ; +NET "tft_g_pins<5>" LOC = "E17" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8 ; +NET "tft_g_pins<4>" LOC = "D20" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8 ; +NET "tft_g_pins<3>" LOC = "D21" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8 ; +NET "tft_g_pins<2>" LOC = "D22" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8 ; +NET "tft_g_pins<1>" LOC = "E22" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8 ; +NET "tft_g_pins<0>" LOC = "F18" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8 ; /* Data blue */ -//NET "tft_b_pins<7>" LOC = "F20" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8 ; -//NET "tft_b_pins<6>" LOC = "E20" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8 ; -//NET "tft_b_pins<5>" LOC = "G20" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8 ; -//NET "tft_b_pins<4>" LOC = "G19" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8 ; -//NET "tft_b_pins<3>" LOC = "H19" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8 ; -//NET "tft_b_pins<2>" LOC = "J18" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8 ; -//NET "tft_b_pins<1>" LOC = "K18" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8 ; -//NET "tft_b_pins<0>" LOC = "K17" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8 ; +NET "tft_b_pins<7>" LOC = "F20" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8 ; +NET "tft_b_pins<6>" LOC = "E20" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8 ; +NET "tft_b_pins<5>" LOC = "G20" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8 ; +NET "tft_b_pins<4>" LOC = "G19" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8 ; +NET "tft_b_pins<3>" LOC = "H19" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8 ; +NET "tft_b_pins<2>" LOC = "J18" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8 ; +NET "tft_b_pins<1>" LOC = "K18" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8 ; +NET "tft_b_pins<0>" LOC = "K17" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8 ; /* serial port */ -//NET "SDI" LOC = "K19" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8 ; -//NET "SDO" LOC = "M20" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8 ; -//NET "SCL" LOC = "K20" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8 ; -//NET "CS" LOC = "L19" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8 ; +NET "SDI" LOC = "K19" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8 ; +NET "SDO" LOC = "M20" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8 ; +NET "SCL" LOC = "K20" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8 ; +NET "CS" LOC = "L19" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8 ; -//NET "RESET" LOC = "L18" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8 ; +NET "RESET" LOC = "L18" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8 ; diff --git a/testlcd.xise b/testlcd.xise new file mode 100644 index 0000000..4fec784 --- /dev/null +++ b/testlcd.xise @@ -0,0 +1,372 @@ + + + +
+ + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/top.v b/top.v index fce0dbf..5beff1d 100644 --- a/top.v +++ b/top.v @@ -1,12 +1,44 @@ module top( clkpin, button, - led + led, + sdi, + sdo, + scl, + cs, + reset, + rl, + tb, + tft_r_pins, + tft_g_pins, + tft_b_pins, + de, + dclk, + hsync, + vsync ); input clkpin; input button; output [3:0] led; +output sdi; +input sdo; +output scl; +output cs; +output reg reset = 0; +output rl; +output tb; +output reg [7:0]tft_r_pins; +output reg [7:0]tft_g_pins; +output reg [7:0]tft_b_pins; +output de; +output dclk; +output hsync; +output vsync; + +assign rl = 0; +assign tb = 0; +assign de = 0; wire clk; // 300MHz wire spiclk; // 20MHz @@ -22,29 +54,27 @@ clocks clocks_instance( .tftclk(tftclk) ); -reg slowclk; // 1Hz -reg [31:0] counter = 0; +reg [8:0] counter = 0; wire [23:0] spi_in; wire [23:0] spi_out; -wire mosi; -wire ssel; reg spi_r = 0; reg spi_s = 0; wire spi_done; -assign led[0] = ~slowclk; -assign led[1] = ~ssel; -assign led[2] = ~mosi; +assign led[0] = ~scl; +assign led[1] = ~cs; +assign led[2] = ~sdo; assign led[3] = ~spi_done; master_spi #( .WIDTH(24) ) master_spi_instance( - .clk(slowclk), - .mosi(mosi), - .miso(1'b0), - .ssel(ssel), + .clk(spiclk), + .sclk(scl), + .mosi(sdi), + .miso(sdo), + .ssel(cs), .din(spi_in), .dout(spi_out), .done(spi_done), @@ -108,11 +138,53 @@ end assign spi_in = init_sequence[index]; -reg [1:0] button_state = 0; +`define STATE_PULSE_WIDTH 0 +`define STATE_BACK_PORCH 1 +`define STATE_DISPLAY 2 +`define STATE_FRONT_PORCH 3 + +`define V_PULSE_WIDTH 2 +`define V_BACK_PORCH 16 +`define V_DISPLAY 240 +`define V_FRONT_PORCH 4 + +`define H_PULSE_WIDTH 2 +`define H_BACK_PORCH 66 +`define H_DISPLAY 320 +`define H_FRONT_PORCH 20 + +reg [1:0] vstate = `STATE_PULSE_WIDTH; +reg [1:0] hstate = `STATE_PULSE_WIDTH; +reg [8:0] vcounter = `V_PULSE_WIDTH; +reg [8:0] hcounter = `H_PULSE_WIDTH; + +reg screen_enabled = 0; + +ODDR2 #(.DDR_ALIGNMENT("NONE"), .INIT(1'b0), .SRTYPE("SYNC")) +oddr2_tft_clk( + .Q(dclk), + .C0(tftclk), + .C1(~tftclk), + .CE(screen_enabled), + .D0(1'b1), + .D1(1'b0), + .R(1'b0), + .S(1'b0)); -always @(posedge slowclk) begin +always @(posedge clk50) begin + if (counter == 500) begin + screen_enabled <= 1; + reset <= 1; + end else begin + counter <= counter + 1; + end +end + +reg [1:0] screen_state = 0; + +always @(posedge spiclk) begin case(state) - 0: if (button_state == 2'b10) begin state <= 1; index <= 0; end + 0: if (screen_state == 2'b01) begin state <= 1; index <= 0; end 1: begin state <= 2; spi_r <= 1; spi_s <= 0; end 2: begin state <= 3; spi_r <= 0; spi_s <= 1; end 3: begin @@ -123,16 +195,59 @@ always @(posedge slowclk) begin end end endcase - button_state <= { button_state[0], button }; + screen_state <= { screen_state[0], screen_enabled }; end -always @(posedge clk50) begin - if (counter == 25000000) begin - counter <= 0; - slowclk <= ~slowclk; +//assign de = vstate == `STATE_DISPLAY && hstate == `STATE_DISPLAY; +assign hsync = hstate == `STATE_PULSE_WIDTH; +assign vsync = vstate == `STATE_PULSE_WIDTH; + +reg [4:0] frame_counter = 0; + +always @(posedge tftclk) begin + if (screen_enabled) begin + if (hcounter == 0 + && vcounter == 0 + && vstate == `STATE_FRONT_PORCH + && hstate == `STATE_FRONT_PORCH + && frame_counter != 11) + frame_counter <= frame_counter + 1; + if (hcounter == 0) begin + hstate = hstate + 1; + case(hstate) + `STATE_PULSE_WIDTH: begin + hcounter <= `H_PULSE_WIDTH; + if (vcounter == 0) begin + vstate = vstate + 1; + case(vstate) + `STATE_PULSE_WIDTH: vcounter <= `V_PULSE_WIDTH; + `STATE_BACK_PORCH: vcounter <= `V_BACK_PORCH; + `STATE_DISPLAY: vcounter <= `V_DISPLAY; + `STATE_FRONT_PORCH: vcounter <= `V_FRONT_PORCH; + endcase + end else vcounter <= vcounter - 1; + end + `STATE_BACK_PORCH: hcounter <= `H_BACK_PORCH; + `STATE_DISPLAY: hcounter <= `H_DISPLAY; + `STATE_FRONT_PORCH: hcounter <= `H_FRONT_PORCH; + endcase + end else hcounter <= hcounter - 1; + end +end + +reg[7:0] pixel_counter = 0; +always @(posedge tftclk) begin + pixel_counter <= pixel_counter + 1; + if (frame_counter == 11) begin + tft_r_pins <= pixel_counter; + tft_g_pins <= pixel_counter; + tft_b_pins <= pixel_counter; end else begin - counter <= counter + 1; + tft_r_pins <= 0; + tft_g_pins <= 0; + tft_b_pins <= 0; end end + endmodule