基于fpga实现tft屏幕显示数字、字母

news2024/7/6 20:18:25

简介

开发平台:ZYNQ
开发工具:Vivado 2018.3
tft屏幕分辨率:800*480
在PL端使用纯verilog实现bitmap模块,基于该模块实现在tft屏幕显示数字0-9,以及FPGA字母

Bitmap模块

在这里插入图片描述
该模块为5*5的bitmap,纯组合逻辑,基于case实现

  • digit[3:0]: 要显示的数字bcd码,取值范围0-9,为了显示字母,在取值为11-14时,添加了额外逻辑,其他情况输出0
  • yofs[2:0]: y坐标,取值范围0-4,其他情况输出0
  • bits[4:0]: 这一行的5个点

代码:

module bitmap(
    input [3:0] digit,        	// digit 0-9, 11-14 will be "FPGA"
    input [2:0] yofs,     		// vertical offset (0-4)
    output reg [4:0] bits    	// output (5 bits)
);
// combine digit,yofs
wire [6:0] caseexpr = {digit,yofs};
  
always @(*)
    case (caseexpr)
    // 0
    7'o00: bits = 5'b11111;
    7'o01: bits = 5'b10001;
    7'o02: bits = 5'b10001;
    7'o03: bits = 5'b10001;
    7'o04: bits = 5'b11111;
    // 1
    7'o10: bits = 5'b01100;
    7'o11: bits = 5'b00100;
    7'o12: bits = 5'b00100;
    7'o13: bits = 5'b00100;
    7'o14: bits = 5'b11111;
    // 2
    7'o20: bits = 5'b11111;
    7'o21: bits = 5'b00001;
    7'o22: bits = 5'b11111;
    7'o23: bits = 5'b10000;
    7'o24: bits = 5'b11111;
    // 3
    7'o30: bits = 5'b11111;
    7'o31: bits = 5'b00001;
    7'o32: bits = 5'b11111;
    7'o33: bits = 5'b00001;
    7'o34: bits = 5'b11111;
    // 4
    7'o40: bits = 5'b10001;
    7'o41: bits = 5'b10001;
    7'o42: bits = 5'b11111;
    7'o43: bits = 5'b00001;
    7'o44: bits = 5'b00001;
    // 5
    7'o50: bits = 5'b11111;
    7'o51: bits = 5'b10000;
    7'o52: bits = 5'b11111;
    7'o53: bits = 5'b00001;
    7'o54: bits = 5'b11111;
    // 6
    7'o60: bits = 5'b11111;
    7'o61: bits = 5'b10000;
    7'o62: bits = 5'b11111;
    7'o63: bits = 5'b10001;
    7'o64: bits = 5'b11111;
    // 7
    7'o70: bits = 5'b11111;
    7'o71: bits = 5'b00001;
    7'o72: bits = 5'b00001;
    7'o73: bits = 5'b00001;
    7'o74: bits = 5'b00001;
    // 8
    7'o100: bits = 5'b11111;
    7'o101: bits = 5'b10001;
    7'o102: bits = 5'b11111;
    7'o103: bits = 5'b10001;
    7'o104: bits = 5'b11111;
    // 9
    7'o110: bits = 5'b11111;
    7'o111: bits = 5'b10001;
    7'o112: bits = 5'b11111;
    7'o113: bits = 5'b00001;
    7'o114: bits = 5'b11111;
    
    // F
    7'o130: bits = 5'b11111;
    7'o131: bits = 5'b10000;
    7'o132: bits = 5'b11111;
    7'o133: bits = 5'b10000;
    7'o134: bits = 5'b10000;
    // P
    7'o140: bits = 5'b11111;
    7'o141: bits = 5'b10001;
    7'o142: bits = 5'b11111;
    7'o143: bits = 5'b10000;
    7'o144: bits = 5'b10000;
    // G
    7'o150: bits = 5'b11111;
    7'o151: bits = 5'b10000;
    7'o152: bits = 5'b10111;
    7'o153: bits = 5'b10001;
    7'o154: bits = 5'b11111;
    // A
    7'o160: bits = 5'b11111;
    7'o161: bits = 5'b10001;
    7'o162: bits = 5'b11111;
    7'o163: bits = 5'b10001;
    7'o164: bits = 5'b10001;

    default: bits = 0;
    endcase
