FPGA实现VGA显示串口数据,液晶显示器观察Linux启动

需积分: 9 6 下载量 7 浏览量 更新于2024-07-27 收藏 1.57MB PDF 举报
"VGA_IPCore是一个FPGA驱动参考设计,用于在液晶显示器上显示数字、字母和符号,包括UART模块。设计者旨在将串口输出的Linux启动信息转化为VGA信号,通过显示器呈现。该IPCore能显示ASCII码编码的字符,并支持换行和滚动显示,但存在一些缺陷,需要后续维护和完善。" 在深入探讨VGA_IPCore之前,首先要了解VGA的基本概念。VGA(Video Graphics Array)是一种视频接口标准,它定义了同步时序、分辨率和颜色深度。VGA时序包括行同步信号(HSync)和场同步信号(VSync),这些信号确保显示器正确地接收和显示图像。 1. **VGA时序和驱动原理**: - **VGA接口**:通常包含红、绿、蓝三原色信号线,水平和垂直同步信号线,以及电源线。 - **VGA驱动原理**:FPGA需要产生正确的时序信号,使显示器在每帧内正确地扫描和显示像素。行同步信号指示每一行的开始,而场同步信号标记每一帧的开始。 1. **时序产生和颜色给定**: - **行同步信号和场同步信号**:FPGA需要生成精确的时钟信号来控制行和场的起始,确保显示器正确地按顺序读取像素数据。 - **像素颜色设定**:每个像素由R、G、B三个分量的亮度值决定,这些值由FPGA根据输入数据动态生成。 2. **字符模提取**: - **PCtoLCD2002**:这是一款工具,用于将字体转换为适合于LCD显示的字模数据。 - **mif文件格式**:Memory Initialization File,用于存储字模数据,便于加载到FPGA的内存中。 - **C代码转换**:将PCtoLCD2002生成的数据转换为适应FPGA的mif文件,以便于硬件处理。 3. **VGA_IPCore设计**: - **屏幕像素和字符**:设计中考虑了屏幕的分辨率和字符的布局,每个字符可能占据一定的像素区域。 - **显示字符原理**:通过读取ASCII码并映射到相应的字模,FPGA在指定位置显示字符。 - **向上卷动显示**:当一屏幕内容显示完毕后,IPCore能够自动滚动内容至上一行,以显示新的数据。 - **换行处理**:设计中包含了对换行的处理,有两种策略:简单处理(不完美)和更复杂的方法,以适应不同情况。 尽管VGA_IPCore目前存在一些局限性,它提供了一个基础架构,可以扩展到更复杂的图形和文本显示应用。随着设计的进一步完善和优化,这种FPGA驱动方案对于嵌入式系统的用户界面开发具有很高的价值。
2023-05-22 上传

写出此代码module VGAsig (Clk40M,iRst_n,VGA_HS, VGA_VS ,H_Loc, V_Loc,VGA_BLANK_N,VGA_SYNC_N); input Clk40M; input iRst_n; output reg VGA_HS; output reg VGA_VS; output wire VGA_SYNC_N; output reg VGA_BLANK_N; output wire[10:0]H_Loc; output wire [9:0]V_Loc; reg [10:0] h_cnt; //行计数器,作为行坐标 reg [9:0] v_cnt; //列计数器,作为列坐标 parameter H_SYNCTIME =128, H_BACK =88, H_PIXELS =800, H_FRONT =40, H_PERIOD =1056; parameter V_SYNCTIME =4, V_BACK =23, V_LINES =600, V_FRONT =1, V_PERIOD =628;//------------------- 行场的计数------------------- always @(posedge Clk40M or negedge iRst_n) begin if(iRst_n==1'b0) h_cnt<=1'b0; else if(h_cnt == H_PERIOD-1) h_cnt<=1'b0; else h_cnt<=h_cnt+1; end always @(posedge Clk40M or negedge iRst_n) begin if(iRst_n==1'b0) v_cnt<=1'b0; else if(v_cnt==V_PERIOD-1) v_cnt<=1'b0; else if ( h_cnt==H_PERIOD-1 ) v_cnt<=v_cnt+1; end//-------------------同步信号产生------------------- always @(posedge Clk40M or negedge iRst_n) begin if(iRst_n==1'b0) VGA_HS<=1'b1; else if(h_cnt>=( H_PIXELS + H_FRONT)&& h_cnt <=( H_PIXELS + H_FRONT + H_SYNCTIME -1) ) VGA_HS <=1'b0; //--此处 840~967 为行同步区 else VGA_HS <=1'b1; end always @(posedge Clk40M or negedge iRst_n) begin if(iRst_n==1'b0) VGA_VS<=1'b1; else if(v_cnt>=( V_LINES + V_FRONT)&& v_cnt <=( V_LINES + V_FRONT + V_SYNCTIME -1) ) VGA_VS <=1'b0; //此处 601~604 为场同步区 else VGA_VS <=1'b1; end always @(posedge Clk40M )//产生送入 ADV7123 的复合消隐信号 VGA_BLANK_N,当不在有效显示区时,VGA_BLANK_N 输出低电平;反之,输出高电平; begin if (h_cnt >= H_PIXELS | v_cnt >= V_LINES) VGA_BLANK_N <= 1'b0; // H_PIXELS 为 800,V_LINES 为 600 else VGA_BLANK_N <= 1'b1; end//------------------- 行场像素位置输出------------------- assign H_Loc=h_cnt; assign V_Loc=v_cnt; assign VGA_SYNC_N=(VGA_VS & VGA_HS); endmodule的激励文件

