资讯详情

京微齐力:基于HMEP060的OLED字符显示(及FUXI工程建立演示)

目录

  • 日常·唠嗑
  • 一、解释方案
    • 1、先看效果
    • 2、硬件选择
    • 3、FUXI工程建立
      • 1、软件安装
      • 2.建立工程(本版适合小白)
  • 二、OLED显示流程
    • 1、IIC驱动
    • 2、屏幕清除
    • 3、字符获取
    • 4、字符显示
  • 三、获取完整的工程

日常·唠嗑

接上个日常,最近在接触FUXI记得以前做过软件和一些测试。FPGA开发的时候特别羡慕学32的同学,可以用小0.96寸OLED显示屏作为应用,我用大块头LCD,两者相似,但开发也不同。借测试顺便完成了OLED展示愿望。 在这里插入图片描述

一、解释方案

1、先看效果

2、硬件选择

开发板(米联客)

3、FUXI工程建立

1、软件安装

软件安装,可直接在京微齐力官网下载安装包,然后发邮箱申请License。这一步,不说,有需要的私信我。 注意一下: FUXI软件在导入License代码时,最后一个网格可能会自动出现一个空格,应该去掉,否则注册将失败。

2.建立工程(本版适合小白)

双击图标,点击Create Project,建立新项目。 2.完成路径、工程名、顶层模块名三个地方。 3、选P1系列,32417芯片。finish 四、工程建成,编写Verilog文件 5、添加PLL IP核。注意: FUXI跟其他软件不一样,PLL IP全称在列表中: Phase-Locked Loop (v1.0b)。别傻了PLL。找不到的。 这个就是PLL IP。 6、例化IP核 1000开发板底板Mhz不能使用时钟,必须使用核心板的25Mhz是的。要50Mhz是的,所以一个例化了PLL IP。 7、综合RTL文件 8、分配IO约束 按第按第7步选择Rerun Project,整个项目 10、烧录 记得点Refresh刷新烧录文件。

二、OLED显示流程

其实很多人看文章都是想搞清楚流程,但是很多博主写的文章都是这一块,有头有尾,作者也有很深的体会。就跟大家大概捋一下流程:         上电做初始化(配置一些寄存器)→写IIC驱动模块(读写操作)→清屏→点亮屏幕→写入数据 FPGA模块:         顶层模块:JWQL_oled_v2_top         屏幕清除模块:Oled_Clear         IIC驱动模块:I2C_Master         屏幕全亮模块:Oled_On         显示控制模块:Oled_Show_control         信息缓存区模块:font_data

1、IIC驱动

        IIC即Inter-Integrated Circuit(集成电路总线),是由Philips半导体公司(现在的NXP半导体公司)在八十年代初设计出来的一种简单、双向、二线制总线标准。多用于主机和从机在数据量不大且传输距离短的场合下的主从通信。主机启动总线,并产生时钟用于传送数据,此时任何接收数据的器件均被认为是从机。         I2C总线由数据线SDA和时钟线SCL构成通信线路,既可用于发送数据,也可接收数据。在主控与被控IC之间可进行双向数据传送,数据的传输速率在标准模式下可达100kbit/s,在快速模式下可达400kbit/s,在高速模式下可达3.4Mbit/s,各种被控器件均并联在总线上,通过器件地址识别。         I2C_SCL是串行时钟线,I2C_SDA是串行数据线,由于I2C器件一般采用开漏结构与总线相连,所以I2C_SCL和I2C_SDA均需接上拉电阻,也正因此,当总线空闲时,这两条线路都 处于高电平状态,当连到总线上的任一器件输出低电平,都将使总线拉低,即各器件的SDA及 SCL都是“线与”关系。         I2C总线支持多主和主从两种工作方式,通常工作在主从工作方式,我们的开发板就采用主从工作方式。在主从工作方式中,系统中只有一个主机,其它器件都是具有I2C总线的外围从机。在主从工作方式中,主机启动数据的发送(发出启动信号)并产生时钟信号,数据发送完成后,发出停止信号。         I2C总线结构虽然简单,使用两线传输,然而要实现器件间的通信,需要通过控制SCL和SDA的时序,使其满足I2C的总线传输协议,方可实现器件间的数据传输。那么I2C协议的时序是怎样的呢?         在I2C器件开始通信(传输数据)之前,串行时钟线SCL和串行数据线SDA线由于上拉的原因处于高电平状态,此时I2C总线处于空闲状态。如果主机(此处指FPGA)想开始传输数据,只需在SCL为高电平时将SDA线拉低,产生一个起始信号,从机检测到起始信号后,准备接收数据,当数据传输完成,主机只需产生一个停止信号,告诉从机数据传输结束,停止信号的产生是在SCL为高电平时,SDA从低电平跳变到高电平,从机检测到停止信号后,停止接收数据。         I2C整体时序如下图。起始信号之前为空闲状态,起始信号之后到停止信号之前的这一段为数据传输状态,主机可以向从机写数据,也可以读取从机输出的数据,数据的传输由双向数据线(SDA)完成。停止信号产生后,总线再次处于空闲状态。

