您的位置:首页 > 其它

verilogVGA显示太极图案

2017-09-22 15:23 267 查看
/*
2017.9.19 gy DE2
vga  640x480   60hz
ADV7123 D/A
输入时钟50MHz 低电平复位

时序:
水平同步参数h 行扫描
同步 后沿 有效视屏 前沿  总
时间us    3.8   1.9    25.4     0.6   31.7
计数      96    48    640(l)    16    800

垂直同步参数v 列扫描
同步 后沿 有效视屏 前沿  总
行数      2    33     480(w)    10    525
时间us = 行数X扫描一行所需要的时间

像素时钟25MHz yue=800x525x60
总时间 =31.7usX525X60 yue=1s
计一个数的时间为 1/25MHz or 3.8/96
*/
module vga(
clk,rst_n,                         //input
vga_sync,vga_blank,vga_clk,        //output ADV7123
vga_r,vga_g,vga_b,vga_hs,vga_vs    //output VGA
);
input clk,rst_n;
output reg [9:0] vga_r,vga_g,vga_b;
output reg vga_clk,vga_hs,vga_vs;
output vga_blank,vga_sync;
//-------------------分频-------------------------
always @(posedge clk or negedge rst_n)
if (!rst_n)
vga_clk<=1'b0;
else vga_clk<=~vga_clk;
//---------------时序参数800x525------------------
parameter H_SYNC=10'd96;
parameter H_BACK=10'd48;
parameter H_LENGTH=10'd640;
parameter H_FRONT=10'd16;

parameter V_SYNC=10'd2;
parameter V_BACK=10'd33;
parameter V_WIDTH=10'd480;
parameter V_FRONT=10'd10;

reg [9:0] x,y;
//不用SOG(sync on green 同步信号只在绿色信号中出现)
assign vga_sync=1'b0;
//---------------------计数-----------------------
always@(posedge vga_clk or negedge rst_n)
begin
if(!rst_n) x<=10'd0;
else if(x==800) x<=0;
else x<=x+1'b1;
end
always@(posedge vga_clk or negedge rst_n)
begin
if(!rst_n) y<=10'd0;
else if(y==525) y<=0;
else if(x==800) y<=y+1'b1;
end
//------------通过计的数字输出同步信号---------
always@(posedge vga_clk or negedge rst_n)
begin
if(!rst_n) vga_hs<=1'b1;
else if(x==0) vga_hs<=1'b0;
else if(x==H_SYNC) vga_hs<=1'b1;
end
always@(posedge vga_clk or negedge rst_n)
begin
if(!rst_n) vga_vs<=1'b1;
else if(y==0) vga_vs<=1'b0;
else if(y==V_SYNC) vga_vs<=1'b1;
end
//--------------以上为了时序用vga_clk 以下为了计算精确用clk这个时钟-----------------------

//----------通过横纵坐标x,y计算出显示的区域---
reg [9:0] vga_x,vga_y;
always@(posedge clk)
begin
vga_x=x-H_SYNC-H_BACK;
vga_y=y-V_SYNC-V_BACK;
end
//---------------进行同步时消隐------------------
assign vga_blank=vga_x<H_LENGTH && vga_y<V_WIDTH;
//----------通过vga_x,vga_y显示一个太极----------
//圆心坐标
parameter ox1=10'd320,oy1=10'd190;
parameter ox=10'd320,oy=10'd240;
parameter ox2=10'd320,oy2=10'd290;
//圆上的点距离圆心的距离
integer rx1,ry1;
integer rx,ry;
integer rx2,ry2;
always@(posedge clk)
begin
rx1=vga_x-ox1;
ry1=vga_y-oy1;
rx=vga_x-ox;
ry=vga_y-oy;
rx2=vga_x-ox2;
ry2=vga_y-oy2;
end
//先画小圆
4000
后画大圆
always @(posedge clk or negedge rst_n)
if (!rst_n) hei;
else if(rx1*rx1+ry1*ry1<=100) bai;
else if(rx2*rx2+ry2*ry2<=100) hei;
else if(rx1*rx1+ry1*ry1<=2500) hei;
else if(rx2*rx2+ry2*ry2<=2500) bai;
else if(rx*rx+ry*ry<=10000)
begin
if(vga_x<320) bai;
else hei;
end
else if(vga_x<320) hei;
else bai;
//----------------设置颜色------------------------
task hei;
begin
vga_r=10'b0;
vga_g=10'b0;
vga_b=10'b0;
end
endtask
task bai;
begin
vga_r=10'b1111111111;
vga_g=10'b1111111111;
vga_b=10'b1111111111;
end
endtask
//----------------------结束-----------------------
endmodule

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: