名称:LCD显示屏通过VGA显示字符设计Verilog代码Quartus AX301开发板
软件:Quartus
语言:Verilog
代码功能:
实验通过字符转换工具将字符转换为 8 进制 mif 文件存放到单端口的 ROM IP 核中,再从 ROM 中把转换后的数据读取出来显示到 VGA 上。
FPGA代码Verilog/VHDL代码资源下载:www.hdlcode.com
本代码已在AX301开发板验证,AX301开发板如下,其他开发板可以修改管脚适配:
设计文档:
字符显示实验
1 实验简介
在上一个实验中讲解了 VGA 显示原理和显示方式,本实验介绍如何使用 FPGA 实现字符显示,通过这个实验更加深入的了解 VGA 的显示方式。
2 实验原理
实验通过字符转换工具将字符转换为 8 进制 mif 文件存放到单端口的 ROM IP 核中,再从ROM 中把转换后的数据读取出来显示到 VGA 上。
3 程序设计
针对 VGA 的时序,行同步和场同步各使用一个计数器,行同步计数器用于产生行同步,行有效像素,场同步计数器用于产生场同步,场有效像素。
在“timing_gen_xy”模块是根据 VGA 时序标准定义了“x_cnt”和“y_cnt”两个计数器并由这两个计数器产生了 VGA 显示的“x”坐标和“y”坐标。程序中用“vs_edge”和“de_falling”分别表示场同步开始信号和数据有效结束信号。
其原理如下图所示:
|
信号名称 |
方向 |
说明 |
|
rst_n |
in |
异步复位输入,低复位 |
|
clk |
in |
外部时钟输入 |
|
i_hs |
in |
行同步信号 |
|
i_vs |
in |
场同步信号 |
|
i_de |
in |
数据有效信号 |
|
i_data |
in |
color_bar 数据 |
|
o_hs |
out |
输出行同步信号 |
|
o_vs |
out |
输出场同步信号 |
|
o_de |
out |
输出数据有效信号 |
|
o_data |
out |
输出数据 |
|
x |
out |
生成 X 坐标 |
|
y |
out |
生成 Y 坐标 |
timing_gen_xy 模块端口
“osd_display”模块是用来读取存储在 Rom ip 核里转换后的字符信息,并在指定区域显示。 首先需要生成能够被 FPGA 识别的 mif 文件。
1.在软件工具及驱动文件夹下找到“FPGA 字模提取”工具。
2.双击.exe 文件打开工具
3.在提取工具的“字符输入”框中输入需要显示的字符,字体和字符高度可以自定义选择。
设置完成后点击“转换”按钮,在界面左下角可以看到转换后的字符点阵大小,点阵的 宽和高在程序中是需要用到的
4.点击“保存”按钮,将文件保存到本例程源文件目录下,需要注意的是在保存类型下应 该选择 Altera(*.mif),点击“保存”按钮。
5.回到字符提取工具界面出现如下对话框表示保存完成,点击确定,退出即可
回到“osd_display”模块程序中,根据字符点阵的宽和高设定了字符的显示大小,可以通过
“timing_gen_xy”模块生成的 X 坐标和 Y 坐标将字符显示在显示屏的任意位置:
always@(posedge pclk) begin
if(pos_y >= 12'd9 && pos_y <= d9="" osd_hegiht="" -="" d1="" pos_x="">= 12'd9 && pos_x <= 12'd9 +
OSD_WIDTH - 12'd1)
region_active <= 1'b1;
region_active <= 1'b0;
end
另外,在前面已经介绍将字符转换后是成点阵的方式存储到 Rom IP 核里,找到生成的 mif 文 件打开后可以看到如下:
转换后的字符已经成了 8bit 的数值文件,所以在从 Rom IP 核中读取 mif 文件时设置如下:
always@(posedge pclk) begin
if(region_active_d0 == 1'b1)
if(q[osd_x[2:0]] == 1'b1)
v_data <= 24'hff0000;
else
v_data <= pos_data;
v_data <= pos_data;
end
调用单端口 Rom IP 核的过程和调用其他 IP 核一样,打开“IP Catalog”找到单端口 ROM:
部分代码展示:
////////////////////////////////////////////////////////////////////////////////// // ov5640 lcd display // // // // Author: meisq // // msq@qq.com // // ALINX(shanghai) Technology Co.,Ltd // // heijin // // WEB: http://www.alinx.cn/ // // BBS: http://www.heijin.org/ // // // ////////////////////////////////////////////////////////////////////////////////// // // // Copyright (c) 2017,ALINX(shanghai) Technology Co.,Ltd // // All rights reserved // // // // This source file may be used and distributed without restriction provided // // that this copyright statement is not removed from the file and that any // // derivative work contains the original copyright notice and the associated // // disclaimer. // // // ////////////////////////////////////////////////////////////////////////////////// //================================================================================ // Description: pwm model // pwm out period = frequency(pwm_out) * (2 ** N) / frequency(clk); // //================================================================================ // Revision History: // Date By Revision Change Description //-------------------------------------------------------------------------------- // 2017/5/3 meisq 1.0 Original
点击链接获取代码文件:http://www.hdlcode.com/index.php?m=home&c=View&a=index&aid=1353
846