差别

这里会显示出您选择的修订版和当前版本之间的差别。

到此差别页面的链接

两侧同时换到之前的修订记录 前一修订版
后一修订版
前一修订版
book_excise_vga_if [2021/08/24 11:10]
zili
book_excise_vga_if [2021/08/24 12:18] (当前版本)
zili
行 10: 行 10:
 ### 2. 实验原理 ### 2. 实验原理
 #### 2.1 VGA接口电路原理图 #### 2.1 VGA接口电路原理图
-在介绍VGA接口的工作原理之前,先介绍一下本实验的VGA接口电路图,如图 18 1所示。其中U18为VGA控制芯片ADV7123,而J21为VGA接口。实验中通过FPGA控制U18来实现图像的输出。+在介绍VGA接口的工作原理之前,先介绍一下本实验的VGA接口电路图,如图18-1所示。其中U18为VGA控制芯片ADV7123,而J21为VGA接口。实验中通过FPGA控制U18来实现图像的输出。
 {{ :​图18-1.jpg |图18-1 实验原理图}} {{ :​图18-1.jpg |图18-1 实验原理图}}
 <WRAP centeralign>​ <WRAP centeralign>​
行 25: 行 25:
  
 #### 2.3 VGA时序分析 #### 2.3 VGA时序分析
-本实验需要在显示器上显示一个640*480分辨率的静态图像,同时根据VGA接口需要产生相应的场行消影信号,具体信号比例如图 18 3所示。+本实验需要在显示器上显示一个640*480分辨率的静态图像,同时根据VGA接口需要产生相应的场行消影信号,具体信号比例如图18-3所示。 
 {{ :​图18-3.png |图18-3 有效信号和场行消影信号所占的比例}} {{ :​图18-3.png |图18-3 有效信号和场行消影信号所占的比例}}
 <WRAP centeralign>​ <WRAP centeralign>​
 **图18-3 有效信号和场行消影信号所占的比例** **图18-3 有效信号和场行消影信号所占的比例**
 </​WRAP>​ </​WRAP>​
 +\\
  
-控制VGA接口要解决数据来源、数据存储、时序实现等问题,其中关键还是如何实现VGA时序。 VGA的行时序如图 18-4所示,其中包括同步脉冲(Sync a)、显示后沿(Back porch b)、显示时序段(Display interval c)和显示前沿(Front porch d)四个部分。 +控制VGA接口要解决数据来源、数据存储、时序实现等问题,其中关键还是如何实现VGA时序。 VGA的行时序如图 18-4所示,其中包括同步脉冲(Sync a)、显示后沿(Back porch b)、显示时序段(Display interval c)和显示前沿(Front porch d)四个部分。\\ 
-{{ :​图18-4.jpg |图18-4 ​ VGA行时序参考图}}+ 
 +{{ :​图18-4.jpg |图18-4 VGA行时序参考图}}
 <WRAP centeralign>​ <WRAP centeralign>​
-**图18-4 ​ VGA行时序参考图**+**图18-4 VGA行时序参考图**
 </​WRAP>​ </​WRAP>​
  
 行时序中各个部分持续时钟周期分别为:同步脉冲96像素点周期,显示后沿48像素点周期,显示时序段640像素点周期,显示前沿16像素点周期,一共800个像素点周期。在程序中对应的参数为: 行时序中各个部分持续时钟周期分别为:同步脉冲96像素点周期,显示后沿48像素点周期,显示时序段640像素点周期,显示前沿16像素点周期,一共800个像素点周期。在程序中对应的参数为:
 +
 <code verilog> ​ <code verilog> ​
  
行 53: 行 57:
 </​WRAP>​ </​WRAP>​
  
 +\\
 场时序和行时序不同的是,行时序以像素点周期为单位,而场时序则以行周期为单位。场时序也分为四个部分组成,如图 18 5所示,各个部分持续行周期数分别为:帧同步脉冲2个行周期,帧显示后沿32个行周期,帧显示时序段个480个行周期,帧显示前沿11个行周期,一共525个行周期。在程序中对应的参数为: 场时序和行时序不同的是,行时序以像素点周期为单位,而场时序则以行周期为单位。场时序也分为四个部分组成,如图 18 5所示,各个部分持续行周期数分别为:帧同步脉冲2个行周期,帧显示后沿32个行周期,帧显示时序段个480个行周期,帧显示前沿11个行周期,一共525个行周期。在程序中对应的参数为:
 +
 <code verilog> ​ <code verilog> ​
  
