目录

前言

tft屏控制

测试阵列生成

其他说明


前言

论疫情可以把一个人逼到什么地步呢?甚至可以让我无聊到把4年前的FPGA板子拿出来搞点事情。

我想在一个tft屏做一个下图这样的阵列,能把内部的一些信号比如状态机的状态输出到屏幕上,辅助我定位后续的一些问题。这功能就有点类似于状态灯,只不过这个板子的状态灯只有4个,肯定是不够用的,所以我要做这么个东西出来。

实际上看内部的一些状态是不用这种阵列的,用逻辑分析仪应该是更普遍的做法,quartus ii里也有内置的逻辑分析仪:

altera小实验——SignalTap II 使用指导

不过在一些简单的场景里,一般看下状态就够了,比如某个信号是0还是1,所以做这个测试阵列还是挺有意思的。

我用的开发板是小梅哥家的AC620,芯片型号EP4CE10F17C8(N)。

tft屏控制

tft屏的控制逻辑和VGA逻辑是一样的:

VGA控制的verilog模块设计

我们再简单复习下,tft屏提供的用户接口是这样:

TP_XXX这几个信号不用关注,显然这是一组SPI的接口,还不知道怎么用在屏幕上,只看LCD这一组就够了。LCD_XXX的信号作用:

LCD_HSYNC 行同步有效信号
LCD_VSYNC 场同步有效信号
LCD_DE 背光使能,有效输出像素点时使能
LCD_BL 背光控制,直接与复位信号相连,即复位后一直打开背光
LCD_CLK TFT屏像素时钟
LCD_Rx RGB中R的数值
LCD_Gx RGB中G的数值
LCD_Bx RGB中B的数值

控制信号呢就这么多,最关键的三个信号是LCD_HSYNC、LCD_VSYNC、LCD_CLK。我用的这个屏是480 * 272的像素,因此对应的行场信息为:

LCD_CLK = 525 * 286 * 60(屏幕刷新率/Hz) = 9009000Hz = 9MHz,因此模块的控制时钟是9M。这块板子上只有50M的时钟,因此要例化一个PLL来生成需要的时钟。

因此我最后设计的模块,初始版的接口就是这样的:

module tft_ctrl (input clk,input rst_n,input chan_in,input [24 -1:0]chan_data,output [8-1:0]tft_r,output [8-1:0]tft_g,output [8-1:0]tft_b,output           tft_hs,output       tft_vs,output           tft_pwm,output        tft_de,output        tft_clk,output [10-1:0]hcount,output [10-1:0]vcount
);

hcount和vcount的取值范围分别是0~479和0~271,是给前级的图形生成模块看当前扫描的位置点的。那么前级的图形生成模块就可以根据当前的位置决定是否要输出,如果要在这个点输出,那么就把chan_in置为H,同时给一个{r,g,b}的24bit像素值。比如说前级模块是一个方块图形生成器,那么代码就可以这样写:

