TFT屏幕波形显示

news2025/7/8 12:19:32

REVIEW

关于TFT显示屏,之前已经做过彩条显示:

TFT显示屏驱动_tft驱动-CSDN博客

关于ROM IP核,以及coe文件生成:

FPGA寄存器 Vivado IP核_fpga寄存器资源-CSDN博客

1. TFT屏幕+ROM显示正弦波

①生成coe文件

%% sin-cos wave data write in coe file
clear all ;
clc ;

width = 12;%与幅值有关
N = 1024 ; % depth  数据个数
y = zeros(N , 1) ;
for i = 1:1:N 
    x = i ;
    y(i,1) = ceil( 240*cos(x*2*pi/400) ) + 240 ;%显示屏800*480
end   
plot(y);
hold on;
fid = fopen('cos_1024.coe','wt');    
%- standard format
fprintf( fid, 'MEMORY_INITIALIZATION_RADIX = 10;\n');                     
fprintf( fid, 'MEMORY_INITIALIZATION_VECTOR =\n');
%- write data in coe file
for i = 1:1:N
    fprintf(fid,'%d,\n',y(i,1));  
end
fclose(fid);

②配置ROM

③VGA时钟配置

④VGA_CTRL

module VGA_CTRL(
                input clk ,
                input reset_n ,
                input [15:0]data ,
                output reg data_req ,
                output reg [11:0]H_addr , //当前扫描点的H坐标
                output reg [11:0]V_addr , //当前扫描点的V坐标
                output reg VGA_HS ,
                output reg VGA_VS , 
                output reg VGA_BLK , //BLK表示的就是输出输出的时间段
                output reg [15:0]VGA_RGB  //{R[7:0]、G[7:0]、B[7:0]}
            );
    
    
    `include "vga_parameter.v"
     localparam VGA_HS_end = `H_Sync_Time - 1'b1 ;
     localparam Hdat_begin = `H_Sync_Time + `H_Back_Porch + `H_Left_Border - 1'b1 ;
     localparam Hdat_end = `H_Total_Time - `H_Right_Border - `H_Front_Porch - 1'b1 ;
     localparam Hpixel_end = `H_Total_Time - 1'b1 ;
     localparam VGA_VS_end = `V_Sync_Time - 1'b1 ;
     localparam Vdat_begin = `V_Sync_Time + `V_Back_Porch + `V_Top_Border - 1'b1 ;
     localparam Vdat_end = `V_Total_Time - `V_Bottom_Border - `V_Front_Porch - 1'b1 ;
     localparam Vline_end = `V_Total_Time - 1'b1 ;
    
   //行计数器
    reg[11:0]H_cnt;
    always@(posedge clk or negedge reset_n)
    if(!reset_n)    H_cnt <= 0 ;
    else if(H_cnt == Hpixel_end)
        H_cnt <= 0 ;
    else 
        H_cnt <= H_cnt + 1'b1 ;
    
    // 场计数器
    reg[11:0]V_cnt;
    always@(posedge clk or negedge reset_n)
    if(!reset_n)    V_cnt <= 0 ;
    else if(H_cnt == Hpixel_end)
        if(V_cnt == Vline_end)
            V_cnt <= 0 ;
        else 
            V_cnt <= V_cnt + 1'b1 ;
    else 
        V_cnt <= V_cnt ;
        
      //     VGA_HS
    always@(posedge clk or negedge reset_n)
    if(!reset_n)  VGA_HS <= 1;
    else if(H_cnt == 0) VGA_HS <= 0;
    else if(H_cnt > VGA_HS_end) VGA_HS <= 1;
    
    //     VGA_VS
    always@(posedge clk or negedge reset_n)
    if(!reset_n)  VGA_VS <= 1;
    else if(V_cnt == 0) VGA_VS <= 0;
    else if(V_cnt > VGA_VS_end) VGA_VS <= 1;  
        
    
 

   //     data_req
    always@(posedge clk or negedge reset_n)
    if(!reset_n)    data_req <= 0 ;
    else data_req <= ((H_cnt >= Hdat_begin)&&(H_cnt < Hdat_end)&&(V_cnt >= Vdat_begin)&&(V_cnt <= Vdat_end)) ? 1 : 0;
    
     //     VGA_BLK
    always@(posedge clk or negedge reset_n)
    if(!reset_n)    VGA_BLK <= 0 ;
    else VGA_BLK <= data_req ;
            
//    assign VGA_RGB = VGA_BLK? Data:0;
      //     VGA_RGB
    always@(posedge clk )
    if(data_req) 
       VGA_RGB <= data;
    else
        VGA_RGB <= 0;
        
   //address
    always@(posedge clk )
    if(data_req)
     begin
        H_addr <= H_cnt - Hdat_begin;
        V_addr <= V_cnt - Vdat_begin;
     end
     else
       begin
        H_addr <= 0;
        V_addr <= 0;
     end 
endmodule
 

⑤vga_parameter.v

/*
使用时根据实际工作需求选择几个预定义参数就可以
MODE_RGB888 和 MODE_RGB565 两个参数二选一,用来决定驱动工作在 16 位模式还是
24 位模式
针对小梅哥提供的一系列显示设备,各个设备参数如下所述
4.3 寸屏:16 位色 RGB565 模式
5 寸屏:16 位色 RGB565 模式
GM7123 模块使用 24 位色 RGB888 模式,
Resolution_xxxx 预定义用来决定显示设备分辨率,常见设备分辨率如下所述
4.3 寸 TFT 显示屏:Resolution_480x272
5 寸 TFT 显示屏:Resolution_800x480
VGA 常见分辨率:
Resolution_640x480
Resolution_800x600
Resolution_1024x768
Resolution_1280x720
Resolution_1920x1080
*/
 
//以下两行预定义根据实际使用的模式,选择一个使能,另外一个使用注释的方式屏蔽
`define MODE_RGB888
//`define MODE_RGB565
 
 
//以下 7 行预定义根据实际使用的分辨率,选择一个使能,另外 6 个使用注释的方式屏蔽
//`define Resolution_480x272 1 //时钟为 9MHz
//`define Resolution_640x480 1 //时钟为 25.175MHz
`define Resolution_800x480 1 //时钟为 33MHz
//`define Resolution_800x600 1 //时钟为 40MHz TFT_5屏幕分辨率
//`define Resolution_1024x768 1 //时钟为 65MHz
//`define Resolution_1280x720 1 //时钟为 74.25MHz
//`define Resolution_1920x1080 1 //时钟为 148.5MHz
 
