FPGA驱动OLED动态显示(Verilog代码)——OLED初始化

/*--------------------------------------------------------------*\
	Filename	:	initial_control.v
	Author		:	Cwang
	Description	:	
	Revision History	:	2017-10-16
							Revision 1.0
	Email		:	wangcp@hitrobotgroup.com
	Company		:	Micro nano institute
	Copyright(c) 2017,Micro nano institute,All right resered
\*---------------------------------------------------------------*/
module initial_control(
	clk_1m,
	rst_n,
	
	initial_start,
	spi_write_done,
	
	spi_write_start,
	spi_data,
	initial_done,
	res_oled		//OLED的RES脚用来复位,低电平复位
);

	input clk_1m;
	input rst_n;
	input initial_start;
	input spi_write_done;
	
	output spi_write_start;
	output [9:0] spi_data;
	output initial_done;
	output reg res_oled;
	//--------------------------------------
	//复位OLED
	
	parameter RES100MS = 20'd100000;
	reg [19:0] count;
	reg res_done;
	always @(posedge clk_1m or negedge rst_n)
	begin
		if(!rst_n)
		begin
			count <= 20'd0;
			res_oled <= 1'b0;
			res_done <= 1'b0;
		end
		else
			if(count == RES100MS)
			begin
				res_oled <= 1'b1;
				res_done <= 1'b1;
				count <= RES100MS;
			end
			else
			begin
				count <= count + 1'b1;
				res_oled <= 1'b0;
				res_done <= 1'b0;
			end
	end
	
	//--------------------------------------
	reg [7:0] i;
	reg start;
	reg [9:0] data;
	reg isdone;

	//--------------------------------------------------------
	
	always@(posedge clk_1m or negedge rst_n)
	begin
		if(!rst_n)
		begin
			i <= 8'd0;
			start <= 1'b0;
			isdone <= 1'b0;
			data <= {2'b11,8'd0};
		end
		else	
		begin
			if(initial_start && res_done)
			begin
				case(i)
			//-------------------------------------------------------------------------------------	
					8'd0:
						if(spi_write_done) begin start <= 1'b0; i <= i + 1'b1;end
						else 			   begin data  <= {2'b00,8'hae}; start <= 1'b1;end
					8'd1:
						if(spi_write_done) begin start <= 1'b0; i <= i + 1'b1;end
						else 			   begin data  <= {2'b00,8'h00}; start <= 1'b1;end	
					8'd2:
						if(spi_write_done) begin start <= 1'b0; i <= i + 1'b1;end
						else 			   begin data  <= {2'b00,8'h10}; start <= 1'b1;end
					8'd3:
						if(spi_write_done) begin start <= 1'b0; i <= i + 1'b1;end
						else 			   begin data  <= {2'b00,8'h40}; start <= 1'b1;end
					8'd4:
						if(spi_write_done) begin start <= 1'b0; i <= i + 1'b1;end
						else 			   begin data  <= {2'b00,8'h81}; start <= 1'b1;end
					8'd5:
						if(spi_write_done) begin start <= 1'b0; i <= i + 1'b1;end
						else 			   begin data  <= {2'b00,8'hCF}; start <= 1'b1;end
					8'd6:
						if(spi_write_done) begin start <= 1'b0; i <= i + 1'b1;end
						else 			   begin data  <= {2'b00,8'hA1}; start <= 1'b1;end
					8'd7:
						if(spi_write_done) begin start <= 1'b0; i <= i + 1'b1;end
						else 			   begin data  <= {2'b00,8'hC8}; start <= 1'b1;end
					8'd8:
						if(spi_write_done) begin start <= 1'b0; i <= i + 1'b1;end
						else 			   begin data  <= {2'b00,8'hA6}; start <= 1'b1;end
					8'd9:
						if(spi_write_done) begin start <= 1'b0; i <= i + 1'b1;end
						else 			   begin data  <= {2'b00,8'hA8}; start <= 1'b1;end
					8'd10:
						if(spi_write_done) begin start <= 1'b0; i <= i + 1'b1;end
						else 			   begin data  <= {2'b00,8'h3F}; start <= 1'b1;end
					8'd11:
						if(spi_write_done) begin start <= 1'b0; i <= i + 1'b1;end
						else 			   begin data  <= {2'b00,8'hD3}; start <= 1'b1;end
					8'd12:
						if(spi_write_done) begin start <= 1'b0; i <= i + 1'b1;end
						else 			   begin data  <= {2'b00,8'h00}; start <= 1'b1;end
					8'd13:
						if(spi_write_done) begin start <= 1'b0; i <= i + 1'b1;end
						else 			   begin data  <= {2'b00,8'hD5}; start <= 1'b1;end
					8'd14:
						if(spi_write_done) begin start <= 1'b0; i <= i + 1'b1;end
						else 			   begin data  <= {2'b00,8'h80}; start <= 1'b1;end
					8'd15:
						if(spi_write_done) begin start <= 1'b0; i <= i + 1'b1;end
						else 			   begin data  <= {2'b00,8'hD9}; start <= 1'b1;end
					8'd16:
						if(spi_write_done) begin start <= 1'b0; i <= i + 1'b1;end
						else 			   begin data  <= {2'b00,8'hF1}; start <= 1'b1;end
					8'd17:
						if(spi_write_done) begin start <= 1'b0; i <= i + 1'b1;end
						else 			   begin data  <= {2'b00,8'hDA}; start <= 1'b1;end
					8'd18:
						if(spi_write_done) begin start <= 1'b0; i <= i + 1'b1;end
						else 			   begin data  <= {2'b00,8'h12}; start <= 1'b1;end
					8'd19:
						if(spi_write_done) begin start <= 1'b0; i <= i + 1'b1;end
						else 			   begin data  <= {2'b00,8'hDB}; start <= 1'b1;end
					8'd20:
						if(spi_write_done) begin start <= 1'b0; i <= i + 1'b1;end
						else 			   begin data  <= {2'b00,8'h40}; start <= 1'b1;end
					8'd21:
						if(spi_write_done) begin start <= 1'b0; i <= i + 1'b1;end
						else 			   begin data  <= {2'b00,8'h20}; start <= 1'b1;end
					8'd22:
						if(spi_write_done) begin start <= 1'b0; i <= i + 1'b1;end
						else 			   begin data  <= {2'b00,8'h02}; start <= 1'b1;end
					8'd23:
						if(spi_write_done) begin start <= 1'b0; i <= i + 1'b1;end
						else 			   begin data  <= {2'b00,8'h8D}; start <= 1'b1;end
					8'd24:
						if(spi_write_done) begin start <= 1'b0; i <= i + 1'b1;end
						else 			   begin data  <= {2'b00,8'h14}; start <= 1'b1;end
					8'd25:
						if(spi_write_done) begin start <= 1'b0; i <= i + 1'b1;end
						else 			   begin data  <= {2'b00,8'hA4}; start <= 1'b1;end
					8'd26:
						if(spi_write_done) begin start <= 1'b0; i <= i + 1'b1;end
						else 			   begin data  <= {2'b00,8'hA6}; start <= 1'b1;end
					8'd27:
						if(spi_write_done) begin start <= 1'b0; i <= i + 1'b1;end
						else 			   begin data  <= {2'b00,8'hAF}; start <= 1'b1;end
			//--------------------------------------------------------------------------------			
					8'd28:
						begin
							data <= {2'b11,8'd0}; isdone <= 1'b1; i <= i + 1'b1;
						end
					8'd29:
						begin
							isdone <= 1'b0; i <= 8'd0;
						end
					
				endcase
			end
		end
	end
	
	
	assign spi_data = data;
	assign spi_write_start = start;
	assign initial_done = isdone;

endmodule
	
	
	
	
	


注释:

1、以上初始化数据是针对驱动芯片SSD1306,128*64的OLED;

2、应该先复位OLED;

3、初始化之后应该将片选CS置高,如8'd28:data <= {2'b11,8'd0};

posted @ 2017-10-23 10:20  王纯配  阅读(1179)  评论(0编辑  收藏  举报