【FPGA的小娱乐】tft显示屏生成信号辅助测试阵列
目录
前言
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显示屏生成信号辅助测试阵列相关推荐
- FPGA:计算滑动求和----信号检测计算信号功率
FPGA:计算滑动求和----信号检测计算信号功率 在进行简单信号检测过程中,需要计算信号的能量,这时候需要用到滑动求和的计算过程. 这里记录如何利用Verilog编写滑动求和过程. 思路:滑动求和的 ...
- 显示屏连接控制卡超时_小间距led显示屏的安装步骤
小间距LED显示屏安装,一般常用的方法都会选择边框.单元板.排线.电源.控制卡.处理器.控制电脑等材料来自己组装成LED显示屏,那么如何把一块块模组组装成一整块大的LED显示屏幕,并且正常使用呢?华邦 ...
- TFT显示屏驱动设计与验证
TFT显示屏驱动设计与验证 RGB 接口的 TFT 屏扫描方式和 VGA (Video Graphics Array)标准类似,也是使用行列扫描的方式.在介绍 TFT 屏扫描原理之前,先来介绍下 VG ...
- (116)FPGA面试题-FIFO相关参数与信号,为什么要用格雷码
1.1 FPGA面试题-FIFO相关参数与信号,为什么要用格雷码 1.1.1 本节目录 1)本节目录: 2)本节引言: 3)FPGA简介: 4)FPGA面试题-FIFO相关参数与信号,为什么要用格雷码 ...
- 电脑显示屏无信号怎么办?
随着使用电脑的用户越来越多,而使用的用户遇到的问题就越多了,而经常用电脑的同学大部分都遇到过电脑显示器无信号的情况吧.其实相比显示器没有任何显示而言,电脑显示器无信号的故障更容易解决.下面,小编就来教 ...
- 电脑开机后,显示屏无信号怎么处理?
转自:微点阅读 https://www.weidianyuedu.com 随着使用电脑的用户越来越多,而使用的用户遇到的问题就越多了,而经常用电脑的同学大部分都遇到过电脑显示器无信号的情况吧.其实相 ...
- 弟中弟级,基于Vivado的IP核封装以及仿真调用,FPGA入门小玩
弟中弟级,基于Vivado的IP核封装以及仿真调用,FPGA入门小玩 IP核:知识产权核,指某一方提供的.形式为逻辑单元的可重用模块.IP核通常已经通过了设计验证,设计人员以IP核为基础进行设计,可以 ...
- 计算机房显示屏无信号,显示屏无信号,教您电脑显示屏无信号怎么办
最近有用户遇到电脑开机显示器没信号,指示灯一直是橙色的,主机运行也正常,风扇还在转着.这是怎么回事呢?那遇到这样的问题,我们要如何去解决它呢?不懂的用户看过来,下面就是小编给大家带来的电脑显示屏无信号 ...
- P1.2高清小间距LED显示屏600*337.5mm箱体价格
小间距LED显示屏指的是像素点间距在P2及其以下,例如p1.2, P2,P1.875,P1.667和P1.56,目前小间距LED显示屏被应用于室内的各个领域,也有应用于户外的,不过比较少,在这里不做探 ...
- dac生成信号频率取决于_基于DAC芯片的信号源生成系统的制作方法
本发明涉及干扰机技术领域,特别是基于DAC芯片的信号源生成系统. 背景技术: 随着现在通信技术的高速发展,对于装备的小型化.集成化.成本控制要求越来越高,如何设计出低成本.高集成度.小型化的装备是现阶 ...
最新文章
- MySQL: Root element is missing
- C语言自己写得到文件大小的函数已及Python
- Python高阶函数--map、lambda、reduce、filter、zip
- P3501-[POI2010]ANT-Antisymmetry【hash,二分答案】
- Python笔记-使用代理切换ip爬取数据
- Java怎么避免重复订单_javaEE高并发之如何产生唯一不重复订单号
- 硬纪元干货|镁客网萨向东:推动硬科技产业落地,助力传统产业升
- 移动端自适应布局方案尝试
- Julia: 引用、copy与数组
- SpringClould之Eureka原理详解
- 王牌战争文明重启服务器维护中,王牌战争文明重启常见问题大全 游戏问题QA...
- ADSL自动更换IP的方法
- 构建模型——用Python构建logit、负二项回归、决策树与随机森林机器学习模型
- 硬件电路设计之三极管和场效应管做开关管
- 培智 计算机 教研活动,凝聚智慧促发展,聚焦课堂提实效——记嘉兴市特殊教育培智领域生活数学、绘画与手工、运动与保健专题研讨活动...
- 25 个超棒的 Python 脚本合集(迷你项目)
- 华为路由器负载均衡_华为路由器双出口负载均衡+备份 (2)
- adb: error: failed to copy ‘xx‘ to ‘xx‘: remote couldn‘t create file: Permission denied
- ROS运行调用摄像头无法显示的解决办法
- Winmore面向全球物流市场推出新款招投标管理软件