endmodule

TFT驱动模块

和vga驱动类似,这里就不详细介绍了
代码:

module TFT_driver(
    input           clk,
    input           rst_n,
    
    // host input
    input [15:0]    data,
    
    // host output
    output          data_req,
    output [9:0]    h_addr,
    output [8:0]    v_addr,
    
    // TFT
    output          pclk,
    output          de,
    output          bl,
    output          hs,
    output          vs,
    output [15:0]   rgb
);
    // 800 * 480
    localparam  H_SYNC  = 11'd128,
                H_BEGIN = 11'd216,
                H_END   = 11'd1016,
                H_TOTAL = 11'd1056;
    localparam  V_SYNC  = 10'd2,
                V_BEGIN = 10'd35,
                V_END   = 10'd515,
                V_TOTAL = 10'd525;
                
    reg [10:0] cnt_h;
    reg [9:0] cnt_v;
    
    // cnt_h
    always @(posedge clk, negedge rst_n) begin
        if(!rst_n)
            cnt_h <= 0;
        else if(cnt_h == H_TOTAL - 1)
            cnt_h <= 0;
        else
            cnt_h <= cnt_h + 1;
    end
    
    // cnt_v
    always @(posedge clk, negedge rst_n) begin
        if(!rst_n)
            cnt_v <= 0;
        else if(cnt_h == H_TOTAL - 1) begin
            if(cnt_v == V_TOTAL - 1)
                cnt_v <= 0;
            else
                cnt_v <= cnt_v + 1;
        end
    end
    
    assign pclk = clk;
    
    assign bl   = rst_n;
    
    assign de = (cnt_h >= H_BEGIN && cnt_h < H_END && cnt_v >= V_BEGIN && cnt_v < V_END);
    
    assign hs = (cnt_h >= H_SYNC);
    assign vs = (cnt_v >= V_SYNC);
    
    assign rgb = de ? data : 0;
     
    assign h_addr = de ? (cnt_h - H_BEGIN) : 0;
    assign v_addr = de ? (cnt_v - V_BEGIN) : 0;
    
    assign data_req = de;
    
endmodule

顶层模块

使用clock wizard给TFT驱动模块供应33M时钟,根据y坐标和x坐标决定要显示的内容

代码:

module top_module(
    input           clk,
    input           rst_n,
    output          TFT_pclk,
    output          TFT_de,
    output          TFT_bl,
    output          TFT_hs,
    output          TFT_vs,
    output [15:0]   TFT_RGB
    );
localparam  BLACK   = 16'h0000, GREEN   = 16'h07E0;
            
wire pclk;
wire [15:0] data;
wire [9:0] h_addr;
wire [8:0] v_addr;
wire data_req;

wire [3:0] digit = h_addr[8:5];
wire [2:0] xofs = h_addr[4:2];
wire [2:0] yofs = v_addr[4:2];
wire [4:0] bits;

bitmap u_bitmap(
    .digit(digit),
    .yofs(yofs),
    .bits(bits)
);

assign data = ~xofs < 3'd5 ? (bits[~xofs] ? GREEN : BLACK) : BLACK;

clk_wiz_0 u_clk_wiz_0(
    .clk_in1    (clk),
    .clk_out1   (pclk)
);
            
TFT_driver u_TFT_driver(
    .clk        (pclk),
    .rst_n      (rst_n),
    
    // host input
    .data       (data),
    
    // host output
    .data_req   (data_req),
    .h_addr     (h_addr),
    .v_addr     (v_addr),
    
    // TFT
    .pclk       (TFT_pclk),
    .de         (TFT_de),
    .bl         (TFT_bl),
    .hs         (TFT_hs),
    .vs         (TFT_vs),
    .rgb        (TFT_RGB)
);
endmodule

实验结果

