FPGA驱动OLED Verilog代码 (四)

您所在的位置:网站首页 fpga的中文 FPGA驱动OLED Verilog代码 (四)

FPGA驱动OLED Verilog代码 (四)

2024-07-09 21:52| 来源: 网络整理| 查看: 265

一、概述:

        首先展示一下成果图,使用RAM的读写来完成,下面依次介绍各个模块

 二、OLED显示原理(部分)

        oled分为7页,每一页有128个字节用来显示

        首先先设置页地址,然后设置列的低地址和高地址(这里不是很理解,设置扫描方向吗?)

        设置好后依次写入128个显示数据,完成一页的显示,如果你的字模为8*8的,那这样就能完整显示出一个字了(如下图x一样)

         但是如果字体的高度大于8位怎么办了?

        就需要通过两页或者多页来进行显示了,字体被分成两半或者多半,然后在两页或者多页显示拼接出来(有时候会出现错位的问题,那就要注意写进去数据的位置了)

 三、RAM IP核的创建

        1、使用双端口的RAM,读写地址分开

         2、使用1024个字节

         3、勾选读使能信号

         4、取消勾选(这个好像会让输出延时一个时钟)

         5、没有提到的步骤就一路next然后finsh

四、RAM读模块

        先贴代码

/**************************************** 该模块用来不断读取ram中的数据,然后刷新OLED的显示 ****************************************/ module ram_read( input clk, //时钟信号 input rst_n, //按键复位信号 input write_done, //spi写完成信号 input init_done, //初始化完成 input[7:0] ram_data, //读取到的ram数据 output reg rden, //ram ip核的读使能信号 output [9:0] rdaddress, //ram ip核读地址 output reg ena_write, //spi 写使能信号 output reg oled_dc, //oled的dc写数据 写命令控制信号 output reg[7:0] data //传给 spi写的数据 ); parameter DELAY = 100_000; //刷新率1000_000/100_000 = 10Hz reg [20:0] us_cnt; //us计数器 上电延时等待 reg us_cnt_clr; //计数器清零信号 //状态说明 //等待初始化完成 写命令 等待写命令完成 //读ram数据 写数据 等待写数据完成 //数据读取完成一遍 parameter WaitInit=0,WriteCmd=1,WaitWriteCmd=2,ReadData=3,WriteData=4,WaitWriteData=5,Done=6; reg[2:0] state,next_state; //当前状态 和 下一个状态 reg [7:0] write_cmd[24:0]; //清零命令存储 reg [4:0] write_cmd_cnt; //清零命令计数 reg [10:0] address_cnt; //地址计数器 //读地址最多到1023 但是状态转换需要1024 所以使用额外的一个计数器来作为状态转换,同时也提供地址信号 //只是在地址计数器超过1024时,读地址就为0 assign rdaddress = (address_cnt >= 11'd1024) ? 10'd0 : address_cnt; //oled清零命令 //也就是设置页地址,设置显示的低地址和设置显示的高地址 //第7页在靠近引脚的位置,从高页写到地页,这么写方便自己查看 initial begin write_cmd[0] = 8'hB7;write_cmd[1] = 8'h00;write_cmd[2] = 8'h10;//第7页 write_cmd[3] = 8'hB6;write_cmd[4] = 8'h00;write_cmd[5] = 8'h10;//第6页 write_cmd[6] = 8'hB5;write_cmd[7] = 8'h00;write_cmd[8] = 8'h10;//第5页 write_cmd[9] = 8'hB4;write_cmd[10] = 8'h00;write_cmd[11] = 8'h10;//第4页 write_cmd[12] = 8'hB3;write_cmd[13] = 8'h00;write_cmd[14] = 8'h10;//第3页 write_cmd[15] = 8'hB2;write_cmd[16] = 8'h00;write_cmd[17] = 8'h10;//第2页 write_cmd[18] = 8'hB1;write_cmd[19] = 8'h00;write_cmd[20] = 8'h10;//第1页 write_cmd[21] = 8'hB0;write_cmd[22] = 8'h00;write_cmd[23] = 8'h10;//第0页 end //1微秒计数器 always @ (posedge clk,negedge rst_n) begin if (!rst_n) us_cnt


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3