当前位置: 首页 > news >正文

LCD字符图片显示——FPGA学习笔记11

一、字模显示原理

字模数据:将这个0/1矩阵按照屏幕扫描的顺序以字节的形式体现。

取模软件设计:

点阵数要按照实际情况填写

 二、实验任务

        本节的实验任务是通过开发板上的RGB TFT-LCD接口,在RGB LCD液晶屏的左上角位置从上到下依次显示图片以及汉字“你好,FPGA”。其中每个汉字的大小为32*32,图片的大小为770*306

三、程序设计

1、lcd_display框架:

`timescale 1ns / 1psmodule lcd_display(
input               sys_clk     ,       
input               sys_rst_n   ,       input       [10:0]  pixel_xpos  ,       //像素点横坐标
input       [10:0]  pixel_ypos  ,       //像素点纵坐标
output  reg [23:0]  pixel_data          //像素点数据);localparam  PIC_X_START     = 11'd15;      //图片起始点横坐标
localparam  PIC_Y_START     = 11'd15;       //图片起始点纵坐标
localparam  PIC_WIDTH       = 11'd164;      //图片宽度
localparam  PIC_HEIGHT      = 11'd57;      //图片高度localparam  CHAR_X_START    = 11'd15;      //字符起始点横坐标
localparam  CHAR_Y_START    = 11'd75;       //字符起始点纵坐标
localparam  CHAR_WIDTH      = 11'd160;      //字符宽度
localparam  CHAR_HEIGHT     = 11'd32;       //字符高度localparam  BACK_COLOR      = 24'hE0FFFF;   //背景颜色  浅蓝色
localparam  CHAR_COLOR      = 24'hff0000;   //字体颜色,红色reg     [160:0] char[31:0]  ;       //二维寄存器
reg     [13:0]  rom_addr    ;       //ROM地址wire    [10:0]  x_cnt       ;
wire    [10:0]  y_cnt       ;
wire            rom_rd_en   ;
wire    [23:0]  rom_rd_data ;assign rom_rd_en = 1'b1;            //始终使能
assign x_cnt = pixel_xpos + 1'b1 - CHAR_X_START;
assign y_cnt = pixel_ypos - CHAR_Y_START;//给二维寄存器写入字符信息   你好,FPGA
always @(posedge sys_clk) beginchar[0 ] <= 160'h0000000000000000000000000000000000000000;char[1 ] <= 160'h0000000000000000000000000000000000000000;char[2 ] <= 160'h0000000000000000000000000040000001000000;char[3 ] <= 160'h0000000000000000000000000070600001C00000;char[4 ] <= 160'h0000000000000000000000000060E00001800020;char[5 ] <= 160'h00000000000000000000000000E0C0000181FFF0;char[6 ] <= 160'h7FFC7FF003C003800000000000C0C00001800070;char[7 ] <= 160'h181C18180C3003800000000000C18000010000C0;char[8 ] <= 160'h1804180C08100380000000000181801803080080;char[9 ] <= 160'h1802180618180380000000000103FFFC3FFC0100;char[10] <= 160'h18021806300804C0000000000303001803080600;char[11] <= 160'h18001806300804C0000000000386103003080600;char[12] <= 160'h18001806200004C00000000007840C2002180600;char[13] <= 160'h18101806600004C0000000000D8C084006180600;char[14] <= 160'h1810180660000C40000000000988080006180600;char[15] <= 160'h1830180C60000860000000001190080004180618;char[16] <= 160'h1FF018186000086000000000118188000417FFFC;char[17] <= 160'h18301FE06000086000000000218388800C300600;char[18] <= 160'h18101800607E182000000000018308400C300600;char[19] <= 160'h1810180060181FF0000000000183082008300600;char[20] <= 160'h1810180060181030070000000186083008600600;char[21] <= 160'h18001800201810300F800000018608180E600600;char[22] <= 160'h18001800301810300F800000018C081C01C00600;char[23] <= 160'h1800180030182018078000000188080C00F00600;char[24] <= 160'h1800180010182018018000000190080C00BC0600;char[25] <= 160'h1800180018182018030000000190080C018C0600;char[26] <= 160'h180018000C20601C0200000001A0080003040600;char[27] <= 160'h7E007E0007C0F83E040000000180080004000600;char[28] <= 160'h0000000000000000180000000180F8000800FC00;char[29] <= 160'h0000000000000000000000000180380030001C00;char[30] <= 160'h0000000000000000000000000100100000000800;char[31] <= 160'h0000000000000000000000000000000000000000;/*"D:\开发素材\FPGA文本\FPGA你好.BMP",0*/
end//为LCD不同区域显示绘制图片、字符和背景颜色
always @(posedge sys_clk or negedge sys_rst_n ) beginif (!sys_rst_n) beginpixel_data <= 24'h0;end else if((pixel_xpos >= PIC_X_START - 1'b1) && (pixel_xpos < PIC_X_START + PIC_WIDTH - 1'b1) && (pixel_ypos >= PIC_Y_START) && (pixel_ypos < PIC_Y_START + PIC_HEIGHT))beginpixel_data <= rom_rd_data;endelse if ((pixel_xpos >= CHAR_X_START - 1'b1) && (pixel_xpos < CHAR_X_START + CHAR_WIDTH - 1'b1) && (pixel_ypos >= CHAR_Y_START) && (pixel_ypos < CHAR_Y_START + CHAR_HEIGHT)) beginif (char[y_cnt][CHAR_WIDTH -1'b1 - x_cnt] == 1'b1) beginpixel_data <= CHAR_COLOR;end else beginpixel_data <= BACK_COLOR;endendelse beginpixel_data <= BACK_COLOR;end
end//根据当前扫描点的横纵坐标为ROM地址赋值
always @(posedge sys_clk or negedge sys_rst_n ) beginif (!sys_rst_n) beginrom_addr <= 14'd0;end //当位于图片显示区域的时候ROM地址进行累加else if((pixel_ypos >= PIC_Y_START) && (pixel_ypos < PIC_Y_START + PIC_HEIGHT) && (pixel_xpos >= PIC_X_START - 2'd2) && (pixel_xpos < PIC_X_START + PIC_WIDTH - 2'd2))beginrom_addr <= rom_addr + 1'b1;                                                   end//当横坐标位于图片最后一个像素点时,ROM地址清零else if (pixel_ypos >= PIC_Y_START + PIC_HEIGHT) beginrom_addr <= 18'd0;end else beginrom_addr <= rom_addr;end
endRGB_LCD u_RGB_LCD (.clka(sys_clk),    // input wire clka.ena(rom_rd_en),      // input wire ena.addra(rom_addr),  // input wire [13 : 0] addra.douta(rom_rd_data)  // output wire [23 : 0] douta);endmodule

其他部分均沿用上期博客LCD彩条显示——FPGA学习笔记10-CSDN博客的代码

文件结构如图所示:

2、ROM  IP核

3、仿真

字符显示:

图片显示:

四、下载验证

五、总结

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Java项目——苍穹外卖(一)
  • RTMP播放器延迟最低可以做到多少?
  • 【习题】Native适配开发
  • GPIO 简介(STM32F407)
  • 【达梦数据库】部署注意事项话术
  • 安卓玩机工具------vivo机型线刷救砖固件 下载工具操作步骤预览
  • Oracle SQL Developer:数据库开发与数据管理的利器
  • Java XML
  • 【Rust练习】12.枚举
  • dp算法练习【7】
  • 使用i2c子系统驱动i2c oled模块
  • 基于移动互联网的校内物业报修管理系统设计与实现(论文+源码)_kaic
  • FFmpeg读取文件列表
  • 【Android面试八股文】你能说说FragmentPagerAdapter 和 FragmentStatePagerAdapter的区别吗?
  • Go 语言的优势
  • [iOS]Core Data浅析一 -- 启用Core Data
  • 30秒的PHP代码片段(1)数组 - Array
  • Android系统模拟器绘制实现概述
  • CSS 专业技巧
  • Java 网络编程(2):UDP 的使用
  • Java多线程(4):使用线程池执行定时任务
  • JS 面试题总结
  • php中curl和soap方式请求服务超时问题
  • Vue.js-Day01
  • 对话 CTO〡听神策数据 CTO 曹犟描绘数据分析行业的无限可能
  • 给github项目添加CI badge
  • 判断客户端类型,Android,iOS,PC
  • 强力优化Rancher k8s中国区的使用体验
  • 深入体验bash on windows,在windows上搭建原生的linux开发环境,酷!
  • 系统认识JavaScript正则表达式
  • 小程序button引导用户授权
  • ​Java并发新构件之Exchanger
  • ​学习一下,什么是预包装食品?​
  • #pragma data_seg 共享数据区(转)
  • (09)Hive——CTE 公共表达式
  • (2.2w字)前端单元测试之Jest详解篇
  • (6)设计一个TimeMap
  • (Redis使用系列) Springboot 使用redis实现接口Api限流 十
  • (windows2012共享文件夹和防火墙设置
  • (翻译)terry crowley: 写给程序员
  • (附源码)springboot 智能停车场系统 毕业设计065415
  • (附源码)ssm基于jsp的在线点餐系统 毕业设计 111016
  • (回溯) LeetCode 131. 分割回文串
  • (五)c52学习之旅-静态数码管
  • (一)Neo4j下载安装以及初次使用
  • (转)MVC3 类型“System.Web.Mvc.ModelClientValidationRule”同时存在
  • (转)shell中括号的特殊用法 linux if多条件判断
  • .bat批处理(八):各种形式的变量%0、%i、%%i、var、%var%、!var!的含义和区别
  • .net Application的目录
  • .Net core 6.0 升8.0
  • .NET Standard 的管理策略
  • @Autowired和@Resource的区别
  • @DateTimeFormat 和 @JsonFormat 注解详解
  • @Transactional 竟也能解决分布式事务?
  • @vue/cli 3.x+引入jQuery