行 63: 行 69:
  
 </​code>​ </​code>​
 +
  
 #### 2.4 VGA时序实现 #### 2.4 VGA时序实现
-根据帧刷新频率以及每一帧的行数和每一行的像素个数来确定主时钟频率,确定主时钟之后,在FPGA中利用计数器,以计算出的各时序段时钟周期数为基准,产生不同宽度和周期的脉冲信号,再利用它们的逻辑组合构成图 18 4和图 18 5中的a、b、c、d各时序段以及D/A转换器的空白信号BLANK和同步信号SYNC。在行同步期间和场同步期间空白信号BLANK有效,而同步信号SYNC一直拉低。+ 
 +根据帧刷新频率以及每一帧的行数和每一行的像素个数来确定主时钟频率,确定主时钟之后,在FPGA中利用计数器,以计算出的各时序段时钟周期数为基准,产生不同宽度和周期的脉冲信号,再利用它们的逻辑组合构成图 18 4和图 18 5中的a、b、c、d各时序段以及D/A转换器的空白信号BLANK和同步信号SYNC。在行同步期间和场同步期间空白信号BLANK有效,而同步信号SYNC一直拉低。\\
  
 在本实验中设计刷新率为60Hz/​s,每帧包含525行,而每行包含800个像素点,在VGA主时钟频率为:60X525X800=25200000Hz,即25.2MHz。 在本实验中设计刷新率为60Hz/​s,每帧包含525行,而每行包含800个像素点,在VGA主时钟频率为:60X525X800=25200000Hz,即25.2MHz。
行 72: 行 80:
 \\ \\
 ### 3. 程序设计 ### 3. 程序设计
 +
 #### 3.1 总体架构 #### 3.1 总体架构
-整个程序由5个模块组成,如图18-6所示: + 
-1. TE3_Default是顶层模块,实例化各子模块并连接各子模块。 +整个程序由5个模块组成,如图18-6所示:\\ 
-2. Reset_Delay使系统延时20’hFFFFF个时钟周期(50MHz)后才开始工作,延时主是为了防止系统上电初期的不稳定性。 +1. TE3_Default是顶层模块,实例化各子模块并连接各子模块。\\ 
-3. VGA_Controller模块产生图 18 4和图 18 5所示的接口时序,同时控制VGA_OSD_RAM模块,读取VGA_OSD_RAM模块中ROM内保存的图像数据值,并将该图像通过VGA接口输出。 +2. Reset_Delay使系统延时20’hFFFFF个时钟周期(50MHz)后才开始工作,延时主是为了防止系统上电初期的不稳定性。\\ 
-4. VGA_OSD_RAM模块存储待显示的图像。+3. VGA_Controller模块产生图 18 4和图 18 5所示的接口时序,同时控制VGA_OSD_RAM模块,读取VGA_OSD_RAM模块中ROM内保存的图像数据值,并将该图像通过VGA接口输出。\\ 
 +4. VGA_OSD_RAM模块存储待显示的图像。\\
 5. VGA_PLL模块产生频率为25.2MHz的VGA接口所需的主时钟。 5. VGA_PLL模块产生频率为25.2MHz的VGA接口所需的主时钟。
 {{ :​图18-6.png |图18-6 程序总体架构}} {{ :​图18-6.png |图18-6 程序总体架构}}
行 103: 行 113:
  
 #### 3.3 Reset_Delay模块(Reset_Delay.v) #### 3.3 Reset_Delay模块(Reset_Delay.v)
-系统延时20’hFFFFF个系统周期后才开始工作。具体程序如下所示:+ 
 +系统延时20’hFFFFF个系统周期后才开始工作。具体程序如下所示:\\
 <code verilog> ​ <code verilog> ​
  
行 212: 行 223:
 </​code>​ </​code>​
  
 +#### 3.5 VGA_OSD_RAM模块(VGA_OSD_RAM.v)
 +这里需要说明的是因为FPGA内部的RAM大小有限,无法存储10位三基色的图像数据,所以这里只存储了黑白2值图像。VGA_OSD_RAM模块根据读取出来的2值图像的值,也即是根据读取出来的是0还是1而给出相应的10位的三基色。其接口如下所示:
 +<code verilog> ​
  
