VGA字符显示效果
游戏欢迎界面之后是难度选择界面的显示:
利用上一篇内容可以完成下面的绿、黄、红三个色块的显示,那上面的字符显示要怎么实现呢?答案是采用字符点阵来实现。
原理分析
字符点阵是VGA屏幕显示字符时对字符进行数字化的第一步,即把字符中着色部分和非着色部分以1和0表示,最后生成字节码的过程。只有生成了数字化的点阵,才可以在VGA屏幕上进行显示。
得到了字符点阵后还要设计一个Memory以存放字符点阵信息,然后在合适的时间时让VGA 按照存储的字符点阵信息控制颜色输出。
获取字符点阵
这里推荐一个免费的在线软件:
点击进入以后输入“请选择难度”,字节宽度选择8bit,每个字高32,每个字是4列:
(字高和字宽按照想要的大小设定即可,位宽建议选择8bit,5bit得到的汉字显得精度不高。)
生成的字符点阵如下:
代码实现
我们将字节码存储到设计的Memory里面去:
reg [159:0] char [31:0] ; //字符长160 ,宽32
//字符“请选择难度”
always@(posedge clk)
begin
char[0] <= 160'h0000000000000000000000000000000000000000;
char[1] <= 160'h0000000000000000000000000000000000000000;
char[2] <= 160'h00003c000000380001c000000000ee000003c000;
char[3] <= 160'h0e003c000c063c0001e000f00000ff000003e000;
char[4] <= 160'h0f003c180f07b80001cffff80000f7800001e038;
char[5] <= 160'h07803c3c0787b80001c7c0f00000f7800e00e07c;
char[6] <= 160'h07bffffc078738c001c0c1e0003de3980ffffffe;
char[7] <= 160'h079c3c60078f39e001c0e3c03fffe33c0f0e0700;
char[8] <= 160'h07003cf0038ffff001de77c01c3dfffc0f0f0780;
char[9] <= 160'h000ffff8030e38007fff7f800039c7000f0e0730;
char[10] <= 160'h00073c00001c380039c03f00303bc7000f0e0778;
char[11] <= 160'h07003c18001c380001c03f00387bc7000ffffffc;
char[12] <= 160'hff803c3c03b8383001c07fc01c7fc7300fce0700;
char[13] <= 160'h77fffffe7ff0387801dffffe0e77c7780f0e0700;
char[14] <= 160'h0738000077fffffc01ffdffe0f7ffffc0f0e0700;
char[15] <= 160'h070600e007b9ce0001ff9e7807ffc7000f0e0700;
char[16] <= 160'h0707fff00781ce0007fc1c3003fdc7000e0fff00;
char[17] <= 160'h070700f00781ce003fc01c7801f9c7000e0e0700;
char[18] <= 160'h070700e00781ce007fcffffc01e1c7000e0c0380;
char[19] <= 160'h070700e00783ce187dc71c0003f1c7300e7fffc0;
char[20] <= 160'h071fffe007838e1831c01c0003f1c7780e3e07c0;
char[21] <= 160'h073f00e007878e1801c01c1807f9fffc0e070f80;
char[22] <= 160'h077700e007870e1801c01c3c0739c7001e078f00;
char[23] <= 160'h07e7ffe0078f0e3c01dffffe0e3dc7001c03de00;
char[24] <= 160'h07e700e00f9e0ffc01de1c001e3dc7001c01fc00;
char[25] <= 160'h07c700e03ff80ffc01c01c003c19c7181c00f800;
char[26] <= 160'h078700e07cf0000001c01c007819c73c3801fc00;
char[27] <= 160'h070700e0f87fc0ff3fc01c00f001fffe3807ffc0;
char[28] <= 160'h03070fe0701ffffe3fc01c00c001c000703f0ffe;
char[29] <= 160'h000703e00007fff807c01c000001c00071fc03fe;
char[30] <= 160'h000701c00000000003801c000001c000e7e00078;
char[31] <= 160'h0000000000000000000000000000000000000000;
end
然后在VGA显示器上布局要显示的内容:
字符将显示在水平的第15~ 25(不包括25)个block范围内, 以及垂直的第8~10(不包括10)个block范围内:
在该范围内char[char_y][159-char_x] == 1'b1的像素点将被显示成白色:
对应的完整实现代码请参考VGA_control.v模块。
贪吃蛇系列连载文章:
1. 基于FPGA的贪吃蛇游戏设计(一)
2. 基于FPGA的贪吃蛇游戏设计(二)——数码管驱动模块
3. 基于FPGA的贪吃蛇游戏设计(三)——计分模块
4. 基于FPGA的贪吃蛇游戏设计(四)——VGA驱动模块色块显示
5. 基于FPGA的贪吃蛇游戏设计(五)——VGA驱动模块字符显示
6. 基于FPGA的贪吃蛇游戏设计(六)——VGA驱动模块图片显示
7. 基于FPGA的贪吃蛇游戏设计(七)——食物(苹果)的产生
8. 基于FPGA的贪吃蛇游戏设计(八)——状态机设计
9. 基于FPGA的贪吃蛇游戏设计(九)——蛇身控制
关注“友晶Terasic”公众号可获取源码下载地址。
移植到DE1-SOC、DE2-115时代码无需改变,只需修改引脚分配即可。