//定义不同的颜色深度
`ifdef MODE_RGB888
    `define Red_Bits 8
    `define Green_Bits 8
    `define Blue_Bits 8
`elsif MODE_RGB565
    `define Red_Bits 5
    `define Green_Bits 6
    `define Blue_Bits 5
`endif
 
//定义不同分辨率的时序参数
`ifdef Resolution_480x272
    `define H_Total_Time 12'd525
    `define H_Right_Border 12'd0
    `define H_Front_Porch 12'd2
    `define H_Sync_Time 12'd41
    `define H_Back_Porch 12'd2
    `define H_Left_Border 12'd0
    
    `define V_Total_Time 12'd286
    `define V_Bottom_Border 12'd0
    `define V_Front_Porch 12'd2
    `define V_Sync_Time 12'd10
    `define V_Back_Porch 12'd2
    `define V_Top_Border 12'd0
    
    
`elsif Resolution_640x480
    `define H_Total_Time 12'd800
    `define H_Right_Border 12'd8
    `define H_Front_Porch 12'd8
    `define H_Sync_Time 12'd96
    `define H_Back_Porch 12'd40
    `define H_Left_Border 12'd8
    
    `define V_Total_Time 12'd525
    `define V_Bottom_Border 12'd8
    `define V_Front_Porch 12'd2
    `define V_Sync_Time 12'd2
    `define V_Back_Porch 12'd25
    `define V_Top_Border 12'd8
    
    
`elsif Resolution_800x480
    `define H_Total_Time 12'd1056
    `define H_Right_Border 12'd0
    `define H_Front_Porch 12'd40
    `define H_Sync_Time 12'd128
    `define H_Back_Porch 12'd88
    `define H_Left_Border 12'd0
    
    `define V_Total_Time 12'd525
    `define V_Bottom_Border 12'd8
    `define V_Front_Porch 12'd2
    `define V_Sync_Time 12'd2
    `define V_Back_Porch 12'd25
    `define V_Top_Border 12'd8
    
    