module square_gen(input [10-1:0]x_point,input [10-1:0]y_point,input [10-1:0]x_size,input [10-1:0]y_size,input [8 -1:0]r,input [8 -1:0]g,input [8 -1:0]b,input [10-1:0]hcount,input [10-1:0]vcount,input         power_en,output        chan_en,output[24-1:0]chan_data
);wire [10-1:0]x_left   = x_point;
wire [10-1:0]x_right  = (x_point + x_size >= 11'd480) ? 10'd480 : x_point + x_size;
wire [10-1:0]y_top    = y_point;
wire [10-1:0]y_bottom = (y_point + y_size >= 11'd272) ? 10'd272 : y_point + y_size;assign chan_en   = power_en && (hcount >= x_left) && (hcount < x_right) && (vcount >= y_top) && (vcount < y_bottom);
assign chan_data = {r,g,b};
endmodule

对应的图形就是这样的:

那么基于这种控制,就可以把tft_ctrl模块进行一下拓展:

module tft_ctrl #(parameter CHAN_NUM = 1
)(input clk,input rst_n,input [CHAN_NUM    -1:0]chan_in,input [CHAN_NUM*24 -1:0]chan_data,output [8-1:0]tft_r,output [8-1:0]tft_g,output [8-1:0]tft_b,output          tft_hs,output       tft_vs,output           tft_pwm,output        tft_de,output        tft_clk,output [10-1:0]hcount,output [10-1:0]vcount
);

允许有很多输入的chan_in,哪个bit有效了,就输出对应的颜色,这样就可以实现多个色块的输出了,于是这样一个模块就可以作为一个通用接口,前级做多少控制模块都可以,只要把CHAN_NUM给对,一切就都好说。

而且这样做接口的好处,就是可以简单的判断两个“物体”色块的碰撞问题。我之前在FPGA上做碰撞球、小鸟跑酷包括课设跟大佬做俄罗斯方块游戏,里面都涉及到物体碰撞的事:

然而当时应该都没有想到通过这个chan_in来做判断(主要原因我对外提供的接口不是这样的):

OK,那么具体的代码我放在work目录的src文件夹下了,不在此赘述。

测试阵列生成

我在square_gen模块里提供了一个接口power_en,这个信号直接作用在chan_en上,也就是说如果power_en是0,那么即使到了要输出的色块也不会输出。因此待测试的信号可以把值连接到这个接口,就可以通过屏幕来观察当前值。

在定层的work中(具体文件在工程里),tft_ctrl的例化如下:

wire [16*8 -1:0]chan_in;
wire [16*8*24 -1:0]chan_data;
tft_ctrl #(.CHAN_NUM(16*8))
u_tft_ctrl(.clk (clk),.rst_n    (rst_n),.chan_in(chan_in),.chan_data(chan_data),.tft_r  (tft_r),.tft_g  (tft_g),.tft_b  (tft_b),.tft_hs (tft_hs),.tft_vs    (tft_vs),.tft_pwm(tft_pwm),.tft_de  (tft_de),.tft_clk(tft_clk), .hcount (hcount),.vcount    (vcount)
);

目的就是做8行16列的测试阵列。

阵列生成模块的例化使用generate完成:

reg[16*8 -1:0]power;genvar i;
genvar j;
generate
for(i=0;i<8;i=i+1)begin:GEN0for(j=0;j<16;j=j+1)begin:GEN1square_gen u_squ(.x_point  (20*(j+1)),.y_point    (20*(i+1)),.x_size     (10),.y_size        (10),.r         (8'b10101010),.g           (8'b10101010),.b           (8'b10101010),.hcount      (hcount),.vcount        (vcount),.power_en  (power[i*16+j]),.chan_en   (chan_in[i*16+j]),.chan_data   (chan_data[(i*16+j)*24 +:24]));end
end
endgenerate

对外提供了power信号作为控制端。比如我有一个阵列键盘的控制模块,里面有很多控制信号,行为一直不对的话我就可以这样连接:

always @*beginpower = {128{1'b1}};power[0*16 +: 16] = 16'hffff;//第一行全开,作为参考行power[1*16 +: 16] = key;power[2*16 +: 4] = row_i;power[3*16 +: 4] = col_o;power[4*16 +: 4] = row_stable;power[4*16 +: 4] = row_change;power[5*16 +: 4] = state_out;
end

最后看到的结果就是开头的那个图了:

其他说明

工程的路径:

链接:https://pan.baidu.com/s/1RE7caFvP-fKDPkwZv1B3yw 
提取码:2ooo

工程中使用了PLL,50M to 9M,在工程中创建即可,我太久没用quartus ii了,找了半天一直跟Qsys那较劲:

使用了以下管脚,具体的摆放在工程里有:

没有做时序约束,所以可以看编译区对应时序分析是红的,9M时钟的一个系统,我觉得不做也无所谓,没有啥违规的风险:

具体TFT的管脚对应关系,我习惯写一个.v文件,在.v里做分配,先对齐到FPGA的输出,再对到TFT屏幕的管脚:

//assign PIN_F16 = rst_n;//TFT_RESET
assign PIN_F13 = 1'b0;//TFT TS_PEN, SPI
assign PIN_G15 = 1'b0;//TFT TS_CLK, SPI
assign PIN_F15 = 1'b0;//TFT TS_MISO, SPI
assign PIN_G11 = 1'b0;//TFT TS_MOSI, SPI
assign PIN_F14 = 1'b0;//TFT TS CS, SPI
assign PIN_J12 = tft_pwm;
assign PIN_J11 = tft_de;
assign PIN_J14 = tft_vs;
assign PIN_K11 = tft_hs;
assign PIN_J15 = tft_clk;
assign PIN_J16 = tft_b[7];
assign PIN_K15 = tft_b[6];
assign PIN_K16 = tft_b[5];
assign PIN_J13 = tft_b[4];
assign PIN_L15 = tft_b[3];
assign PIN_L12 = tft_g[7];
assign PIN_K12 = tft_g[6];
assign PIN_L13 = tft_g[5];
assign PIN_M12 = tft_g[4];
assign PIN_L14 = tft_g[3];
assign PIN_N16 = tft_g[2];
assign PIN_P16 = tft_r[7];
assign PIN_N15 = tft_r[7];
assign PIN_R16 = tft_r[6];
assign PIN_P15 = tft_r[4];
assign PIN_N14 = 1'b0;//TFT NC
assign PIN_N13 = tft_r[3];

【FPGA的小娱乐】tft显示屏生成信号辅助测试阵列相关推荐

  1. FPGA:计算滑动求和----信号检测计算信号功率

    FPGA:计算滑动求和----信号检测计算信号功率 在进行简单信号检测过程中,需要计算信号的能量,这时候需要用到滑动求和的计算过程. 这里记录如何利用Verilog编写滑动求和过程. 思路:滑动求和的 ...

  2. 显示屏连接控制卡超时_小间距led显示屏的安装步骤

    小间距LED显示屏安装,一般常用的方法都会选择边框.单元板.排线.电源.控制卡.处理器.控制电脑等材料来自己组装成LED显示屏,那么如何把一块块模组组装成一整块大的LED显示屏幕,并且正常使用呢?华邦 ...

  3. TFT显示屏驱动设计与验证

    TFT显示屏驱动设计与验证 RGB 接口的 TFT 屏扫描方式和 VGA (Video Graphics Array)标准类似,也是使用行列扫描的方式.在介绍 TFT 屏扫描原理之前,先来介绍下 VG ...

  4. (116)FPGA面试题-FIFO相关参数与信号,为什么要用格雷码

    1.1 FPGA面试题-FIFO相关参数与信号,为什么要用格雷码 1.1.1 本节目录 1)本节目录: 2)本节引言: 3)FPGA简介: 4)FPGA面试题-FIFO相关参数与信号,为什么要用格雷码 ...

  5. 电脑显示屏无信号怎么办?

    随着使用电脑的用户越来越多,而使用的用户遇到的问题就越多了,而经常用电脑的同学大部分都遇到过电脑显示器无信号的情况吧.其实相比显示器没有任何显示而言,电脑显示器无信号的故障更容易解决.下面,小编就来教 ...

  6. 电脑开机后,显示屏无信号怎么处理?

    转自:微点阅读  https://www.weidianyuedu.com 随着使用电脑的用户越来越多,而使用的用户遇到的问题就越多了,而经常用电脑的同学大部分都遇到过电脑显示器无信号的情况吧.其实相 ...

  7. 弟中弟级,基于Vivado的IP核封装以及仿真调用,FPGA入门小玩

    弟中弟级,基于Vivado的IP核封装以及仿真调用,FPGA入门小玩 IP核:知识产权核,指某一方提供的.形式为逻辑单元的可重用模块.IP核通常已经通过了设计验证,设计人员以IP核为基础进行设计,可以 ...

  8. 计算机房显示屏无信号,显示屏无信号,教您电脑显示屏无信号怎么办

    最近有用户遇到电脑开机显示器没信号,指示灯一直是橙色的,主机运行也正常,风扇还在转着.这是怎么回事呢?那遇到这样的问题,我们要如何去解决它呢?不懂的用户看过来,下面就是小编给大家带来的电脑显示屏无信号 ...

  9. P1.2高清小间距LED显示屏600*337.5mm箱体价格

    小间距LED显示屏指的是像素点间距在P2及其以下,例如p1.2, P2,P1.875,P1.667和P1.56,目前小间距LED显示屏被应用于室内的各个领域,也有应用于户外的,不过比较少,在这里不做探 ...

  10. dac生成信号频率取决于_基于DAC芯片的信号源生成系统的制作方法

    本发明涉及干扰机技术领域,特别是基于DAC芯片的信号源生成系统. 背景技术: 随着现在通信技术的高速发展,对于装备的小型化.集成化.成本控制要求越来越高,如何设计出低成本.高集成度.小型化的装备是现阶 ...

最新文章

  1. MySQL: Root element is missing
  2. C语言自己写得到文件大小的函数已及Python
  3. Python高阶函数--map、lambda、reduce、filter、zip
  4. P3501-[POI2010]ANT-Antisymmetry【hash,二分答案】
  5. Python笔记-使用代理切换ip爬取数据
  6. Java怎么避免重复订单_javaEE高并发之如何产生唯一不重复订单号
  7. 硬纪元干货|镁客网萨向东:推动硬科技产业落地,助力传统产业升
  8. 移动端自适应布局方案尝试
  9. Julia: 引用、copy与数组
  10. SpringClould之Eureka原理详解
  11. 王牌战争文明重启服务器维护中,王牌战争文明重启常见问题大全 游戏问题QA...
  12. ADSL自动更换IP的方法
  13. 构建模型——用Python构建logit、负二项回归、决策树与随机森林机器学习模型
  14. 硬件电路设计之三极管和场效应管做开关管
  15. 培智 计算机 教研活动,凝聚智慧促发展,聚焦课堂提实效——记嘉兴市特殊教育培智领域生活数学、绘画与手工、运动与保健专题研讨活动...
  16. 25 个超棒的 Python 脚本合集(迷你项目)
  17. 华为路由器负载均衡_华为路由器双出口负载均衡+备份 (2)
  18. adb: error: failed to copy ‘xx‘ to ‘xx‘: remote couldn‘t create file: Permission denied
  19. ROS运行调用摄像头无法显示的解决办法
  20. Winmore面向全球物流市场推出新款招投标管理软件

热门文章

  1. 黑客利用2012伦敦奥运诈骗个人资料
  2. python 生成二维码图片
  3. php商城系统源码的好处有哪些?
  4. 360安全卫士团队版or企业版卸载
  5. 卸载企业版360 含密码
  6. 数据库 “投毒”修复方案
  7. 漫漫Java学习路,第十四天
  8. python回归分析波士顿房价_python 线性回归(Linear Regression)预测波士顿房价
  9. 小白刷LeeCode(算法篇)
  10. 基于PC的机器视觉系统设计