FPGA project : TFT_LCD

news2025/1/12 23:41:57

实验目标:

驱动TFT_LCD显示十色彩条。

重点掌握的知识:

1,液晶显示器,简称LCD(Liquid Crystal Display),相对于上一代CRT显示器(阴极射线管显示器)LCD显示器具有功耗低、体积小、承载的信息量大及不伤眼的优点,因而它成为了现在的主流电子显示设备,其中包括电视、电脑显示器、手机屏幕及各种嵌入式设备的显示器。薄膜晶体管型。

2,两种工作时序:

 

 值得注意的事:

有效图像,与行场同步信号时序上要对齐。需要对行场同步信号打一拍,或者直接使用时序逻辑赋值。在时序图上有更直观的说明。

模块框图:

时序图:

代码:

module axis(
    input       wire            clk_9Mhz ,
    input       wire            rst_n    ,
    input       wire    [15:0]  rgb      ,

    output      reg             hsync    ,
    output      reg             vsync    ,
    output      reg     [9:0]   axis_h   ,
    output      reg     [8:0]   axis_v   ,
    output      wire    [15:0]  rgb_tft  ,
    output      wire            tft_clk  ,
    output      wire            tft_bl
);
    // wire signal define
    wire            hsync_0 ;
    wire            vsync_0 ;
    // parameter
    parameter   TOTAL_H = 10'd525 ,
                TOTAL_V =  9'd286 ,
                SYNC_H  = 10'd41  , // 同步synchronization
                SYNC_V  =  9'd10  ; 
    
    /*****************************************************************************************/
    assign hsync_0 = (axis_h >= 0 && axis_h <= (SYNC_H - 1'b1)) ? 1'b1 : 1'b0 ;
    assign vsync_0 = (axis_v >= 0 && axis_v <= (SYNC_V - 1'b1)) ? 1'b1 : 1'b0 ;

    // output signal
    assign tft_clk = clk_9Mhz   ;
    assign tft_bl  = rst_n      ;

    always @(posedge clk_9Mhz or negedge rst_n) begin
        if(~rst_n) 
            axis_h <= 10'd0 ;
        else if(axis_h == TOTAL_H - 1'b1)
            axis_h <= 10'd0 ;
        else 
            axis_h <= axis_h + 1'b1 ;
    end

    always @(posedge clk_9Mhz or negedge rst_n) begin
        if(~rst_n) 
            axis_v <= 9'd0 ;
        else if((axis_h == TOTAL_H - 1'b1) && (axis_v == TOTAL_V - 1'b1))
            axis_v <= 9'd0 ;
        else if(axis_h == TOTAL_H - 1'b1)
            axis_v <= axis_v + 1'b1 ;
        else 
            axis_v <= axis_v ;
    end

    always @(posedge clk_9Mhz or negedge rst_n) begin
        if(~rst_n) begin
            hsync <= 1'b0 ;
            vsync <= 1'b0 ;
        end else begin
            hsync <= hsync_0 ;
            vsync <= vsync_0 ;
        end
    end

    assign rgb_tft = rgb ;

endmodule
module pixel(
    input       wire            clk_9Mhz ,
    input       wire            rst_n    ,
    input       wire    [9:0]   axis_h   ,
    input       wire    [8:0]   axis_v   ,

    output      wire            tft_de   ,
    output      reg     [15:0]  rgb      
);
    // parameter
    parameter   TOTAL_H = 10'd525  ,
                TOTAL_V =  9'd286  ,
                SYNC_H  = 10'd41   , // 同步synchronization
                SYNC_V  =  9'd10   ,
                BACK_H  = 10'd2    ,
                BACK_V  =  9'd2    ,
                VALI_H  = 10'd480  ,
                VALI_V  =  9'd272  ,
                FRON_H  = 10'd2    , // 前沿front
                FRON_V  =  9'd2    ;

    parameter   RED     = 16'hF800 ,
                ORANGE  = 16'hFC00 ,
                YELLOW  = 16'hFFe0 ,
                GREEN   = 16'h07e0 ,
                QING    = 16'h07FF ,
                BLUE    = 16'h001F ,
                PURPLE  = 16'hF81F ,
                BLACK   = 16'h0000 ,
                WHITE   = 16'hFFFF ,
                GRAY    = 16'hD69A ;
    // wire signal define
    wire            valid_rgb ;
    reg             valid_rgb_reg1 ;
    
    always @(posedge clk_9Mhz or negedge rst_n) 
        if(~rst_n)
            valid_rgb_reg1 <= 1'b0 ;
        else 
            valid_rgb_reg1 <= valid_rgb ;

    assign valid_rgb = (axis_h >= (SYNC_H+BACK_H) && (axis_h <= (SYNC_H+BACK_H+VALI_H-1'b1)) 
                    && (axis_v >= (SYNC_V+BACK_V) && (axis_v <= (SYNC_V+BACK_V+VALI_V-1'b1)))) ? 1'b1 : 1'b0 ;

    // output signal
    always @(posedge clk_9Mhz or negedge rst_n) begin
        if(~rst_n) 
            rgb <= WHITE ; 
        else if(valid_rgb)begin
            if((axis_h >= (SYNC_H+BACK_H)) && (axis_h <= (SYNC_H+BACK_H+VALI_H/10-1'b1)))
                rgb <= RED ;
            else if((axis_h >= (SYNC_H+BACK_H+VALI_H/10)) && (axis_h <= (SYNC_H+BACK_H+VALI_H/10*2-1'b1)))
                rgb <= ORANGE ;
            else if((axis_h >= (SYNC_H+BACK_H+VALI_H/10*2)) && (axis_h <= (SYNC_H+BACK_H+VALI_H/10*3-1'b1)))
                rgb <= YELLOW ;
            else if((axis_h >= (SYNC_H+BACK_H+VALI_H/10*3)) && (axis_h <= (SYNC_H+BACK_H+VALI_H/10*4-1'b1)))
                rgb <= GREEN ;
            else if((axis_h >= (SYNC_H+BACK_H+VALI_H/10*4)) && (axis_h <= (SYNC_H+BACK_H+VALI_H/10*5-1'b1)))
                rgb <= QING ;
            else if((axis_h >= (SYNC_H+BACK_H+VALI_H/10*5)) && (axis_h <= (SYNC_H+BACK_H+VALI_H/10*6-1'b1)))
                rgb <= BLUE ;
            else if((axis_h >= (SYNC_H+BACK_H+VALI_H/10*6)) && (axis_h <= (SYNC_H+BACK_H+VALI_H/10*7-1'b1)))
                rgb <= PURPLE ;
            else if((axis_h >= (SYNC_H+BACK_H+VALI_H/10*7)) && (axis_h <= (SYNC_H+BACK_H+VALI_H/10*8-1'b1)))
                rgb <= BLACK ;
            else if((axis_h >= (SYNC_H+BACK_H+VALI_H/10*8)) && (axis_h <= (SYNC_H+BACK_H+VALI_H/10*9-1'b1)))
                rgb <= WHITE ;
            else if((axis_h >= (SYNC_H+BACK_H+VALI_H/10*9)) && (axis_h <= (SYNC_H+BACK_H+VALI_H-1'b1)))
                rgb <= GRAY ;
            else 
                rgb <= WHITE ;
        end else 
            rgb <= WHITE ;
    end

    assign tft_de = valid_rgb_reg1 ;
endmodule

 

module top(
    input       wire            sys_clk   ,
    input       wire            sys_rst_n ,

    output      wire            tft_de    ,
    output      wire            tft_clk   ,
    output      wire            tft_bl    ,
    output      wire            hsync     ,
    output      wire            vsync     ,
    output      wire    [15:0]  rgb_tft 
);

    // 例化间连线
    wire            clk_9Mhz ;
    wire            rst_n    ;
    wire    [15:0]  rgb      ;
    wire    [ 9:0]  axis_h   ;
    wire    [ 8:0]  axis_v   ;

pll_9Mhz pll_9Mhz_insert(
    .sys_rst_n                  ( sys_rst_n  ) ,
	.areset                     ( ~sys_rst_n ) ,
	.inclk0                     ( sys_clk    ) ,
	.c0                         ( clk_9Mhz   ) ,
	.locked                     ( rst_n      )
);

axis axis_insert(
    .clk_9Mhz                   ( clk_9Mhz   ) ,
    .rst_n                      ( rst_n      ) ,
    .rgb                        ( rgb        ) ,

    .hsync                      ( hsync      ) ,
    .vsync                      ( vsync      ) ,
    .axis_h                     ( axis_h     ) ,
    .axis_v                     ( axis_v     ) ,
    .tft_clk                    ( tft_clk    ) ,
    .tft_bl                     ( tft_bl     ) , 
    .rgb_tft                    ( rgb_tft    ) 
);

pixel pixel_insert(
    .clk_9Mhz                   ( clk_9Mhz   ) ,
    .rst_n                      ( rst_n      ) ,
    .axis_h                     ( axis_h     ) ,
    .axis_v                     ( axis_v     ) ,
    .tft_de                     ( tft_de     ) ,

    .rgb                        ( rgb        )      
);


endmodule
`timescale 1ns/1ns
module test_top();
    reg             sys_clk   ;
    reg             sys_rst_n ;

    wire            hsync     ;
    wire            vsync     ;
    wire    [15:0]  rgb_tft   ;
    wire            tft_de    ;
    wire            tft_clk   ;
    wire            tft_bl    ;

top top_inst(
    .sys_clk        ( sys_clk   ) ,
    .sys_rst_n      ( sys_rst_n ) ,

    .tft_de         ( tft_de    ) ,
    .tft_clk        ( tft_clk   ) ,
    .tft_bl         ( tft_bl    ) ,
    .hsync          ( hsync     ) ,
    .vsync          ( vsync     ) ,
    .rgb_tft        ( rgb_tft   ) 
);
    parameter CYCLE = 20 ;

    initial begin
        sys_clk = 1'b1 ;
        sys_rst_n = 1'b0 ;
        #(CYCLE) ;
        sys_rst_n = 1'b1 ;
    end

    always #(CYCLE / 2) sys_clk = ~sys_clk ;

endmodule

仿真波形: 

 

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

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

相关文章

pwnable_hacknote

pwnable_hacknote Arch: i386-32-little RELRO: Partial RELRO Stack: Canary found NX: NX enabled PIE: No PIE (0x8047000)32位&#xff0c;没开PIE main部分就不贴了&#xff0c;直接贴主要的函数 unsigned int ADD() {int v0; // ebxint i; // [e…

堆栈与堆(Stack vs Heap)有什么区别?

​编写有效的代码需要了解堆栈和堆内存&#xff0c;这使其成为学习编程的重要组成部分。不仅如此&#xff0c;新程序员或职场老手都应该完全熟悉堆栈内存和堆内存之间的区别&#xff0c;以便编写有效且优化的代码。 这篇博文将对这两种内存分配技术进行全面的比较。通过本文的…

【考研复习】union有关的输出问题

文章目录 遇到的问题正确解答拓展参考文章 遇到的问题 首次遇到下面的代码时&#xff0c;感觉应该输出65,323。深入理解union的存储之后发现正确答案是&#xff1a;67,323. union {char c;int i; } u; int main(){u.c A;u.i 0x143;printf("%d,%d\n", u.c, u.i); …

Java 随机数的获得方法(5种)

1. Math.random() 静态方法 产生的随机数是 0 - 1 之间的一个 double&#xff0c;即 0 < random < 1 代码&#xff1a; 结果&#xff1a; 当调用 Math.random() 方法时&#xff0c;自动创建了一个伪随机数生成器&#xff0c;实际上用的是 new java.util.Random()。当接…

C++项目:仿mudou库one thread one loop式并发服务器实现

目录 1.实现目标 2.HTTP服务器 3.Reactor模型 3.1分类 4.功能模块划分: 4.1SERVER模块: 4.2HTTP协议模块: 5.简单的秒级定时任务实现 5.1Linux提供给我们的定时器 5.2时间轮思想&#xff1a; 6.正则库的简单使用 7.通用类型any类型的实现 8.日志宏的实现 9.缓冲区…

使用 PPG(光电容积描记图)估计心率和 SpO2 水平(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

from PIL import Image,文字成图,ImageFont import jieba分词,input优雅python绘制图片

开始的代码 import os from PIL import Image, ImageDraw, ImageFont import jiebadef generate_image_with_white_bg(text, font_path, output_path):# 设置图片大小和背景颜色image_width 800image_height 600bg_color (255, 255, 255) # 白色# 创建图片对象image Imag…

基于MFC和OpenCV实现人脸识别

基于MFC和OpenCV实现人脸识别 文章目录 基于MFC和OpenCV实现人脸识别1. 项目说明1. 创建项目2. 启动窗口3. 登录窗口-添加窗口、从启动窗口跳转4. 启动窗口-美化按钮5. 登录窗口-美化按钮、雪花视频6. 注册窗口-美化按钮、雪花视频、从启动窗口跳转7. 注册窗口-开启摄像头8. 注…

小谈设计模式(15)—观察者模式

小谈设计模式&#xff08;15&#xff09;—观察者模式 专栏介绍专栏地址专栏介绍 观察者模式核心思想主要角色Subject&#xff08;被观察者&#xff09;ConcreteSubject&#xff08;具体被观察者&#xff09;Observer&#xff08;观察者&#xff09;ConcreteObserver&#xff0…

Linux CentOS7 vim多文件与多窗口操作

窗口是可视化的分割区域。Windows中窗口的概念与linux中基本相同。连接xshell就是在Windows中新建一个窗口。而vim打开一个文件默认创建一个窗口。同时&#xff0c;Vim打开一个文件也就会建立一个缓冲区&#xff0c;打开多个文件就会创建多个缓冲区。 本文讨论vim中打开多个文…

STM32CubeMX学习笔记-USB接口使用(CDC虚拟串口)

STM32CubeMX学习笔记-USB接口使用&#xff08;CDC虚拟串口&#xff09; 一、USB简介二、新建工程1. 打开 STM32CubeMX 软件&#xff0c;点击“新建工程”2. 选择 MCU 和封装3. 配置时钟4. 配置调试模式 三、USB3.1 参数配置3.3 配置时钟3.4 USB Device 四、生成代码五、查看端口…

王道考研操作系统——I/O管理

I/O设备的基本概念 键盘&#xff1a;输入设备&#xff08;把设备准备好的数据读入计算机当中&#xff09;&#xff1b; 显示器&#xff1a;输出设备&#xff08;把计算机中准备好的数据写出到设备上&#xff09;&#xff1b; 移动硬盘&#xff1a;既是输入又是输出 中断驱动…

近三年3D点云顶会论文及源码合集,含2023最新

目前2D图像识别技术早已成熟&#xff0c;但2D的图像信息只有XY两个维度&#xff0c;而3D点云能够提供三维世界的信息&#xff0c;因此在自动驾驶、机器人和增强现实等各种领域都得到了广泛的应用。 近年来随着深度学习的发展&#xff0c;作为计算机视觉新兴研究热点的3D点云技…

python利用matplotlib绘图,对于中文和负号不显示,显示方框“口口”完美解决办法!!

文章目录 一、问题展示二、问题分析三、解决办法四、结果展示 一、问题展示 二、问题分析 可以发现对中文&#xff0c;以及负号不显示。 三、解决办法 import matplotlib.pyplot as pltplt.rcParams[font.sans-serif] [usimHei] # 显示中文 plt.rcParams[axes.unicode_mi…

Task1:

""" 重置root管理员密码 """ step1: 在shell界面输入重启命令&#xff1b; step2: 重启过程中出现此界面&#xff0c;快速按键盘‘e’, 进入系统内核程序&#xff1b; step3: 在系统系统内核程序内&#xff0c;移动光标至Linux 参数这…

10.0 探索API调试事件原理

本章笔者将通过Windows平台下自带的调试API接口实现对特定进程的动态转存功能&#xff0c;首先简单介绍一下关于调试事件的相关信息&#xff0c;调试事件的建立需要依赖于DEBUG_EVENT这个特有的数据结构&#xff0c;该结构用于向调试器报告调试事件。当一个程序发生异常事件或者…

栈的应用场景(二)

有效的括号匹配 1.题目2.图分析3.代码实现 1.题目 2.图分析 3.代码实现 class Solution {public boolean isValid(String s) {//创建一个栈,来放左括号.Stack<Character> stack new Stack<>();//遍历字符串,左括号放进栈for(int i 0 ; i < s.length(); i){ch…

趋势列表上又多了两个漏洞!

CVE-2023-24955 和 CVE-2023-29360 来自微软产品 5 月和 6 月的安全补丁报告。它们之所以特别危险&#xff0c;是因为出现了公开漏洞利用。 以下是详细信息。 第一个漏洞 CVE-2023-24955存在于 Microsoft SharePoint Server 中。它可导致远程代码执行。 它与覆盖随后由服务器执…

postgresql-备份与恢复

postgresql-备份与恢复 基本概念备份类型物理备份与逻辑备份在线备份与离线备份全量备份与增量备份 备份恢复工具备份与恢复逻辑备份与还原备份单个数据库psqlpg_dumppg_store 备份整个集群 基本概念 服务器系统错误、硬件故障或者人为失误都可能导致数据的丢失或损坏。因此&am…

Ai项目十四:基于 LeNet5 的手写数字识别及训练

若该文为原创文章&#xff0c;转载请注明原文出处。 一、介绍 pytorch复现lenet5模型&#xff0c;并检测自己手写的数字图片。 利用torch框架搭建模型相对比较简单&#xff0c;但是也会遇到很多问题&#xff0c;网上资料很多&#xff0c;搭建模型的方法大同小异&#xff0c;…