`elsif Resolution_800x600
    `define H_Total_Time 12'd1056
    `define H_Right_Border 12'd0
    `define H_Front_Porch 12'd40
    `define H_Sync_Time 12'd128
    `define H_Back_Porch 12'd88
    `define H_Left_Border 12'd0
    
    `define V_Total_Time 12'd628
    `define V_Bottom_Border 12'd0
    `define V_Front_Porch 12'd1
    `define V_Sync_Time 12'd4
    `define V_Back_Porch 12'd23
    `define V_Top_Border 12'd0
    
    
`elsif Resolution_1024x768
    `define H_Total_Time 12'd1344
    `define H_Right_Border 12'd0
    `define H_Front_Porch 12'd24
    `define H_Sync_Time 12'd136
    `define H_Back_Porch 12'd160
    `define H_Left_Border 12'd0
    
    `define V_Total_Time 12'd806
    `define V_Bottom_Border 12'd0
    `define V_Front_Porch 12'd3
    `define V_Sync_Time 12'd6
    `define V_Back_Porch 12'd29
    `define V_Top_Border 12'd0
    
    
`elsif Resolution_1280x720
    `define H_Total_Time 12'd1650
    `define H_Right_Border 12'd0
    `define H_Front_Porch 12'd110
    `define H_Sync_Time 12'd40
    `define H_Back_Porch 12'd220
    `define H_Left_Border 12'd0
    
    `define V_Total_Time 12'd750
    `define V_Bottom_Border 12'd0
    `define V_Front_Porch 12'd5
    `define V_Sync_Time 12'd5
    `define V_Back_Porch 12'd20
    `define V_Top_Border 12'd0
    
    
`elsif Resolution_1920x1080
    `define H_Total_Time 12'd2200
    `define H_Right_Border 12'd0
    `define H_Front_Porch 12'd88
    `define H_Sync_Time 12'd44
    `define H_Back_Porch 12'd148
    `define H_Left_Border 12'd0
    
    `define V_Total_Time 12'd1125
    `define V_Bottom_Border 12'd0
    `define V_Front_Porch 12'd4
    `define V_Sync_Time 12'd5
    `define V_Back_Porch 12'd36
    `define V_Top_Border 12'd0
    
    
