算了,那么多人问我VGA,我还是满世界免费发放吧,那么懒
2011-02-24 13:00
260 查看
时序: http://tinyvga.com/vga-timing
Verilog设计:vga_desin->vga_display->vga_driver层层递归
(1)顶层不说了 ,你懂的
(2)vga_diaplay: 读取行列值,给颜色就可以,发挥你的想象力
//LCD VGA接口都一样
module vga_display
(
input clk,
input rst_n,
input [8:0] x_pos,
input [8:0] y_pos,
output [15:0] lcd_data
);
//定义颜色变量RGB--5|6|5
parameter RED = 16'hF800; /*11111,000000,00000 F800 红*/
parameter GREEN = 16'h07E0; /*00000,111111,00000 07E0 绿*/
parameter BLUE = 16'h001F; /*00000,000000,11111 001F 蓝*/
parameter WHITE = 16'hFFFF; /*11111,111111,11111 FFFF 白*/
parameter BLACK = 16'h0000; /*00000,000000,00000 0000 黑*/
parameter YELLOW = 16'hFFE0; /*11111,111111,00000 FFE0 黄*/
parameter CYAN = 16'hF81F; /*11111,000000,11111 F81F 青*/
parameter ROYAL = 16'h07FF; /*00000,111111,11111 07FF 品*/
......
(3)vga_driver底层驱动代码,根据时序写,方便一直
/********************************************************************
* Module Name : vga_driver
* Author : Crazy Bingo
* Device : EP2C8Q208C8N
* Version : Quartus II 9.1
* Date : 2011/2/15
* Description : Dispaly programs for the vga
*********************************************************************/
/********************************************************************
* Revision Author : Crazy Bingo
* Date : 2010-10-9 9:12
* Description : VS不能用门控时钟,只能用使能时钟,否则影响整体性能,造成数据缺失
用最高时钟控制整个系统,始终满天飞会使得系统性能下降,甚至出错
*********************************************************************/
module vga_driver
(
input clk_vga, // VGA像素时钟
input rst_n, // 异步复位信号
input [15:0] vga_data,
output [15:0] vga_rgb, // 接收要显示的色彩
output reg vga_hs, // VGA管脚 行同步
output reg vga_vs, // VGA管脚 场同步
output [10:0] x_pos, // 像素横坐标位置
output [9:0] y_pos // 像素纵坐标位置
);
/* | 显示 |前沿|同步|后沿| 显示 |前沿|同步|后沿|
* |____| | |____| |
* ______________ ______________ ______________ ______________
* | 显示 | 不显示 | 显示 | 不显示 |
* _____________________________ ______________ ______________
* | 显示一行帧长 | 显示一行帧长 |
*/
//定义VGA_1024_768_65M_60HZ显示协议标准
parameter H_DISP = 11'd1024; // 显示时序
parameter H_FRONT = 11'd24; // 显示前沿
parameter H_SYNC = 11'd136; // 同步脉冲
parameter H_BACK = 11'd160; // 显示后沿
parameter H_TOTAL = 11'd1344; // 时序帧长
parameter V_DISP = 10'd768; // 显示时序
parameter V_FRONT = 10'd3; // 显示前沿
parameter V_SYNC = 10'd6; // 同步脉冲
parameter V_BACK = 10'd29; // 显示后沿
parameter V_TOTAL = 10'd806; // 时序帧长
//------------------------------------------
// 行同步信号发生器
reg [10:0] hcnt;
always @ (posedge clk_vga or negedge rst_n)
begin
if (!rst_n)
hcnt <= 0;
else
begin
if (hcnt < H_TOTAL-1)
hcnt <= hcnt+1'b1;
else
hcnt <= 0;
end
end
always@(posedge clk_vga or negedge rst_n)
begin
if(!rst_n)
vga_hs <= 1;
else
begin
if( (hcnt >= H_DISP+H_FRONT-1) && (hcnt < H_DISP+H_FRONT+H_SYNC-1) )//Delay for one clk
vga_hs <= 0;
else
vga_hs <= 1;
end
end
//------------------------------------------
// 场同步信号发生器
reg [9:0] vcnt;
always @ (posedge clk_vga or negedge rst_n)
begin
if (!rst_n)
vcnt <= 0;
else
begin
if(hcnt == H_DISP-1)
begin
if (vcnt < V_TOTAL-1)
vcnt <= vcnt+1'b1;
else
vcnt <= 0;
end
end
end
always @ (posedge clk_vga or negedge rst_n)
begin
if(!rst_n)
vga_vs <= 1;
else
begin
if( (vcnt >= V_DISP+V_FRONT-1) && (vcnt < V_DISP+V_FRONT+V_SYNC-1) )//Delay for one clk
vga_vs <= 0;
else
vga_vs <= 1;
end
end
//------------------------------------------
/*定义H_DISP*V_DISP行列坐标*/
assign x_pos = (hcnt < H_DISP) ? hcnt[9:0] : 10'd0;
assign y_pos = (vcnt < V_DISP) ? vcnt[9:0] : 10'd0;
assign vga_rgb = ((hcnt < H_DISP) && (vcnt < V_DISP)) ? vga_data : 16'd0;
endmodule
过些天有时间写成IP再说
Verilog设计:vga_desin->vga_display->vga_driver层层递归
(1)顶层不说了 ,你懂的
(2)vga_diaplay: 读取行列值,给颜色就可以,发挥你的想象力
//LCD VGA接口都一样
module vga_display
(
input clk,
input rst_n,
input [8:0] x_pos,
input [8:0] y_pos,
output [15:0] lcd_data
);
//定义颜色变量RGB--5|6|5
parameter RED = 16'hF800; /*11111,000000,00000 F800 红*/
parameter GREEN = 16'h07E0; /*00000,111111,00000 07E0 绿*/
parameter BLUE = 16'h001F; /*00000,000000,11111 001F 蓝*/
parameter WHITE = 16'hFFFF; /*11111,111111,11111 FFFF 白*/
parameter BLACK = 16'h0000; /*00000,000000,00000 0000 黑*/
parameter YELLOW = 16'hFFE0; /*11111,111111,00000 FFE0 黄*/
parameter CYAN = 16'hF81F; /*11111,000000,11111 F81F 青*/
parameter ROYAL = 16'h07FF; /*00000,111111,11111 07FF 品*/
......
(3)vga_driver底层驱动代码,根据时序写,方便一直
/********************************************************************
* Module Name : vga_driver
* Author : Crazy Bingo
* Device : EP2C8Q208C8N
* Version : Quartus II 9.1
* Date : 2011/2/15
* Description : Dispaly programs for the vga
*********************************************************************/
/********************************************************************
* Revision Author : Crazy Bingo
* Date : 2010-10-9 9:12
* Description : VS不能用门控时钟,只能用使能时钟,否则影响整体性能,造成数据缺失
用最高时钟控制整个系统,始终满天飞会使得系统性能下降,甚至出错
*********************************************************************/
module vga_driver
(
input clk_vga, // VGA像素时钟
input rst_n, // 异步复位信号
input [15:0] vga_data,
output [15:0] vga_rgb, // 接收要显示的色彩
output reg vga_hs, // VGA管脚 行同步
output reg vga_vs, // VGA管脚 场同步
output [10:0] x_pos, // 像素横坐标位置
output [9:0] y_pos // 像素纵坐标位置
);
/* | 显示 |前沿|同步|后沿| 显示 |前沿|同步|后沿|
* |____| | |____| |
* ______________ ______________ ______________ ______________
* | 显示 | 不显示 | 显示 | 不显示 |
* _____________________________ ______________ ______________
* | 显示一行帧长 | 显示一行帧长 |
*/
//定义VGA_1024_768_65M_60HZ显示协议标准
parameter H_DISP = 11'd1024; // 显示时序
parameter H_FRONT = 11'd24; // 显示前沿
parameter H_SYNC = 11'd136; // 同步脉冲
parameter H_BACK = 11'd160; // 显示后沿
parameter H_TOTAL = 11'd1344; // 时序帧长
parameter V_DISP = 10'd768; // 显示时序
parameter V_FRONT = 10'd3; // 显示前沿
parameter V_SYNC = 10'd6; // 同步脉冲
parameter V_BACK = 10'd29; // 显示后沿
parameter V_TOTAL = 10'd806; // 时序帧长
//------------------------------------------
// 行同步信号发生器
reg [10:0] hcnt;
always @ (posedge clk_vga or negedge rst_n)
begin
if (!rst_n)
hcnt <= 0;
else
begin
if (hcnt < H_TOTAL-1)
hcnt <= hcnt+1'b1;
else
hcnt <= 0;
end
end
always@(posedge clk_vga or negedge rst_n)
begin
if(!rst_n)
vga_hs <= 1;
else
begin
if( (hcnt >= H_DISP+H_FRONT-1) && (hcnt < H_DISP+H_FRONT+H_SYNC-1) )//Delay for one clk
vga_hs <= 0;
else
vga_hs <= 1;
end
end
//------------------------------------------
// 场同步信号发生器
reg [9:0] vcnt;
always @ (posedge clk_vga or negedge rst_n)
begin
if (!rst_n)
vcnt <= 0;
else
begin
if(hcnt == H_DISP-1)
begin
if (vcnt < V_TOTAL-1)
vcnt <= vcnt+1'b1;
else
vcnt <= 0;
end
end
end
always @ (posedge clk_vga or negedge rst_n)
begin
if(!rst_n)
vga_vs <= 1;
else
begin
if( (vcnt >= V_DISP+V_FRONT-1) && (vcnt < V_DISP+V_FRONT+V_SYNC-1) )//Delay for one clk
vga_vs <= 0;
else
vga_vs <= 1;
end
end
//------------------------------------------
/*定义H_DISP*V_DISP行列坐标*/
assign x_pos = (hcnt < H_DISP) ? hcnt[9:0] : 10'd0;
assign y_pos = (vcnt < V_DISP) ? vcnt[9:0] : 10'd0;
assign vga_rgb = ((hcnt < H_DISP) && (vcnt < V_DISP)) ? vga_data : 16'd0;
endmodule
过些天有时间写成IP再说
相关文章推荐
- 20160704世界那么大还是遇见你
- James Whittaker解释为啥经过那么多人测试,MS的软件还是那么烂
- 为什么你读了那么多书,却还是那么穷?
- 十二款世界顶级杀毒软件下载,有序列号全可免费升级
- 十二款世界顶级杀毒软件下载,有序列号全可免费升级
- 漏洞还是黑洞,如何免费汇款
- 世界最佳免费软件VIII
- Stallman和他的免费软件世界
- 什么有那么多人选择Python,真的有那么好吗?
- 嵌入式平台选型资料U盘 免费发放
- 简单点儿、简单点儿、再简单点儿,其实世界可以不是我们想象的那么复杂
- 分析了443个免费代理 其中只有21%没有黑幕 那么剩下的79%呢
- 物联网应用 -- 北京市旅游局的30万电子门票免费发放活动
- 我们在建立Win32工程的时候,要选择是Win32控制台应用程序还是Win32项目,那么两者到底有什么区别呢?
- 人要向前看 世界还是美好的
- 写了两年的程序,却发现自己还是那么的杯具
- 世界那么大,老板带我去看看——2016武夷山卓易联盟峰会
- 为何你上了那么多软装培训班还是做不了整体软装设计?
- 收费还是免费?应用收费模式分析
- try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后?