结果如下图:
在这里插入图片描述

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

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

相关文章

7-18作业

#include<iostream>using namespace std; class My_stack { private:int* ptr; //执行堆区空间int top;int size; //记录栈顶元素public:My_stack() :ptr(new int[10]), top(-1), size(10) {}//有参构造My_stack(int size) :ptr(new int[10]), top(-1), size(siz…

Android 网络游戏开发入门简单示例

在Android系统上开发是Android开发学习者所向往的&#xff0c;有成就感也有乐趣&#xff0c;还能取得经济上的报酬。那怎样开发Android网络游戏攻略呢&#xff1f;下面介绍一个简单的入门实例。 一、创建新工程   首先&#xff0c;我们在Eclipse中新建一个名为Movement的工程…

简单工厂模式(java)

目录 结构 案例 类图 代码实现 简单咖啡工厂类 咖啡店类 咖啡类 具体咖啡类 简单工厂方法的优缺点 优点 缺点 结构 简单工厂包含如下角色&#xff1a; 抽象产品 &#xff1a;定义了产品的规范&#xff0c;描述了产品的主要特性和功能。具体产品 &#xff1a;实现或者…

前端 | (五)CSS三大特性及常用属性 | 尚硅谷前端html+css零基础教程2023最新

学习来源&#xff1a;尚硅谷前端htmlcss零基础教程&#xff0c;2023最新前端开发html5css3视频 文章目录 &#x1f4da;CSS三大属性&#x1f407;层叠性&#x1f407;继承性&#x1f407;优先级 &#x1f4da;CSS常用属性&#x1f407;像素的概念&#x1f407;颜色的表示⭐️表…

OCR学术前沿及产业应用高峰论坛202204

OCR学术前沿及产业应用高峰论坛 相关议程&#xff1a;https://mp.weixin.qq.com/s/LYoKHFad9D-gjhGlVF3Czg 广告OCR技术研究与应用-腾讯 视频制作ASR&#xff0c;ocr得到字幕 计算机动画CG OCR实践与技术创新 - 蚂蚁 loss优化 数据合成 对比学习的方式&#xff0c;什么样是…

让小程序动起来-轮播图的两种方式--【浅入深出系列002】

浅入深出系列总目录在000集 如何0元学微信小程序–【浅入深出系列000】 文章目录 本系列校训学习资源的选择啥是轮播图轮播图的关键代码最常见的轮播图代码便于理解的轮播代码两种轮播代码的比较 实际操练第一步&#xff0c;就是找到文件。第二步&#xff0c;先改动一下最显眼…

springboot整合feign实现RPC调用,并通过Hystrix实现降级

目录 一、服务提供者 二、服务消费者 三、测试效果 四、开启Hystrix实现降级功能 feign/openfeign和dubbo是常用的微服务RPC框架&#xff0c;由于feigin内部已经集成ribbon&#xff0c;自带了负载均衡的功能&#xff0c;当有多个同名的服务注册到注册中心时&#xff0c;会根…

数组前缀和

前缀和 前缀和就是指前缀的和&#xff0c;例如在数组中&#xff0c;从开始到 i 就是到 i 的前缀和。前缀和一般用来求中间连续某一段的和&#xff0c;例如sum[i] - sum[j - 1]就可以求出j 到 i 这一段的和。 在这一道题目里面&#xff0c;中间某一段连续子数组和为k&#xff0…

知识库分享|《快手电商中小商家成长指南》

《快手电商中小商家成长指南》致力于帮助快手电商平台的新商家、中小商家可以快速掌握电商经营流程&#xff0c;理解电商经营方法&#xff0c;提升电商经营能力&#xff0c;助力中小商家快速实现冷启。 ‼️ 包含中小商家冷启必备的六大板块两大方向&#xff1a; 基础操作、账…

SpringCloud(三)LoadBalancer负载均衡

一、负载均衡 实际上&#xff0c;在添加LoadBalanced注解之后&#xff0c;会启用拦截器对我们发起的服务调用请求进行拦截&#xff08;注意这里是针对我们发起的请求进行拦截&#xff09;&#xff0c;叫做LoadBalancerInterceptor&#xff0c;它实现ClientHttpRequestIntercep…

