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

news2024/9/17 8:58:55

一、字模显示原理

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

取模软件设计:

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

 二、实验任务

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

三、程序设计

1、lcd_display框架:

`timescale 1ns / 1ps

module 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) begin
    char[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 ) begin
    if (!sys_rst_n) begin
        pixel_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))begin
        pixel_data <= rom_rd_data;
    end
    else 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)) begin
        if (char[y_cnt][CHAR_WIDTH -1'b1 - x_cnt] == 1'b1) begin
            pixel_data <= CHAR_COLOR;
        end 
        else begin
            pixel_data <= BACK_COLOR;
        end
    end
    else begin
        pixel_data <= BACK_COLOR;
    end
end

//根据当前扫描点的横纵坐标为ROM地址赋值
always @(posedge sys_clk or negedge sys_rst_n ) begin
    if (!sys_rst_n) begin
        rom_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))begin
        rom_addr <= rom_addr + 1'b1;                                                   
    end
    //当横坐标位于图片最后一个像素点时,ROM地址清零
    else if (pixel_ypos >= PIC_Y_START + PIC_HEIGHT) begin
        rom_addr <= 18'd0;
    end 
    else begin
        rom_addr <= rom_addr;
    end
end

RGB_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、仿真

字符显示:

图片显示:

四、下载验证

五、总结

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2117082.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【数据结构】希尔排序(缩小增量排序)

目录 一、基本思想 1.1 引入希尔排序的原因 1.2 基本思想 二、思路分析 三、gap分组问题 四、代码实现 4.1 代码一&#xff08;升序&#xff09; 4.2 代码二&#xff08;升序&#xff09; 五、易错提醒 六、时间复杂度分析 七、排序小tips 一、基本思想 1.1 引入希尔…

Vue3:<Teleport>传送门组件的使用和注意事项

你好&#xff0c;我是沐爸&#xff0c;欢迎点赞、收藏、评论和关注。 Vue3 引入了一个新的内置组件 <Teleport>&#xff0c;它允许你将子组件树渲染到 DOM 中的另一个位置&#xff0c;而不是在父组件的模板中直接渲染。这对于需要跳出当前组件的 DOM 层级结构进行渲染的…

15.1 JDBC数据库编程1

目录 15 引言 15.1.1 数据库语言SQL 15.2 JDBC体系结构 15.2.1 JDBC访问数据库 15.2.2 JDBC API介绍 15 引言 数据库系统&#xff08;database system,DBS&#xff09;由一个互相关联的数据集合和一组用以访问这些数据的程序组成。这个数据集合通常称为数据库。 …

音频-语言大模型原理

重磅推荐专栏: 《大模型AIGC》 《课程大纲》 《知识星球》 本专栏致力于探索和讨论当今最前沿的技术趋势和应用领域,包括但不限于ChatGPT和Stable Diffusion等。我们将深入研究大型模型的开发和应用,以及与之相关的人工智能生成内容(AIGC)技术。通过深入的技术解析和实践经…

YOLOv8改进实战 | 注意力篇 | CloFormer: 注意力机制与卷积的完美融合CloAtention,即插即用

YOLOv8专栏导航:点击此处跳转 前言 YOLOv8 是由 YOLOv5 的发布者 Ultralytics 发布的最新版本的 YOLO。它可用于对象检测、分割、分类任务以及大型数据集的学习,并且可以在包括 CPU 和 GPU 在内的各种硬件上执行。 YOLOv8 是一种尖端的、最先进的 (SOTA) 模型,它建立在以前…

(C++) 6大作用域

文章目录 &#x1f365;前言&#x1f365;C 6大作用域&#x1f41f;块&#x1f41f;名字空间&#x1f41f;类&#x1f41f;函数参数&#x1f41f;枚举&#x1f41f;模板参数 ⭐END&#x1f31f;交流方式 &#x1f365;前言 在 C core guidelines 中有一个准则&#xff1a; ES.…

深入探索Unity协程:揭开CSharp迭代器背后的神秘面纱

协程是一种特殊类型的迭代器方法&#xff0c;允许你在多个帧之间分段执行代码。可以用来处理时间延迟、异步操作和顺序执行的任务&#xff0c;而不阻塞主线程。Unity协程的实现依赖于C#语言提供的迭代器相关的语言特性&#xff0c;所以想要弄清楚Unity协程的底层原理&#xff0…

web群集--nginx配置文件location匹配符的优先级顺序详解及验证

文章目录 前言优先级顺序优先级顺序(详解)1. 精确匹配&#xff08;Exact Match&#xff09;2. 正则表达式匹配&#xff08;Regex Match&#xff09;3. 前缀匹配&#xff08;Prefix Match&#xff09; 匹配规则的综合应用验证优先级 前言 location的作用 在 NGINX 中&#xff0…

Idea Mac代码调试常用快捷键~

Mac截图 commandShift4 idea英文大写转小写 commandShiftU 功能&#xff1a;查看类的实现和继承父类的方法 快捷键 fncommandF12 鼠标点击打开 功能&#xff1a;查看当前方法的上游方法 选中方法&#xff0c;controloptionH 功能&#xff1a;CommandB是查看本类的方法 功能&…

Matlab simulink建模与仿真 第十一章(端口及子系统库)【下】

参考视频&#xff1a;simulink1.1simulink简介_哔哩哔哩_bilibili 八、触发使能子系统 1、Enabled and Triggered Subsystem触发使能子系统概述 触发使能子系统其实是触发子系统和使能子系统二者的结合&#xff0c;当触发端口传来触发信号时&#xff0c;使能端口的输入需要大…

TitleBar:打造高效Android标题栏的新选择

在Android应用开发中&#xff0c;标题栏是用户界面的重要组成部分。一个好的标题栏不仅能够提升应用的专业感&#xff0c;还能增强用户体验。然而&#xff0c;传统的标题栏实现方式往往存在代码冗余、样式不统一、性能开销大等问题。今天&#xff0c;我们将介绍一个名为TitleBa…

自定义类型:结构体(续)

目录 一. 结构体的内存对齐 1.1 为什么存在内存对齐&#xff1f; 1.2 修改默认对齐数 二. 结构体传参 三. 结构体实现位段 一. 结构体的内存对齐 在前面的文章里我们已经讲过一部分的内存对齐的知识&#xff0c;并举出了两个例子&#xff0c;我们再举出两个例子继续说明&…

python进阶篇-day08-数据结构与算法(线性结构介绍与链表实现)

数据的存储和组织形式 程序 数据结构 算法 一. 算法介绍 概述目的 都是可以提高程序的效率(性能), 面试高频考点 数据结构介绍 数据的存储和组织形式, 同样的空间, 不同的结构, 存储的数据不同, 操作方式也不同 算法介绍 为了解决实际的业务问题, 而考虑出来的方法和思路 …

龙芯+FreeRTOS+LVGL实战笔记(新)——06添加二级按钮

本专栏是笔者另一个专栏《龙芯+RT-Thread+LVGL实战笔记》的姊妹篇,主要的区别在于实时操作系统的不同,章节的安排和任务的推进保持一致,并对源码做了完善与优化,各位可以先到本人主页下去浏览另一专栏的博客列表(目前已撰写36篇,图1所示),再决定是否订阅。此外,也可以…

超强的截图工具:PixPin

你是否还在为寻找一款功能强大、操作简便的截图工具而烦恼&#xff1f;市面上那么多工具&#xff0c;常常让人无从选择。今天&#xff0c;想给大家安利一款神器——PixPin&#xff0c;一款真正解放双手的截图工具。 想象一下&#xff0c;你只需要按下快捷键就能轻松完成多种截…

雷电9模拟器安装magisk和lsposed

模拟器环境配置 1、开启root 2、开启System.vmdk可写入 安装magisk 1、新建模拟器、开启root权限、并安装debug版magisk 下载地址去上面吾爱论坛作者文章下载吧&#xff01;支持他一下&#xff01; 2、打开magisk的app&#xff0c;点击安装 如果弹出获取权限&#xff0c;直接…

【Socket网络编程原理实践】

socket 基于 TCP/IP协议实现&#xff0c;在网络模型中属于传输层 Java 网络编程中的核心概念 IP 地址&#xff1a;用于标识网络中的计算机端口号&#xff1a;用于标识计算机上的应用程序或进程Socket&#xff08;套接字&#xff09;&#xff1a;网络通信的基本单位&#xff0…

冒泡排序算法介绍

冒泡排序算法介绍 如果真的累了&#xff0c;就拉上窗帘关上手机关掉闹钟深呼吸一口气钻进被窝&#xff0c;好好地睡一觉&#xff0c;难熬的日子总需要一些温暖&#xff0c;而什么都不如被窝的温暖来的踏实。 冒泡排序是一种经典的排序算法&#xff0c;它通过重复遍历待排序的序…

如何恢复回收站中已删除/清空的文件

回收站清空后如何恢复已删除的文件&#xff1f;是否可以恢复永久删除的文件&#xff1f;或者最糟糕的是&#xff0c;如果文件直接被删除怎么办&#xff1f;本文将向您展示清空回收站后恢复已删除数据的最佳方法。 回收站清空后如何恢复已删除的文件&#xff1f; “回收站清空后…

从零开始搭建GPU深度学习环境(pytorch)

傻乎乎的我&#xff0c;突然发现我自己的笔记本电脑居然有gpu&#xff0c;这个电脑是我弟在2017年购入的。 电脑已经按照了cpu环境&#xff0c;现在增加gpu环境 参考torch的cpu版本和gpu版本有什么区别 torch与cuda版本_mob64ca13f6035c的技术博客_51CTO博客 前言&#xff1a…