`endif

⑥VGA_CTRL.xdc

set_property IOSTANDARD LVCMOS33 [get_ports {VGA_RGB[15]}]
set_property IOSTANDARD LVCMOS33 [get_ports {VGA_RGB[14]}]
set_property IOSTANDARD LVCMOS33 [get_ports {VGA_RGB[13]}]
set_property IOSTANDARD LVCMOS33 [get_ports {VGA_RGB[12]}]
set_property IOSTANDARD LVCMOS33 [get_ports {VGA_RGB[11]}]
set_property IOSTANDARD LVCMOS33 [get_ports {VGA_RGB[10]}]
set_property IOSTANDARD LVCMOS33 [get_ports {VGA_RGB[9]}]
set_property IOSTANDARD LVCMOS33 [get_ports {VGA_RGB[8]}]
set_property IOSTANDARD LVCMOS33 [get_ports {VGA_RGB[7]}]
set_property IOSTANDARD LVCMOS33 [get_ports {VGA_RGB[6]}]
set_property IOSTANDARD LVCMOS33 [get_ports {VGA_RGB[5]}]
set_property IOSTANDARD LVCMOS33 [get_ports {VGA_RGB[4]}]
set_property IOSTANDARD LVCMOS33 [get_ports {VGA_RGB[3]}]
set_property IOSTANDARD LVCMOS33 [get_ports {VGA_RGB[2]}]
set_property IOSTANDARD LVCMOS33 [get_ports {VGA_RGB[1]}]
set_property IOSTANDARD LVCMOS33 [get_ports {VGA_RGB[0]}]
set_property IOSTANDARD LVCMOS33 [get_ports clk]
set_property IOSTANDARD LVCMOS33 [get_ports reset_n]
set_property IOSTANDARD LVCMOS33 [get_ports VGA_BLK]
set_property IOSTANDARD LVCMOS33 [get_ports TFT_BL]
set_property IOSTANDARD LVCMOS33 [get_ports VGA_CLK]
set_property IOSTANDARD LVCMOS33 [get_ports VGA_HS]
set_property IOSTANDARD LVCMOS33 [get_ports VGA_VS]
set_property PACKAGE_PIN W20 [get_ports {VGA_RGB[15]}]
set_property PACKAGE_PIN W19 [get_ports {VGA_RGB[14]}]
set_property PACKAGE_PIN V17 [get_ports {VGA_RGB[13]}]
set_property PACKAGE_PIN V16 [get_ports {VGA_RGB[12]}]
set_property PACKAGE_PIN T15 [get_ports {VGA_RGB[11]}]
set_property PACKAGE_PIN V20 [get_ports {VGA_RGB[10]}]
set_property PACKAGE_PIN U17 [get_ports {VGA_RGB[9]}]
set_property PACKAGE_PIN V18 [get_ports {VGA_RGB[8]}]
set_property PACKAGE_PIN T16 [get_ports {VGA_RGB[7]}]
set_property PACKAGE_PIN R16 [get_ports {VGA_RGB[6]}]
set_property PACKAGE_PIN U19 [get_ports {VGA_RGB[5]}]
set_property PACKAGE_PIN Y19 [get_ports {VGA_RGB[4]}]
set_property PACKAGE_PIN W18 [get_ports {VGA_RGB[3]}]
set_property PACKAGE_PIN Y18 [get_ports {VGA_RGB[2]}]
set_property PACKAGE_PIN W16 [get_ports {VGA_RGB[1]}]
set_property PACKAGE_PIN Y17 [get_ports {VGA_RGB[0]}]
set_property PACKAGE_PIN W14 [get_ports VGA_VS]
set_property PACKAGE_PIN U14 [get_ports VGA_HS]
set_property PACKAGE_PIN U15 [get_ports VGA_CLK]
set_property PACKAGE_PIN R17 [get_ports TFT_BL]
set_property PACKAGE_PIN U18 [get_ports clk]
set_property PACKAGE_PIN H18 [get_ports reset_n]
set_property PACKAGE_PIN W15 [get_ports VGA_BLK]

⑦VGA_cos

module VGA_cos(
  
    input clk , //50MHZ时钟
    input reset_n ,
    output VGA_CLK,
    output VGA_HS, //TFT行同步信号
    output VGA_VS, //TFT场同步信号
    output VGA_BLK,        //VGA 场消隐信号
    output [15:0] VGA_RGB ,//TFT数据输出
    output TFT_BL  //背光
);


    assign TFT_BL = 1;
        
    reg [15:0]disp_data;
    wire [11:0]hcount;
    wire [11:0]vcount;
    wire Clk33M; 
    wire Data_Req;
    
    
    assign VGA_CLK= Clk33M;
      
clk_vga vga_clk(
        .clk_out1(Clk33M),
        .clk_in1(clk)
    );      
    VGA_CTRL VGA_CTRL_(
        .clk(Clk33M),    //系统输入时钟25MHZ
        .reset_n(reset_n),
        .data(disp_data),    //待显示数据
        .data_req(Data_Req),
        .H_addr(hcount),        //VGA行扫描计数器
        .V_addr(vcount),        //VGA场扫描计数器
        .VGA_HS(VGA_HS),        //VGA行同步信号
        .VGA_VS(VGA_VS),        //VGA场同步信号
        .VGA_BLK(VGA_BLK) ,     //VGA 场消隐信号
        .VGA_RGB(VGA_RGB)  //VGA数据输出
    );
         
//定义颜色编码
localparam 
    BLACK  = 16'h0000, //黑色
    WHITE  = 16'hFFFF; //白色

    
localparam 
    DOT = BLACK,  //点是黑色
    BACKGROUND = WHITE;  //背景白色

    wire R_all = vcount >= 0 && vcount < 480;  
    wire C_all = hcount >= 0 && hcount < 800; 
    wire BR = R_all & C_all;//底色全为白色

    
  
   wire[11:0]dot ;
    
    //这里是ROM,摸鱼怪又没改名字,嘎嘎嘎
    blk_mem_gen_0 blk_mem_gen_0_(
                                  .clka(Clk33M),
                                  .ena(1'b1),
                                  .addra(hcount),  //
                                  .douta(dot)
                                );

     
   wire dotline = (vcount == dot) && hcount;
   
    always@(*)
        case({BR,dotline})
           2'b10: disp_data = BACKGROUND;
           2'b11: disp_data = DOT;
         endcase
        
        
endmodule
 

摸鱼怪碎碎念:

        ROM依次存储,地址增加对应时间增加

        hcount 为列  vcount 为行

        按照 hcount 增加,ROM中的值定位vcount

2. 画饼

需要可读可写,就是用RAM啦~

下次再慢慢摸鱼吧~

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

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

相关文章

一文读懂企业“数据资产入表”

2024年1月1日起&#xff0c;财政部《企业数据资源相关会计处理暂行规定》&#xff08;以下称《暂行规定》&#xff09;正式施行&#xff0c;企业可以对其数据资源进行会计核算&#xff0c;也就是俗称的“数据资产入表”。 《暂行规定》确定了三类数据资源可以入表&#xff1a;…

从零开始写 Docker(十八)---容器网络实现(下):为容器插上”网线“

本文为从零开始写 Docker 系列第十八篇&#xff0c;利用 linux 下的 Veth、Bridge、iptables 等等相关技术&#xff0c;构建容器网络模型&#xff0c;为容器插上”网线“。 完整代码见&#xff1a;https://github.com/lixd/mydocker 欢迎 Star 推荐阅读以下文章对 docker 基本实…

南京威雅学校:初中转轨国际化教育,她们打开了成长的另一种可能

“上了大学就轻松了。” 又是一年高考季&#xff0c;每每回想起十八岁前那些没日没夜埋头学习的日子&#xff0c;已经为人父母的你是不是也忍不住想要孩子气地吐槽一句&#xff0c;“骗人”——人不会在一场考试后瞬间长大&#xff0c;试卷里也没有人生的全部答案。 三年前&a…

详解QFileSystemModel的使用

在Qt应用程序开发中&#xff0c;QFileSystemModel是一个强大的类&#xff0c;用于展示和操作文件系统的信息。它基于标准的QAbstractItemModel&#xff0c;提供了浏览本地文件系统目录树的能力&#xff0c;并且能够自动更新以反映文件系统的变化。本文将详细讲解QFileSystemMod…

性能测试3【搬代码】

1.Linux服务器性能分析命令及详解 2.GarafanainfluxDB监控jmeter数据 3.GarafanaPrometheus监控服务器和数据库性能 4.性能瓶颈分析以及性能调优方案详解 一、无界面压测时&#xff0c; top load average:平均负载 htop 二、Garafana监控平台 传统项目&#xff1a;centosphpm…

Interlinks Manager评测:WordPress 的最佳内部链接插件?

在这篇Interlinks Manager评测中&#xff0c;我们将彻底查看它是否真的是 WordPress 最佳内部链接插件&#xff01;我们还将检查它是否值得您尝试。现在就开始吧 快速浏览一下插件&#xff0c;你就会对其提供的功能有一个基本的了解。 Interlinks Manager是一款 SEO 插件&…

【后端开发】服务开发场景之高性能(CDN与负载均衡,数据库优化,消息队列)

【后端开发】服务开发场景之高性能&#xff08;CDN与负载均衡&#xff0c;数据库优化&#xff0c;消息队列&#xff09; 文章目录 1、内容分发网络&#xff08;CDN &#xff09; & 负载均衡算法CDN是什么&#xff1f;&#xff08;静态资源加速&#xff09;CDN的应用场景&am…

PaddleOCR学习——PP-OCR系列

相关知识前置&#xff1a; PP-LCNet PP-LCNetV3 PP-LCNetV3系列模型是PP-LCNet系列模型的延续&#xff0c;覆盖了更大的精度范围&#xff0c;能够适应不同下游任务的需要。PP-LCNetV3系列模型从多个方面进行了优化&#xff0c;提出了可学习仿射变换模块&#xff0c;对重参数…

git下载路径

第一步 1进入官网&#xff1a;Git - Downloading Package 第二步 根据自己的系统选择对应版本下载

Opencascade实体转VTK对象渲染测试

前面编译了基于QT5.12.7VTK8.2的库&#xff0c;本次就根据这个VTK库实现VTK嵌入QT并将Opencascade实体对象在VTK中进行渲染。 一、vtk嵌入qt 通过查看VTK的开发文档发现&#xff0c;vtk嵌入qt可以通过将QWidget提升为QVTKOpenGLNativeWidget实现&#xff0c;在qtdesigner中事例…

Elasticsearch出现Connection reset by peer

Elasticsearch出现Connection reset by peer分析 1.异常&#xff1a; 2024-06-13 13:17:10.539 WARN [http-nio-30411-exec-9]com.longdaotech.config.ESConfig -onFailure node:[hosthttp://192.168.239.253:9200] 2024/6/13 13:17:10 2024-06-13 13:17:10.541 WARN [http-n…

数字孪生智慧机场:开启未来航空管理时代

利用图扑数字孪生技术打造智慧机场&#xff0c;实现全面数据监控与智能管理&#xff0c;优化航班调度、提升乘客体验&#xff0c;推动机场运营效率和安全性全面提升。

Node-Red和IOT-Tree中的消息流对软件开发的一点思考

上一篇文章IOT-Tree 1.7.0实现了一个类似Node-Red的流程功能中&#xff0c;我提到了如下文字内容&#xff1a; 通过这样的图形化编程机制把软件开发直接分成了两个层次。 1. 一个是应用层面&#xff0c;给用户、项目实施技术人员或维护人员能够在不需要掌握深入技术的前提下&am…

yolov10主要特点

在我们探讨YOLOv10之前&#xff0c;让我们回顾一下YOLO的发展历程。YOLO在实时目标检测领域一直是先驱&#xff0c;兼顾速度和准确性。从YOLOv1到YOLOv9&#xff0c;每个版本在架构、优化和数据增强方面都引入了显著的改进。然而&#xff0c;随着模型的发展&#xff0c;某些限制…

ShardingProxy5.2版本 安装部署,实现分库分表 读写分离等功能 和与springboot集成时遇到的些坑记录

安装与配置时的坑&#xff08;版本5.2&#xff09; 1 使用根据需求&#xff0c;如分库分表&#xff0c;读写分离等&#xff0c;修改相应的配置文件&#xff0c;重启服务就可以了2 配置后&#xff0c;连接错误&#xff0c;检查实际mysql节点是否开启了远程连接&#xff0c;GRAN…

ZYNQ7 Processing System IP核中PS侧Uart的用法

在ZYNQ7 Processing System IP核中集成的UART控制器是一个中全双工异步接收器和发送器&#xff0c;支持广泛的可编程波特率和I/O信号格式&#xff0c;可以适应自动奇偶校验生成和多主机检测模式。 UART操作由配置和模式寄存器控制。使用状态寄存器、中断状态寄存器和调制解调器…

C# WPF入门学习主线篇(十五)—— DockPanel布局容器

C# WPF入门学习主线篇&#xff08;十五&#xff09;—— DockPanel布局容器 欢迎来到C# WPF入门学习系列的第十五篇。在前几篇文章中&#xff0c;我们探讨了 Canvas、StackPanel 和 WrapPanel 布局容器及其使用方法。本篇博客将介绍另一种强大且常用的布局容器——DockPanel。…

【每日刷题】Day64

【每日刷题】Day64 &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;每日刷题&#x1f34d; &#x1f33c;文章目录&#x1f33c; 1. LCP 67. 装饰树 - 力扣&#xff08;LeetCode&#xff09; 3. 1315. 祖父节点值为偶数的节点和 - 力…

求和路径00

题目链接 求和路径 题目描述 注意点 节点总数 < 10000节点的值可能是正数或负数路径不一定非得从二叉树的根节点或叶节点开始或结束&#xff0c;但是其方向必须向下(只能从父节点指向子节点方向) 解答思路 因为要求树的路径和&#xff0c;所以初始想到的是深度优先遍历…

手写轮播列表(最新) 轮播图 swiper

el-row版本: <template><div class="container-div" id="app"><div><!-- 头部开始--><div class="top1"><div class="content"><div class="list"><el-row :gutter=&quo…