-\\ +output reg [9:​0] oRed;//​输出像素色彩信号 
-\\ +output reg [9:​0] oGreen;​ //​输出像素色彩信号 
-### 4仿真结果+output reg [9:​0] oBlue;​ //​输出像素色彩信号 
 +input [18:​0] iVGA_ADDR;​ //​输出像素值存储的地址信号 
 +input iVGA_CLK;​ //​ VGA时钟:25.2MHz 
 +input [18:​0] iWR_ADDR;​ //​输入写地址信号 
 +input iWR_DATA;//​输入待写入数据 
 +input iWR_EN;//​输入写使能 
 +input iWR_CLK;//​输入写时钟 
 +input [9:​0] iON_R;//​当存储的像素点数据位1’b1时,对应的RGB三色值 
 +input [9:​0] iON_G;​ 
 +input [9:​0] iON_B;​ 
 +input [9:​0] iOFF_R;​ //​当存储的像素点数据位1’b0时,对应的RGB三色值 
 +input [9:​0] iOFF_G;​ 
 +input [9:​0] iOFF_B;​ 
 +input iRST_N;​ 
 +具体程序如下所示: 
 +reg [2:​0] ADDR_d;//​存储输入地址信号的低3位 
 +reg [2:​0] ADDR_dd;//​为时序需要将ADDR_d延时一个时钟周期 
 +always@(posedge iVGA_CLK or negedge iRST_N) begin 
 + if(!iRST_N) begin 
 + oRed <​= 0;​ 
 + oGreen <​= 0;​ 
 + oBlue <​= 0;​ 
 + ADDR_d <​= 0;​ 
 + ADDR_dd<​= 0;​
  
 + end
 + else begin
 + ADDR_d <​= iVGA_ADDR[2:​0];​
 +ADDR_dd <​= ~ADDR_d;  ​
 + oRed <​= ROM_DATA[ADDR_dd]?​ iON_R : iOFF_R; //​根据该像素对应
 +//​在存储器的值为0还是为1,输出项对应的10为RGB三色信号
  
 + oGreen <​= ROM_DATA[ADDR_dd]?​ iON_G : iOFF_G;
 + oBlue <​= ROM_DATA[ADDR_dd]?​ iON_B : iOFF_B;
 +end
 +end
 +//​存储了图像的RAM。
 +Img_RAM u0 ( //​写入接口,目前没有使用
 + .data(iWR_DATA),​
 + .wren(iWR_EN),​
 + .wraddress({iWR_ADDR[18:​3],​~iWR_ADDR[2:​0]}),​
 + .wrclock(iWR_CLK),​
 + //​ Read Out Side
 + .rdaddress(iVGA_ADDR[18:​3]),​
 + .rdclock(iVGA_CLK),​
 + .q(ROM_DATA));​
  
 +</​code>​
 +
 +读取出来的数据为8位宽,而8位宽的数据中的每一位对应一个像素点,同时8位位宽数据的低位对应的像素应该先显示在屏幕上,截取输入地址信号iVGA_ADDR的低3位作为MUX,输出相应的像素信息。
  
 \\ \\
 \\ \\
-### 5文件说明 +### 4运行结果 
 +通过SignalTap看到的FPGA内部场行同步信号如图 18 7所,其中VGA_HS为图 18 4所示时,而VGA_R为红色信号线,而VGA_VS为场同步信号线。
  
 +{{ :​图18-7.jpg |图18-7 运行结果}}
 +<WRAP centeralign>​
 +**图18-7 运行结果**
 +</​WRAP>​
  
 +\\
 +\\
 +### 5. 演示程序文件说明
 +|文件名|功能|
 +|TE3_Default.v|顶层模块。|
 +|Reset_Delay.v|延时模块。|
 +|VGA_Controller.v|VGA控制逻辑模块|
 +|VGA_OSD_RAM.v|存储显示数据模块。|
 +|VGA_PLL.v|产生频率为25.2MHz的VGA时序所需的主时钟。|
  
 \\ \\
 \\ \\
 ### 6. 演示程序使用 ### 6. 演示程序使用
 +演示设备:核心板、扩展板、带VGA接口的显示器。
  
 +演示方法:将显示器连接到开发板上面的VGA接口上,然后把程序下载到开发板上既可以看到显示器上显示的图像。