FPGA-VGA彩条显示

FPGA VGA彩条显示实验
此实验的功能是在显示屏上显示红黄蓝三个颜色的色条
VGA 视频图形阵列,一种使用模拟信号进行视频传输的标准。
VGA分为行同步与场同步
行同步与场同步都分为同步脉冲、显示后沿、有效数据段、显示前沿。
本实验选用的VGA为640*480,行有效数据的像素点个数为640个,场有效数据的像素点个数为480个,利用25mhz的时钟进行驱动。
module vga(clk,rst_n,hsync,vsync,rgb);
input clk;
input rst_n;
output hsync;
output vsync;
output [15:0] rgb;
wire vga_clk;
vga_xianshi inst2(vga_clk,rst_n,rgb,hsync,vsync);
fenpin inst1(clk,rst_n,vga_clk);
endmodule
module fenpin(clk,rst_n,vga_clk);
input clk,rst_n;
output reg vga_clk;
always @(posedge clk or negedge rst_n)
begin
if(!rst_n)
vga_clk<=0;
else
vga_clk<=~vga_clk;
end
endmodule

module vga_xianshi(vga_clk,rst_n,rgb,hsync,vsync);
input vga_clk;
input rst_n;
output reg [15:0] rgb;
output reg hsync;
output reg vsync;

//分辨率640*480
//行显示数据
parameter h_sync=10’d96; //行同步
parameter h_back=10’d48; //行显示后沿
parameter h_disp=10’d640; //行有效数据
parameter h_front=10’d16; //行显示前沿
parameter h_total=10’d800; //行扫描周期

//场显示数据
parameter v_sync=10’d2; //场同步
parameter v_back=10’d33; //场显示后沿
parameter v_disp=10’d480; //场有效数据
parameter v_front=10’d10; //场显示前沿
parameter v_total=10’d525; //场扫描周期

wire vga_en; //vga有效信号

//行、场计数
reg [9:0] cnt_h; //行计数
reg [9:0] cnt_v; //场计数

//行计数
always @(posedge vga_clk or negedge rst_n)
begin
if(!rst_n)
cnt_h<=0;
else
begin
if(cnt_h==h_total-1)
cnt_h<=0;
else
cnt_h<=cnt_h+1;
end
end

//场计数
always @(posedge vga_clk or negedge rst_n)
begin
if(!rst_n)
cnt_v<=0;
else
begin
if(cnt_hh_total-1)
if(cnt_v
v_total-1)
cnt_v<=0;
else
cnt_v<=cnt_v+1;
else
cnt_v<=cnt_v;
end
end

//行同步信号
always @(posedge vga_clk or negedge rst_n)
begin
if(!rst_n)
hsync<=0;
else
begin
if(cnt_h>=0&&cnt_h<=95)
hsync<=1;
else
hsync<=0;
end
end

//场同步信号
always @(posedge vga_clk or negedge rst_n)
begin
if(!rst_n)
vsync<=0;
else
begin
if(cnt_v>=0&&cnt_v<=1)
vsync<=1;
else
vsync<=0;
end
end

//使能信号
assign vga_en=(cnt_v>=3&&cnt_v<=15&&cnt_h>=144&&cnt_h<=784)?1:0;

//显示红黄蓝
always @(posedge vga_clk or negedge rst_n)
begin
if(!rst_n)
rgb<=0;
else
begin
if(vga_en)
begin
if(cnt_h>=144&&cnt_h<h_disp/51+144)
rgb<=16’b11111_111111_11111;
else if(cnt_h>=h_disp/5
1+144&&cnt_h<h_disp/52+144)
rgb<=16’b00000_000000_00000;
else if(cnt_h>=h_disp/5
2+144&&cnt_h<h_disp/53+144)
rgb<=16’b11111_000000_11111;
else if(cnt_h>=h_disp/5
3+144&&cnt_h<h_disp/5*4+144)
rgb<=16’b00000_111111_00000;
else
rgb<=16’b00000_000000_11111;
end
else
rgb<=0;
end
end
endmodule

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的FPGA VGA显示条的代码示例: ```verilog module vga_color_bar( input clk, // 像素时钟 input rst_n, // 复位信号 output reg [7:0] r, // 红色分量 output reg [7:0] g, // 绿色分量 output reg [7:0] b, // 蓝色分量 output reg hsync, // 水平同步信号 output reg vsync // 垂直同步信号 ); parameter SCREEN_WIDTH = 640; parameter SCREEN_HEIGHT = 480; parameter H_SYNC_PULSE_WIDTH = 96; parameter H_BACK_PORCH = 48; parameter H_FRONT_PORCH = 16; parameter V_SYNC_PULSE_WIDTH = 2; parameter V_BACK_PORCH = 33; parameter V_FRONT_PORCH = 10; reg [9:0] h_count = 0; reg [8:0] v_count = 0; always @(posedge clk or negedge rst_n) begin if(!rst_n) begin h_count <= 0; v_count <= 0; r <= 8'd0; g <= 8'd0; b <= 8'd0; hsync <= 1'b0; vsync <= 1'b0; end else begin if(h_count == SCREEN_WIDTH + H_SYNC_PULSE_WIDTH + H_BACK_PORCH + H_FRONT_PORCH - 1) begin h_count <= 0; if(v_count == SCREEN_HEIGHT + V_SYNC_PULSE_WIDTH + V_BACK_PORCH + V_FRONT_PORCH - 1) begin v_count <= 0; r <= 8'd0; g <= 8'd0; b <= 8'd0; hsync <= 1'b0; vsync <= 1'b0; end else begin v_count <= v_count + 1; hsync <= 1'b0; vsync <= (v_count >= SCREEN_HEIGHT + V_BACK_PORCH && v_count < SCREEN_HEIGHT + V_BACK_PORCH + V_SYNC_PULSE_WIDTH); end end else begin h_count <= h_count + 1; hsync <= (h_count >= SCREEN_WIDTH + H_BACK_PORCH && h_count < SCREEN_WIDTH + H_BACK_PORCH + H_SYNC_PULSE_WIDTH); if(v_count >= V_BACK_PORCH && v_count < V_BACK_PORCH + SCREEN_HEIGHT) begin r <= h_count[3:0] * 32; g <= h_count[3:0] * 8; b <= h_count[3:0] * 2; end else begin r <= 8'd0; g <= 8'd0; b <= 8'd0; end end end end endmodule ``` 该代码使用Verilog语言实现,使用了同步信号和计数器控制VGA信号的输出,通过改变红、绿、蓝三种颜色的分量实现条的渐变效果。注意:该代码只是一个简单的示例,实际使用时需要根据具体的FPGA开发板和显示器的参数进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值