差别

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

到此差别页面的链接

两侧同时换到之前的修订记录 前一修订版
book_excise_video_if [2021/08/24 11:37]
zili
book_excise_video_if [2021/08/24 12:20] (当前版本)
zili
行 111: 行 111:
 </​code>​ </​code>​
  
-\\ +#### 3.3 I2C_AV_Config模块(I2C_AV_Config.v) 
-\\ +I2C接口模块,负责配置ADV7181,具体I2C的工作原理已在I2C接口实验介绍,在此仅给出其接口: 
-### 4仿真结果+<code verilog> ​
  
 +input iCLK;​ //​时钟信号,50MHZ
 +input iRST_N;​ //​异步复位信号
 +output iRST_N;​ //​ I2C串行时钟线
 +inout I2C_SDAT;​ //​ I2C串行数据线
  
 +</​code>​
  
 +#### 3.4 TV_to_VGA模块(TV_to_VGA.v)
 +实例化并连接itu_r656_decoder和YCbCr2RGB模块,根据itu_r656_decoder模块给出的两倍于ADV7181给出的TD_HS的信号mTD_HSx2,生成VGA接口所需的场行同步信号,其接口定义如下:
 +<code verilog> ​
 +
 +input  ​   OSC_27; ​ //​时钟:27MHz
 +input RESET; ​  ​ //​系统复位
 +output VGA_BLANK;​ //​VGA接口空白指示信号
 +output VGA_SYNC;​ //​VGA接口同步信号
 +output VGA_CLOCK;​ //​VGA接口时钟信号
 +output VGA_HS;​ //​VGA接口行同步信号
 +output VGA_VS; //​VGA接口场同步信号
 +output [9:​0]VGA_R;​ //​VGA红颜色信号
 +output [9:​0]VGA_G;​ //​VGA绿颜色信号
 +output [9:​0]VGA_B;​ //​VGA蓝颜色信号
 +input [7:​0]TD_D;​ //TV Decoder的8bit数据信号
 +input TD_HS; //TV Decoder行同步信号
 +input TD_VS; //TV Decoder场同步信号
 +要注意的一点是,VGA的行同步信号VGA_HS的频率是ADV7181给出的行同步信号TD_HS频率的两倍。具体程序如下:
 +assign VGA_HS = oVGA_H_SYNC;​
 +assign VGA_VS = oVGA_V_SYNC;​
 +always@(posedge OSC_27 or negedge sync_en) begin
 + if(!sync_en) begin
 + Pre_HS <​= 0;​ //​存储TV_Decoder输出的行同步信号
 + mACT_HS <​= 0;​ //​行像素信号有效指示位
 + H_Cont <​= 0;​ //​行内像素点计数器
 + oVGA_H_SYNC <​= 0;​ //​向VGA输出的行同步信号
 + end
 + else begin
 + Pre_HS<​=mTD_HSx2;//​ itu_r656_decoder模块输出的两倍于TD_HS的行同步信号
 + if( {Pre_HS,​mTD_HSx2}==2'​b10 ) 
 + mACT_HS <​= 1;​
 + if(mACT_HS) begin
 + if( H_Cont < 852 ) //​像素点计数器自动加一。
 + H_Cont <​= H_Cont+1;​
 + else begin
 + H_Cont <​= 0;​
 + mACT_HS <​= 0;​
 + end
 + if( H_Cont < H_SYNC_CYC ) //​根据像素点计数器产生行同步信号。
 +
 + oVGA_H_SYNC <​= 0;​
 + else
 + oVGA_H_SYNC <​= 1;​
 + end
 + else begin
 + oVGA_H_SYNC <​= 0;​
 + H_Cont <​= 0;​
 + end
 + end
 +end
 +/​*根据两倍于ADV7181给出的行同步TD_HS的信号mTD_HSx2生成VGA所需的场同步信号oVGA_V_SYNC*/​
 +always@(posedge OSC_27 or negedge sync_en) begin
 +if(!sync_en) begin
 + Pre_VS <​= 1;​ //​存储TV_Decoder输出的场同步信号
 + mACT_VS <​= 0;​ //​视频场内行有效指示位
 + V_Cont <​= 0;​ //​视频场内行计数器
 + oVGA_V_SYNC <​= 0;​ //​向VGA输出的帧同步信号
 +end
 + else begin
 + Pre_VS <​= TD_VS;//​ADV7181给出的场同步信号
 + if({Pre_VS,​TD_VS}==2'​b01)
 + mACT_VS <​= 1;​
 + if( (H_Cont==1) && mACT_VS) begin
 + if( V_Cont < 524 ) //​行计数器
 + V_Cont <​= V_Cont+1;​
 + else
 + V_Cont <​= 0;​
 + if( V_Cont < V_SYNC_CYC ) //​根据行计数器生成场同步信号
 + oVGA_V_SYNC <​= 0;​
 + else
 + oVGA_V_SYNC <​= 1;​
 + end
 + end
 +end
 +
 +</​code>​
 +
 +#### 3.5 itu_r656_decoder模块(itu_r656_decoder.v)
 +根据ITU-R BT.656标准解码ADV7181给出的数据流,并将隔行扫描的信号转为符合VGA接口标准的逐行扫描的信号。其接口如下所示:
 +<code verilog> ​
 + input CLOCK //27 MHz时钟接口
 + input [7:​0]TD_D //​TV Decoder的8bit位宽的数据信号
 + input TD_HS //TV Decoder行同步信号
 + input TD_VS //TV Decoder场同步信号
 + output [7:​0]Y //​解出来的YCbCr色度空间内的亮度Y信号
 + output [7:​0]Cb //​解出来的YCbCr色度空间内的色度Cb信号
 + output [7:​0]Cr //​解出来的YCbCr色度空间内的饱和度Cr信号
 +output reg HSx2 //​两倍于TD_HS的行同步信号
 + ​output blank //​VGA接口空白指示信号
 +该模块首先需要解码出场行同步信号。具体程序如下所示:
 +// 检测行场同步信号
 + reg[7:​0]R1,​R2,​R3;​
 + reg[7:​0]RR1,​RR2,​RR3;​
 + wire  Y_check=( (R3==8'​hff) && (R2==8'​h00) && (R1==8'​h00) )?​1:​0;​ //​根据标准检测
 +//​行同步信号
 + always @(posedge CLOCK) begin
 + RR1=TD_D;//​通过8位宽的移位寄存器暂存3个ADV7181输出的8bit数据,
 +//​以用来行同步检测
 + RR2=R1;
 + RR3=R2;
 +
 + end
 + always @(negedge CLOCK) begin
 +     R1=RR1;
 +     R2=RR2;
 +     R3=RR3;
 + end
 +
 +/////​解出场行指示信号
 + reg START,​Field;​
 + always @(posedge CLOCK) begin
 + if (Y_check==1) begin
 +     START=~TD_D[4];​ //​检测行开始信号
 + Field= TD_D[6];​ //​检测出奇偶场
 + end
 + end
 + 因为需要将隔行扫描转为逐行扫描,而逐行扫描的行同步信号需要为隔行扫描行同步信号的二倍。具体程序如下所示:
 +//​用27Mhz系统时钟,记录每一行内图像数据的个数,也就是行周期内像素点的个数。
 + reg [10:​0]H_COUNTER;//​行周期内像素计数器
 + reg [10:​0]RH_COUNTER;//​行周期内像素的总数
 +
 + always @(posedge CLOCK) begin
 + if (TD_HS) H_COUNTER=0;​   ​
 + else H_COUNTER=H_COUNTER+1;​
 +    end
 + always @(posedge TD_HS) begin
 + RH_COUNTER=H_COUNTER;​
 +end
 +//​根据像素点计数器生成ITU-R 656规定的视频场内行周期两倍的信号。
 +    always @(posedge CLOCK) begin
 + if (
 + ((H_COUNTER >= 0) && (H_COUNTER < `sync)) ||
 +     ((H_COUNTER >= RH_COUNTER[10:​1]) && (H_COUNTER < (RH_COUNTER[10:​1]+`sync+1)))
 + )
 + HSx2=0;
 + else
 + HSx2=1;
 +end
 +
 +</​code>​
 +
 +上面程序中生成了一个两倍于隔行扫描行同步的信号,根据该信号生成逐行扫描信号所需的场合同步信号。
 +
 +#### 3.6 dul_port_c1024模块(dul_port_c1024.v)
 +利用FPGA内部的双口RAM将一行场信号重复转为两行场信号。其实现主要原理为:双口RAM写入时钟为13.5MHz,而读取时钟为27MHz,通过这样就可以将一行信号转为两行信号,实现隔行向逐行转换。其接口为:
 +<code verilog> ​
 +
 + input ​ [7:0]iDATA, //​输入信号
 + input ​ iHSYNC, //​行同步信号,和TD_HS相同频率
 + input ​ iHSYNCx2,​ //​行同步信号,频率两倍于TD_HS,同时其中场消影期间为0
 + input ​ Y_CLOCK,​ //​时钟:13.5MHz
 + input ​ Y_CLOCKx2,​ //​时钟:27MHz
 + input ​ field,​ //​电视信号奇场偶场指示信号
 + input ​ VS, //TV Decoder场同步信号
 + output [7:​0]oDATA //​输出信号
 +具体程序如下所示:
 +/​*counter:​写入RAM的地址信号,其在输入的行同步信号TD_HS有效时归0,同时其自动增加的频率为13.5Mhz*/​
 + reg  [9:​0]counter;​
 + always@(posedge iHSYNC or posedge Y_CLOCK)begin
 + if (iHSYNC)counter=0;​else counter=counter+1;​
 + end
 +/​*counterx2:​读取RAM的地址信号,其在输入的行同步信号iHSYNCx2有效时归0,而iHSYNCx2为TD_HS的两倍,同时其自动增加的频率为27Mhz;通过在一个TD_HS行周期内counterx2归0两次,同时将读取地址信号counterx2增加频率两倍于写入地址信号counter,从而实现:将每一场的行信号重复两次以实现从隔行扫描向逐行扫描的转换.*/​ reg [9:0] counterx2;
 + always@(negedge iHSYNCx2 or posedge Y_CLOCKx2) begin
 + if (!iHSYNCx2) counterx2=0;​ else counterx2=counterx2+1;​
 + end
 +/​*不论I为0为1,其写入接口时钟始终为:13.5MHz,而读出接口时钟始终为:27MHz*/​
 + wire [7:​0]DATA_a,​DATA_b; ​
 + wire I_a= I;
 + wire I_b=~I;
 + wire [9:​0]COUNTER_a= (I)?​counter:​counterx2;​
 + wire [9:​0]COUNTER_b=(!I)?​counter:​counterx2;​
 + wire CLOCK_a= (I)?​~Y_CLOCK:​~Y_CLOCKx2;​
 + wire CLOCK_b=(!I)?​~Y_CLOCK:​~Y_CLOCKx2;​
 +////datax2 output/////
 + assign ​ oDATA=(!I)?​DATA_a:​DATA_b;​
 +
 +/////​双口RAM//////​
 + RAM2 u2(
 + .data_a (iDATA), ​ //a port
 + .wren_a (I_a),​
 + .address_a (COUNTER_a),​
 + .clock_a (CLOCK_a),​
 + .q_a (DATA_a),​
 + .data_b (iDATA), ​ //b port
 + .wren_b (I_b),​
 + .address_b (COUNTER_b),​
 + .clock_b (CLOCK_b),​
 + .q_b (DATA_b)
 + );
 +
 +</​code>​
 +
 +#### 3.7 YCbCr2RGB模块(YCbCr2RGB.v)
 +YCbCr2RGB利用FPGA内部的乘法器实现视频信号从YCbCr色度空间向RGB色度空间的转换。
  
 \\ \\
 \\ \\
-### 5. 演示程序文件说明 
- 
  
 +### 4. 演示程序文件说明
  
 +|文件名|功能|
 +|TE3_DVD2VGA.v|顶层模块|
 +|I2C_AV_Config.v|I2C接口顶层模块|
 +|I2C_Controller.v|I2C接口控制模块|
 +|TV_to_VGA.v|解码ITU-R 656标准模块|
 +|itu_r656_decoder.v|解码ITU-R 656标准模块|
 +|dul_port_c1024.v|隔行转逐行模块|
 +|YCbCr2RGB.v|YCbCr色度空间向RGB色度空间转换模块|
  
 \\ \\
 \\ \\
-### 6. 演示程序使用+### 5. 演示程序使用 
 +演示设备:核心板、扩展板、VGA接口显示器、支持NTSC输出的DVD播放器。 
 + 
 +演示方法:将DVD的输出信号线连接到开发板的J22上,同时将显示器连接到开发板的VGA接口上,开发板上电后,将本程序下载到开发板上即可通过显示器观看DVD输出的视频信号。