注册 登录
电子工程世界-论坛 返回首页 EEWORLD首页 频道 EE大学堂 下载中心 Datasheet 专题
jiajie270的个人空间 https://home.eeworld.com.cn/space-uid-422029.html [收藏] [复制] [分享] [RSS]
日志

VGA显示正弦波

已有 2703 次阅读2018-3-8 16:55 |个人分类:FPGA

花费了两天的时间来研究VGA显示正弦波的试验,波形一直显示不出来。究其原因,是因为一直以来,都是用VGA显示的正弦波的数据,而其实正弦波的每个数据对应的只是一个VGA显示的屏幕上的一个点,而不是点阵。
整个试验的扩展图如下图所示,主要由四部分组成,其中PLL_40M用于生成40M的时钟信号;ROM_SIN用于存储正弦波数据;vga_sync_module用于输出行同步信号和列同步信号,以及当前的X地址和Y地址;vga_congtrol_module则用于从ROM中读取数据及输出显示。

vga_sync_module:

module vga_sync_module
(
    CLK,RSTn,Column_Addr_Sig,Row_Addr_Sig,HSYNC_Sig,VSYNC_Sig,Ready_Sig
);

input CLK;                                                                //时钟信号,40M
input RSTn;                                                             //复位信号
output [10:0]Column_Addr_Sig;                             //X坐标
output [10:0]Row_Addr_Sig;                                  //Y坐标
output HSYNC_Sig;                                                 //行同步信号
output VSYNC_Sig;                                                 //列同步信号
output reg Ready_Sig;

reg [10:0]HSYNC_Cnt;                                             //行计数
reg [10:0]VSYNC_Cnt;                                             //列计数

always @(posedge CLK or negedge RSTn)
begin
    if(!RSTn)
        HSYNC_Cnt<=11'd0;
    else if(HSYNC_Cnt==11'd1056)
                HSYNC_Cnt<=11'd0;
            else
                HSYNC_Cnt<=HSYNC_Cnt+1'b1;
end

always @(posedge CLK or negedge RSTn)
begin
    if(!RSTn)
        VSYNC_Cnt<=11'd0;
    else if(VSYNC_Cnt==11'd628&&HSYNC_Cnt==11'd1056)
                VSYNC_Cnt<=11'd0;
            else if(HSYNC_Cnt==11'd1056)
                        VSYNC_Cnt<=VSYNC_Cnt+1'b1;
end

always @(posedge CLK or negedge RSTn)
begin
    if(!RSTn)
        Ready_Sig<=1'b0;
    else if(HSYNC_Cnt>=11'd216&&HSYNC_Cnt<11'd1017&&VSYNC_Cnt>=11'd27&&VSYNC_Cnt<11'd627)     //屏幕显示区域
                Ready_Sig<=1'b1;
            else
                Ready_Sig<=1'b0;
end

assign HSYNC_Sig=(HSYNC_Cnt<11'd128)?1'b0:1'b1;
assign VSYNC_Sig=(VSYNC_Cnt<11'd4)?1'b0:1'b1;

assign Column_Addr_Sig=Ready_Sig?(HSYNC_Cnt-11'd216):1'b0;
assign Row_Addr_Sig=Ready_Sig?(VSYNC_Cnt-11'd27):1'b0;

endmodule

vga_congtrol_module:

module vga_control_module
(
    CLK,RSTn,Column_Addr_Sig,Row_Addr_Sig,Ready_Sig,ROM_Addr,ROM_Data,Red_Sig,Green_Sig,Blue_Sig
);

input CLK;
input RSTn;
input [10:0]Column_Addr_Sig;
input [10:0]Row_Addr_Sig;
input Ready_Sig;
input [7:0]ROM_Data;
output [7:0]ROM_Addr;
output reg Red_Sig;
output reg Green_Sig;
output reg Blue_Sig;

reg [7:0]m;
always @(posedge CLK or negedge RSTn)
begin
    if(!RSTn)
        m<=8'd0;
    else if(Ready_Sig)
                m<=Column_Addr_Sig[7:0];                                     //读取的地址为X,即行地址
            else   
                m<=8'd0;
end

always @(posedge CLK or negedge RSTn)
begin
    if(!RSTn)
        begin
            Red_Sig=1'b0;
            Green_Sig=1'b0;
            Blue_Sig=1'b0;
        end
    else if(!Ready_Sig)
            begin
                Red_Sig=1'b0;
                Green_Sig=1'b0;
                Blue_Sig=1'b0;
            end
            else if(Row_Addr_Sig==ROM_Data+200)       //当数据与列地址相等的时候,该点显示;此处的加200,实际上是在VGA的显示中下移了200
                    begin
                        Red_Sig=1'b1;
                        Green_Sig=1'b1;
                        Blue_Sig=1'b1;
                    end   
                    else
                        begin
                            Red_Sig=1'b0;
                            Green_Sig=1'b0;
                            Blue_Sig=1'b0;
                        end
end

assign ROM_Addr=m;

endmodule
评论 (0 个评论)

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 注册

热门文章