JAVA的swing技术到底实用不实用?

文章目录 先说结论JAVA的知识范围那为什么还要学&#xff1f; 总结 先说结论 不实用 1 尚硅谷Java入门视频教程&#xff0c;宋红康java基础视频 必须要排在第一位。1600万的播放量呀。 717集 我的天啦&#xff01; 目录&#xff1a; Java视频及配套资料下载指南 尚硅谷Java基…

有效的括号(C)

bool isValid(char* s) {ST st;StackInit(&st);while (*s) //遍历 -- 与\0终止{//是左括号 压栈if (*s ( || *s [ *s {){StackPush(&st, *s);s;}else{//应对样例&#xff1a; ’]if (StackEmpty(&st)){StackDestroy(&st);return false;}//不是左括号 应该就…

【Flink】详解Flink任务提交流程

启动一个任务 通常我们会使用 bin/flink run -t yarn-per-job -c com.xxx.xxx.WordCount/WordCount.jar 方式启动任务&#xff1b;我们看一下 flink文件中到底做了什么&#xff0c;以下是其部分源码 # Convert relative path to absolute path bindirname "$target"…

快速搭建机器学习demo: gradio教程

1. Intro gradio是一个能够快速建立机器学习demo web应用的工具&#xff0c;仅需简单的几行代码就能构建机器学习模型的可视化交互demo&#xff0c;并分享给你的朋友使用。 与gradio相同功能的竞品有Streamlit&#xff0c;相比Gradio&#xff0c;Streamlit相对复杂&#xff0…

热门二叉树面试题

606. 根据二叉树创建字符串 - 力扣&#xff08;LeetCode&#xff09; 给你二叉树的根节点 root &#xff0c;请你采用前序遍历的方式&#xff0c;将二叉树转化为一个由括号和整数组成的字符串&#xff0c;返回构造出的字符串。 空节点使用一对空括号对 "()" 表示&a…

Baichuan-13B:130亿参数的开源语言模型,引领中文和英文benchmark

Baichuan-13B: 一个强大的开源大规模语言模型 标题&#xff1a;Baichuan-13B&#xff1a;130亿参数的开源语言模型&#xff0c;引领中文和英文benchmark Baichuan-13B是由百川智能开发的一个开源大规模语言模型项目&#xff0c;包含了130亿参数。该模型在中文和英文的权威ben…

基于Nginx深入浅出亿级流量架构设计(更新至2023.7.18)

基于Nginx深入浅出亿级流量架构设计 环境准备/安装部署Nginx四个发行版本简单介绍Nginx的安装 Nginx的目录结构与基本运行原理及其最小配置解析Nginx虚拟主机与域名配置ServerName匹配规则反向代理在系统结构中的应用场景Nginx的反向代理配置基于反向代理的负载均衡器 环境准备…

自洽性改善语言模型中的思维链推理

自洽性改善语言模型中的思维链推理 摘要介绍对多样化路径的自洽实验实验设置主要结果当CoT影响效率时候&#xff0c;SC会有所帮助与现有方法进行比较附加研究 相关工作总结 原文&#xff1a; 摘要 本篇论文提出了一种新的编码策略——自洽性&#xff0c;来替换思维链中使用的…

【STM32】SPI屏幕刷图总结:GPIO模拟,硬件SPI,DMA+硬件SPI

文章目录 GPIO模拟SPI硬件SPI外设DMA硬件SPI外设总结 代码工程&#xff1a;https://github.com/liefyuan/stm32-spi-st7789-tft.git 前言 我的屏幕的分辨率是&#xff1a;240*320 驱动是&#xff1a;ST7789V 线驱动方式&#xff1a;四线SPI&#xff08;CS&#xff0c;DC&#…

206. 反转链表

给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[5,4,3,2,1]示例 2&#xff1a; 输入&#xff1a;head [1,2] 输出&#xff1a;[2,1]示例 3&#xff1a; 输入&am…