2023-05-22 上传

对代码module VGAsig (Clk40M,iRst_n,VGA_HS, VGA_VS ,H_Loc, V_Loc,VGA_BLANK_N,VGA_SYNC_N); input Clk40M; input iRst_n; output reg VGA_HS; output reg VGA_VS; output wire VGA_SYNC_N; output reg VGA_BLANK_N; output wire[10:0]H_Loc; output wire [9:0]V_Loc; reg [10:0] h_cnt; //行计数器,作为行坐标 reg [9:0] v_cnt; //列计数器,作为列坐标 parameter H_SYNCTIME =128, H_BACK =88, H_PIXELS =800, H_FRONT =40, H_PERIOD =1056; parameter V_SYNCTIME =4, V_BACK =23, V_LINES =600, V_FRONT =1, V_PERIOD =628;//------------------- 行场的计数------------------- always @(posedge Clk40M or negedge iRst_n) begin if(iRst_n==1'b0) h_cnt<=1'b0; else if(h_cnt == H_PERIOD-1) h_cnt<=1'b0; else h_cnt<=h_cnt+1; end always @(posedge Clk40M or negedge iRst_n) begin if(iRst_n==1'b0) v_cnt<=1'b0; else if(v_cnt==V_PERIOD-1) v_cnt<=1'b0; else if ( h_cnt==H_PERIOD-1 ) v_cnt<=v_cnt+1; end//-------------------同步信号产生------------------- always @(posedge Clk40M or negedge iRst_n) begin if(iRst_n==1'b0) VGA_HS<=1'b1; else if(h_cnt>=( H_PIXELS + H_FRONT)&& h_cnt <=( H_PIXELS + H_FRONT + H_SYNCTIME -1) ) VGA_HS <=1'b0; //--此处 840~967 为行同步区 else VGA_HS <=1'b1; end always @(posedge Clk40M or negedge iRst_n) begin if(iRst_n==1'b0) VGA_VS<=1'b1; else if(v_cnt>=( V_LINES + V_FRONT)&& v_cnt <=( V_LINES + V_FRONT + V_SYNCTIME -1) ) VGA_VS <=1'b0; //此处 601~604 为场同步区 else VGA_VS <=1'b1; end always @(posedge Clk40M )//产生送入 ADV7123 的复合消隐信号 VGA_BLANK_N,当不在有效显示区时,VGA_BLANK_N 输出低电平;反之,输出高电平; begin if (h_cnt >= H_PIXELS | v_cnt >= V_LINES) VGA_BLANK_N <= 1'b0; // H_PIXELS 为 800,V_LINES 为 600 else VGA_BLANK_N <= 1'b1; end//------------------- 行场像素位置输出------------------- assign H_Loc=h_cnt; assign V_Loc=v_cnt; assign VGA_SYNC_N=(VGA_VS & VGA_HS); endmodule进行仿真并分析

2023-05-22 上传