2、屏幕清除

//oled屏幕清除模块
module Oled_Clear(
	input		clk,
	input		rst,
	
	input		write_done,		//清除丿组数据完房
	
	input		clear_req,		//清除请求
	output		clear_ack,		//清除完成
	
	output[23:0]	 clear_data		//清除数据的命仿
);	

localparam			RST_T			=	1'b0;				//复位有效

reg[23:0]		clear_data_reg;


reg[3:0]	clear_page;
reg[7:0]	clear_index;

assign clear_data  = clear_data_reg;
assign clear_ack = (clear_index >= 'd130 && clear_page >= 'd7 && write_done == 1'b1) ? 1'b1 : 1'b0;//初始化完成信叿


always@(posedge clk or negedge rst)
begin
	if(rst == RST_T)
		clear_index <= 'd0;
	else if(clear_index == 'd130 && write_done == 1'b1 )
		clear_index <= 'd0;
	else if(write_done == 1'b1 && clear_req == 1'b1)
		clear_index <= clear_index + 1'b1;
	else
		clear_index <= clear_index;
end

always@(posedge clk or negedge rst)
begin
	if(rst == RST_T)
		clear_page <= 'd0;
	else if(clear_index == 'd130 && write_done == 1'b1 && clear_page == 'd7)
		clear_page <= 'd0;
	else if(clear_index == 'd130 && write_done == 1'b1)
		clear_page <= clear_page + 1'b1;
	else
		clear_page <= clear_page;
end
always@(*)
begin
	case(clear_index)
		'd0:clear_data_reg <= {8'h78,8'h00,8'hb0 + clear_page};
		'd1:clear_data_reg <= {8'h78,8'h00,8'h00};
		'd2:clear_data_reg <= {8'h78,8'h00,8'h10};
	default:clear_data_reg <= { 
        8'h78,8'h40,8'h00};
	endcase
	
end
endmodule 

3、字符获取

        其他模块代码,不讲,因为CSDN有很多STM32的文章有讲OLED显示原理,原理都是一样的,就是代码不一样而已,有兴趣的,可以看看别的大佬的文章,然后在文底下载工程自己看,可以移植到别的FPGA。         这里讲一下,怎么获取字符数据。         使用PCtoLCD2002完美版软件,设置按下面的设置。(字符提取软件我跟工程放一起,下载了,既可用)

4、字符显示

16x16大小的字符会占用两个page,每个page占用16列。所以可以将Oled看成只有2x16大小,这就和oled清屏是一样的了。设置page之后,再设置列地址,每输入一个数据,列地址会自动加一,字符数据的显示可以分为以下过程: 设置page,设置列地址,写入16个数据 设置page+1,设置列地址,写入16个数据。一共是写入2+16+2+16个数据,这样就完成了一个字符的显示。show_page的值为0或1。

always@(*)
begin
	case(show_index)
		'd0:show_data_reg <= {8'h78,8'h00,8'hb0 + show_page+start_y};
		'd1:show_data_reg <= {8'h78,8'h00,8'h00 +start_x[3:0]};
		'd2:show_data_reg <= {8'h78,8'h00,8'h10 + start_x[6:4]};
	default:show_data_reg <= { 
        8'h78,8'h40, data};
	endcase
end

三、完整工程获取

工程获取:FPGA:0.96寸oled字符显示(可直接运行)

鸣谢:本工程参考FPGA之旅开源工程,在此特地鸣谢,希望FPGA之旅越来越好。

标签: s324集成电路

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台