【FPGA的小娱乐】在tft显示屏上画X型

简介: 【FPGA的小娱乐】在tft显示屏上画X型

前言

我的最终目的还是想在FPGA上做一个小游戏,具体做啥还没想好但是需要一些基本的素材,所以先在屏幕上画一个X出来再说,就像下面这个图:

制作

有一个基础的tft模块已经在 【FPGA的小娱乐】tft显示屏生成信号辅助测试阵列 里说明过了,就是提供chan_in作为输入接口的tft_ctrl模块,基于这个模块的接口可以很简单的做出来画矩形的模块:

1. module square_gen(
2.  input [10-1:0]x_point,
3.  input [10-1:0]y_point,
4.  input [10-1:0]x_size,
5.  input [10-1:0]y_size,
6.  input [8 -1:0]r,
7.  input [8 -1:0]g,
8.  input [8 -1:0]b,
9.  input [10-1:0]hcount,
10.   input [10-1:0]vcount,
11. 
12.   input         power_en,
13. 
14.   output      chan_en,
15.   output[24-1:0]chan_data
16. );
17. 
18. wire [10-1:0]x_left   = x_point;
19. wire [10-1:0]x_right  = (x_point + x_size >= 11'd480) ? 10'd480 : x_point + x_size;
20. wire [10-1:0]y_top    = y_point;
21. wire [10-1:0]y_bottom = (y_point + y_size >= 11'd272) ? 10'd272 : y_point + y_size;
22. 
23. assign chan_en   = power_en && (hcount >= x_left) && (hcount < x_right) && (vcount >= y_top) && (vcount < y_bottom);
24. assign chan_data = {r,g,b};
25. endmodule

那么进一步,画正正当当的直角等腰三角形也很简单:

1. module triangle_gen(
2.  input [10-1:0]x_point,
3.  input [10-1:0]y_point,
4.  input [10-1:0]size,
5.  input [8 -1:0]r,
6.  input [8 -1:0]g,
7.  input [8 -1:0]b,
8. 
9.  input [10-1:0]hcount,
10.   input [10-1:0]vcount,
11. 
12.   input         power_en,
13.   input [3:0]   mode,
14. 
15.   output      chan_en,
16.   output[24-1:0]chan_data
17. );
18. 
19. wire [10-1:0]p0_x_point;
20. wire [10-1:0]p0_y_point;
21. wire [10-1:0]p1_x_point;
22. wire [10-1:0]p2_y_point;
23. 
24. assign mode0_power = (x_point - hcount < size) && (y_point - vcount < size) && (x_point - hcount + y_point - vcount < size);
25. assign mode1_power = (hcount - x_point < size) && (y_point - vcount < size) && (hcount - x_point + y_point - vcount < size);
26. assign mode2_power = (x_point - hcount < size) && (vcount - y_point < size) && (x_point - hcount + vcount - y_point < size);
27. assign mode3_power = (hcount - x_point < size) && (vcount - y_point < size) && (hcount - x_point + vcount - y_point < size);
28. 
29. assign chan_en = power_en &&
30.          ((mode[0] & mode0_power) |
31.           (mode[1] & mode1_power) |
32.           (mode[2] & mode2_power) |
33.           (mode[3] & mode3_power));
34. assign chan_data = {r,g,b};
35. 
36. endmodule

对四个三角形做任意的例化,很容易就能画出例如下面这样的三角形元素图:

两个基本图形有了之后,X就很容易画了,第一种方式是一个正方形减去四个8个小三角形X,另一种方式就是先画\ /两种线,再合成一个X。我是用的第二种,那么就开始画/,这个的方式也很容易,一个正方形减去左上和右下两个直角等腰三角形;\对应的则是一个正方形减去左下和右上两个直角等腰三角形,两种斜线合成一个模块,代码的核心其实就是assign chan_en = squ_chan_en && ~tri0_chan_en && ~tri1_chan_en:

1. module slash_gen(
2.  input [10-1:0]x_point,
3.  input [10-1:0]y_point,
4.  input [10-1:0]size,
5.  input [10-1:0]sub_size,
6.  input [8 -1:0]r,
7.  input [8 -1:0]g,
8.  input [8 -1:0]b,
9. 
10.   input [10-1:0]hcount,
11.   input [10-1:0]vcount,
12. 
13.   input         power_en,
14.   input         mode,
15. 
16.   output      chan_en,
17.   output[24-1:0]chan_data
18. );
19. 
20. wire squ_chan_en;
21. square_gen u_squ(
22.   .x_point  (x_point),
23.   .y_point  (y_point),
24.   .x_size   (size),
25.   .y_size   (size),
26.   .r      (r),
27.   .g      (g),
28.   .b      (b),
29.   .hcount   (hcount),
30.   .vcount   (vcount),
31.   .power_en (power_en),
32.   .chan_en  (squ_chan_en),
33.   .chan_data  ()
34. );
35. 
36. wire tri0_chan_en;
37. wire [4-1:0] tri0_mode = mode ? 4'b0010 : 4'b1000;
38. wire [10-1:0]tri0_x_point = x_point;
39. wire [10-1:0]tri0_y_point = mode ? y_point + size : y_point;
40. triangle_gen u_tri0(
41.   .x_point  (tri0_x_point),
42.   .y_point  (tri0_y_point),
43.   .size   (size-sub_size),
44.   .r      (r),
45.   .g      (g),
46.   .b      (b),
47.   .hcount   (hcount),
48.   .vcount   (vcount),
49.   .power_en (power_en),
50.   .mode   (tri0_mode),
51.   .chan_en  (tri0_chan_en),
52.   .chan_data  ()
53. );
54. 
55. wire tri1_chan_en;
56. wire [4-1:0] tri1_mode = mode ? 4'b0100 : 4'b0001;
57. wire [10-1:0]tri1_x_point = x_point+size;
58. wire [10-1:0]tri1_y_point = mode ? y_point : y_point+size;
59. triangle_gen u_tri1(
60.   .x_point  (tri1_x_point),
61.   .y_point  (tri1_y_point),
62.   .size   (size-sub_size),
63.   .r      (r),
64.   .g      (g),
65.   .b      (b),
66.   .hcount   (hcount),
67.   .vcount   (vcount),
68.   .power_en (power_en),
69.   .mode   (tri1_mode),
70.   .chan_en  (tri1_chan_en),
71.   .chan_data  ()
72. );
73. 
74. assign chan_en = power_en && (squ_chan_en && ~tri0_chan_en && ~tri1_chan_en);
75. assign chan_data = {r,g,b};
76. 
77. endmodule

然后再例化两个斜线,对应的X就出来了:

1. module x_gen(
2.  input [10-1:0]x_point,
3.  input [10-1:0]y_point,
4.  input [10-1:0]size,
5.  input [10-1:0]sub_size,
6.  input [8 -1:0]r,
7.  input [8 -1:0]g,
8.  input [8 -1:0]b,
9. 
10.   input [10-1:0]hcount,
11.   input [10-1:0]vcount,
12. 
13.   input         power_en,
14. 
15.   output      chan_en,
16.   output[24-1:0]chan_data
17. );
18. 
19. wire [1 -1:0]slash0_chan_in;
20. slash_gen u_slash0(
21.   .x_point  (x_point),
22.   .y_point  (y_point),
23.   .size   (size),
24.   .sub_size (sub_size),
25.   .r      (r),
26.   .g      (g),
27.   .b      (b),
28.   .hcount   (hcount),
29.   .vcount   (vcount),
30.   .power_en (1'b1),
31.   .mode   (1'b0),
32.   .chan_en  (slash0_chan_in),
33.   .chan_data  ()
34. );
35. 
36. wire [1 -1:0]slash1_chan_in;
37. slash_gen u_slash1(
38.   .x_point  (x_point),
39.   .y_point  (y_point),
40.   .size   (size),
41.   .sub_size (sub_size),
42.   .r      (r),
43.   .g      (g),
44.   .b      (b),
45.   .hcount   (hcount),
46.   .vcount   (vcount),
47.   .power_en (1'b1),
48.   .mode   (1'b1),
49.   .chan_en  (slash1_chan_in),
50.   .chan_data  ()
51. );
52. 
53. assign chan_en = power_en && (slash0_chan_in || slash1_chan_in);
54. assign chan_data = {r,g,b};
55. 
56. endmodule

在工程里跑一下,输出就是下图:


相关文章
|
Web App开发 编解码 .NET
【黑金原创教程】【FPGA那些事儿-驱动篇I 】实验二十八:TFT模块 - 触屏
实验二十八:TFT模块 - 触屏 读者在上一个实验所玩弄过的 TFT LCD模块,除了显示大小为 320 × 240,颜色为16位RGB的图像信息以外,它还支持触屏。所谓触屏就是鼠标还有键盘以外的输入手段,例如现在流行平板还有智能手机,触屏输入对我们来说,已经成为日常的一部分。
1042 0
|
人工智能 Shell Go
【黑金原创教程】【FPGA那些事儿-驱动篇I 】实验二十七:TFT模块 - 显示
实验二十七:TFT模块 - 显示 所谓TFT(Thin Film Transistor)就是众多LCD当中,其中一种支持颜色的LCD,相较古老的点阵LCD(12864笑),它可谓高级了。黑金的TFT LCD除了320×240大小以外,内置SSD1289控制器,同时也是独立模块。
1131 0
|
1月前
|
算法 数据安全/隐私保护 异构计算
基于FPGA的变步长LMS自适应滤波器verilog实现,包括testbench
### 自适应滤波器仿真与实现简介 本项目基于Vivado2022a实现了变步长LMS自适应滤波器的FPGA设计。通过动态调整步长因子,该滤波器在收敛速度和稳态误差之间取得良好平衡,适用于信道均衡、噪声消除等信号处理应用。Verilog代码展示了关键模块如延迟单元和LMS更新逻辑。仿真结果验证了算法的有效性,具体操作可参考配套视频。
127 74
|
2月前
|
算法 数据安全/隐私保护 异构计算
基于FPGA的16QAM调制+软解调系统,包含testbench,高斯信道模块,误码率统计模块,可以设置不同SNR
本项目基于FPGA实现了16QAM基带通信系统,包括调制、信道仿真、解调及误码率统计模块。通过Vivado2019.2仿真,设置不同SNR(如8dB、12dB),验证了软解调相较于传统16QAM系统的优越性,误码率显著降低。系统采用Verilog语言编写,详细介绍了16QAM软解调的原理及实现步骤,适用于高性能数据传输场景。
175 69
|
2月前
|
移动开发 算法 数据安全/隐私保护
基于FPGA的QPSK调制+软解调系统,包含testbench,高斯信道模块,误码率统计模块,可以设置不同SNR
本文介绍了基于FPGA的QPSK调制解调系统,通过Vivado 2019.2进行仿真,展示了在不同信噪比(SNR=1dB, 5dB, 10dB)下的仿真效果。与普通QPSK系统相比,该系统的软解调技术显著降低了误码率。文章还详细阐述了QPSK调制的基本原理、信号采样、判决、解调及软解调的实现过程,并提供了Verilog核心程序代码。
95 26
|
1月前
|
存储 编解码 算法
基于FPGA的直接数字频率合成器verilog实现,包含testbench
本项目基于Vivado 2019.2实现DDS算法,提供完整无水印运行效果预览。DDS(直接数字频率合成器)通过数字信号处理技术生成特定频率和相位的正弦波,核心组件包括相位累加器、正弦查找表和DAC。相位累加器在每个时钟周期累加频率控制字,正弦查找表根据相位值输出幅度,DAC将数字信号转换为模拟电压。项目代码包含详细中文注释及操作视频。
|
3月前
|
算法 异构计算
基于FPGA的4ASK调制解调系统,包含testbench,高斯信道模块,误码率统计模块,可以设置不同SNR
本文介绍了基于FPGA的4-ASK调制解调系统的算法仿真效果、理论基础及Verilog核心程序。仿真在Vivado2019.2环境下进行,分别测试了SNR为20dB、15dB、10dB时的性能。理论部分概述了4-ASK的工作原理,包括调制、解调过程及其数学模型。Verilog代码实现了4-ASK调制器、加性高斯白噪声(AWGN)信道模拟、解调器及误码率计算模块。
95 8
|
3月前
|
算法 物联网 异构计算
基于FPGA的4FSK调制解调系统,包含testbench,高斯信道模块,误码率统计模块,可以设置不同SNR
本文介绍了基于FPGA的4FSK调制解调系统的Verilog实现,包括高斯信道模块和误码率统计模块,支持不同SNR设置。系统在Vivado 2019.2上开发,展示了在不同SNR条件下的仿真结果。4FSK调制通过将输入数据转换为四个不同频率的信号来提高频带利用率和抗干扰能力,适用于无线通信和数据传输领域。文中还提供了核心Verilog代码,详细描述了调制、加噪声、解调及误码率计算的过程。
124 11
|
3月前
|
算法 数据安全/隐私保护 异构计算
基于FPGA的1024QAM基带通信系统,包含testbench,高斯信道模块,误码率统计模块,可以设置不同SNR
本文介绍了基于FPGA的1024QAM调制解调系统的仿真与实现。通过Vivado 2019.2进行仿真,分别在SNR=40dB和35dB下验证了算法效果,并将数据导入Matlab生成星座图。1024QAM调制将10比特映射到复数平面上的1024个星座点之一,适用于高数据传输速率的应用。系统包含数据接口、串并转换、星座映射、调制器、解调器等模块。Verilog核心程序实现了调制、加噪声信道和解调过程,并统计误码率。
85 1
|
4月前
|
算法 数据安全/隐私保护 异构计算
基于FPGA的64QAM基带通信系统,包含testbench,高斯信道模块,误码率统计模块,可以设置不同SNR
本文介绍了基于FPGA的64QAM调制解调通信系统的设计与实现,包括信号生成、调制、解调和误码率测试。系统在Vivado 2019.2中进行了仿真,通过设置不同SNR值(15、20、25)验证了系统的性能,并展示了相应的星座图。核心程序使用Verilog语言编写,加入了信道噪声模块和误码率统计功能,提升了仿真效率。
88 4

热门文章

最新文章