FPGA 之 VGA的IP核编写
做一个简单的VGA 640*480 超了一天半, 整整七天才搞定,不过也很开心了! 加油努力.....
主要分成三个文件:
VGA.v 主文件, 同时调用FIFO
vga_timing.v VGA时序控制文件
vga_sdram.v 读取SDRAM内存文件
1. VGA.v
module VGA(
input wire clk,
input wire reset,
// 控制寄存器读写
input wire slave_chipselect,
input wire[1:0] slave_address, //
input wire slave_write, //写请求
input wire[31:0] slave_writedata, //写数据
input wire slave_read, //读请求
output wire[31:0] slave_readdata, //读数据
input wire[3:0] slave_byteenable, //数据有效标志
// 读写SDRAM数据
output wire[31:0] master_address, //数据地址
output wire master_read, //主端口读请求
output wire master_byteenable,
input wire master_waitrequest, //迫使主端口等待
input wire master_readdatavalid, //指示已经提供有效数据
input wire[7:0] master_readdata, //读入数据值
// VGA 时序
input wire vga_clk,
output wire vga_line_sync,
output wire vga_field_sync,
output wire [2:0] vga_r,
output wire [2:0] vga_g,
output wire [1:0] vga_b
);
wire vga_pixel_flag;
wire [7:0] fifo_data;
wire [7:0] tmp_data0;
reg [7:0] tmp_data1;
wire vga_frame_o;
/
// VGA输出 /
/
assign vga_b = vga_pixel_flag ? fifo_data[1:0]:8'b00000000;
assign vga_g = vga_pixel_flag ? fifo_data[4:2]:8'b00000000;
assign vga_r = vga_pixel_flag ? fifo_data[7:5]:8'b00000000;
/
// VGA 时序 /
/
vga_timing vga_l1(
.clk(vga_clk),
.reset_i(reset),
.pixel_flag(vga_pixel_flag),
.hsync(vga_line_sync),
.vsync(vga_field_sync),
.frame_o(vga_frame_o),
.vga_rgb(tmp_data0)
);
/
// VGA 寄存器操作 /
/
//register 操作寄存器
wire vga_go; //VGA 启动标志
wire [31:0] vga_base_address; //vga 数据基地址
vga_register vga_slave(
.clk(clk),
.reset_n(reset),
// 控制寄存器读写
.slave_chipselect(slave_chipselect),
.slave_address(slave_address), //
.slave_write(slave_write), //写请求
.slave_writedata(slave_writedata), //写数据
.slave_read(slave_read), //读请求
.slave_readdata(slave_readdata), //读数据
.slave_byteenable(slave_byteenable), //数据有效标志
.vga_base_address(vga_base_address),
.vga_go(vga_go)
);
/
// VGA SDRAM 读取像素 /
/
wire [11:0] fifo_count;
vga_sdram vga_sdram_11(
.clk(clk),
.reset_n(reset),
.master_address(master_address), //数据地址
.master_read(master_read), //主端口读请求
.master_byteenable(master_byteenable),
.master_waitrequest(master_waitrequest), //迫使主端口等待
.master_readdatavalid(master_readdatavalid),//指示已经提供有效数据
.master_readdata(master_readdata), //读入数据值
.vga_base_addr(vga_base_address), //VGA基地址
.vga_go(vga_go), //VGA 启动标记
.frame_start_flag(vga_frame_o), //帧开始标记
.fifo_count(fifo_count)
);
/
// VGA FIFO 做数据缓冲 以匹配不同速度的外设//
/
vga_fifo fifo_l2(
.aclr(vga_frame_o),
.data(master_readdata),
// .data(8'b00001000),
.rdclk(~vga_clk),
.rdreq(vga_pixel_flag),
.wrclk(clk),
.wrreq(master_readdatavalid),
.q(fifo_data),
.wrusedw(fifo_count)
);
endmodule
2. vga_timing.v
//640*480
module vga_timing( clk,reset_i,pixel_flag,
hsync,
vsync,
frame_o,
vga_rgb);
// VGA
input clk;
input reset_i;
output hsync; //VGA行同步信号
output vsync; //VGA场同步信号
output pixel_flag;
output frame_o;
output[7:0] vga_rgb;
reg [10:0] hcount; //VGA行扫描计数器
reg [9:0] vcount; //VGA场扫描计数器
reg [8:0] data; //VGA数据
reg vga_clk;
wire h_end;
wire v_end;
wire dat_act;
// VGA
always @(posedge clk)
begin
vga_clk = ~vga_clk;
end
// 竖向....
always @(posedge clk)
begin
if(h_end)
hcount <= 10'd0;
else
hcount <= hcount + 10'd1;
end
assign h_end = (hcount == 799);
// 横向....
always @(posedge clk)
begin
if(h_end)
begin
if(v_end)
vcount <= 10'd0;
else
vcount <= vcount + 10'd1;
end
end
assign v_end = (vcount == 524);
//使能信号
assign pixel_flag = ((hcount >= 144) && (hcount < 784))&& ((vcount >= 34) && (vcount < 514));
assign hsync = (hcount > 95);//水平同步
assign vsync = (vcount > 2);//垂直同步
reg frame_o_t;
always @(posedge clk)
begin
if( vcount < 3)
frame_o_t <= 1;
else
frame_o_t <= 0;
end
assign frame_o = frame_o_t;//垂直同步
wire[10:0] x_pos;
wire[10:0] y_pos;
assign x_pos = hcount - 144;//垂直同步
assign y_pos = vcount - 34;//垂直同步
reg[7:0] vga_rgb_t;
always @(posedge clk)
begin
if( x_pos<500 && y_pos > 80)
vga_rgb_t <= 8'b01101111;
else
vga_rgb_t <= 8'b00000000;
end
assign vga_rgb = vga_rgb_t;
endmodule
3. vga_sdram.v
module vga_sdram(input wire clk,
input wire reset_n,
output wire[31:0] master_address, //数据地址
output wire master_read, //主端口读请求
output wire master_byteenable,
input wire master_waitrequest, //迫使主端口等待
input wire master_readdatavalid, //指示已经提供有效数据
input wire[7:0] master_readdata, //读入数据值
input wire[31:0] vga_base_addr, //VGA基地址
input wire vga_go, //VGA 启动标记
input wire frame_start_flag, //帧开始标记
input wire[11:0] fifo_count
);
reg [19:0] input_data_count;
reg vga_read;
assign master_read = vga_read;
assign master_byteenable = 1'd1; //位使能
assign master_address = vga_base_addr + input_data_count;
//统计FIFO已经读了多少数据
always @ (posedge clk or negedge reset_n)
begin
if (!reset_n)
begin
//vga_read <= 1'b0; //SDRAM 停止读
end
// 一帧数据开始时,清除FIFO
else if (!master_waitrequest ) //地址计数 : // 1. 数据有效
begin
if (frame_start_flag)
begin
vga_read <= 1'b0;
end
else if( (fifo_count < 500) && (input_data_count < 307200) )
begin
vga_read <= 1'b1; // 向FIFO读数据
end
else if(fifo_count > 2000)
begin
vga_read <= 1'b0; // 向FIFO读数据
end
end
end
always @ (posedge clk or negedge reset_n)
begin
if (!reset_n)
begin
//input_data_count <= 0;
end
// 一帧数据开始时,清除FIFO
else if (!master_waitrequest ) //地址计数 : // 1. 数据有效
begin
if (frame_start_flag)
begin
input_data_count <= 0;
end
else if( input_data_count < 307200)
begin
if(vga_read == 1'b1)
input_data_count <= input_data_count + 1;
end
end
end
endmodule
转载于:https://www.cnblogs.com/signal/archive/2012/07/31/2616745.html
FPGA 之 VGA的IP核编写相关推荐
- LabVIEW FPGA PCIe开发讲解-7.2节:目前主流的4大Xilinx FPGA PCIe DMA通信IP核讲解
1.要开发一个带PCIe或者PXIe接口的FPGA板卡出来,除了硬件本身外,最重要的就是FPGA芯片里面的PCIe通信代码编写,俗称下位机FPGA编程:还有中间层的驱动文件编写以及上位机PC端的应用程 ...
- 【FPGA】 Vivado FIFO IP核使用教程
目录 一.FIFO简介 二.FIFO的应用 三.Vivado FIFO创建 四.FIFO IP核实例化 五.对实例化顶层文件仿真 一.FIFO简介 FIFO 的英文全称是 First I ...
- FPGA学习杂记4——IP核简介、调用、复制和PLL IP核介绍
大部分内容来自野火的FPGA教学视频,笔者仅作整理,方便回顾. 视频地址:[野火]FPGA系列教学视频,真正的手把手教学,"波形图"教学法,现场画波形图写代码,硬件基于野火FPGA ...
- FPGA——调用DDR的IP核(MIG核)
关于DDR的基础知识可以看这篇文章: FPGA --DDR基础概念详解_居安士的博客-CSDN博客 总的来说,DDR是一个结构非常复杂的动态存储器,时序自己去写是非常困难的,但是Xilinx给我们有现 ...
- FPGA 单端口RAM IP核使用 vivado仿真
一.各类存储器简介 ROM:只读,只有读接口(读地址.读数据) RAM:可读可写,有读接口(读地址.读数据)和写接口(写使能.写数据.写地址),默认任何时刻都能读,没有读使能,大小和位宽查手册,需要持 ...
- FPGA中DDR3 MIG ip核使用说明
此篇是我在学习中做的归纳与总结,其中如果存在版权或知识错误请直接联系我,欢迎留言. PS:本着知识共享的原则,此篇博客可以随意转载,但请标明出处! 目录 1.DDR3工作原理 简介: DDR基础操作步 ...
- FPGA再入门——SPI IP核调用
型号:XC7K325TFFG900+AD9235-1 软件:Vivado 2019.2及其对应的Vitis 按照上篇博客中提到的block design的方法,新增SPI IP核,需要注意的是不能使能 ...
- FPGA数字信号处理(十八)Quartus CIC IP核实现
该篇是FPGA数字信号处理的第18篇,题接上篇,本文详细介绍使用Quartus自带的CIC IP核进行设计的方法.下一篇会介绍使用Vivado的IP核设计CIC的方法. IP核概述 由于版本的关系,Q ...
- 【FPGA】SRIO IP核的三层协议的作用?
SRIO这种高速串口复杂就复杂在它的协议上,三层协议:逻辑层,传输层以及物理层. 数据手册会说这三层协议是干什么的呢?也就是分工([FPGA]SRIO IP核系统总览以及端口介绍(一)(User In ...
最新文章
- python qt designer 重定向_Python+PyQt5+QtDesigner+PyUic+PyRcc环境安装与配置
- 【thymeleaf】Access to request parameters is forbidden in this context
- Maven plugin - maven-dependency-plugin
- 网站界面设计没有灵感,不妨去探索广袤的大自然!
- Dubbo自定义日志拦截器 1
- django-xadmin隐藏菜单不显示
- 3月12日 对极几何,本征矩阵,基础矩阵,F/E矩阵计算,恢复旋转与平移,三角化视图重建
- CentOS6.2(64bit)下mysql5.6.16主从同步配置
- 树莓派安装qq linux,在(Raspberry Pi)树莓派上安装NodeJS
- numpy_linspace函数
- IE的Internet选项“自定义级别”置灰,不能修改的问题解决
- Flexbox 完整指南
- 用计算机弹霜雪千年,霜雪千年(完整版)-双笙-和弦谱-《弹吧》官网tan8.com-和弦谱大全,学吉他,秀吉他...
- 075-数组越界异常-ArrayIndexOutOfBoundsException-【视频讲解】
- 如何实现搜索附近的店铺
- 你为什么必须(从现在开始就)掌握linux
- 阿里移动安全陈树华:安全的最高境界是无感知
- NPL系列之分词和分词框架(二)
- 小熊派移植 TencentOS-tiny+EC20+SAL框架对接 TCP/UDP 服务器
- 服务器文件路径的例子,完整SQL Server实例迁移案例
热门文章
- 呼市职称计算机考试时间,2016下半年内蒙古呼和浩特会计从业考试报名时间
- nohup 输出日志到文件_超详细的EFK安装部署教程--filebeat日志数据采集
- hdu2158 最短区间版大家来找碴
- C语言经典例82-八进制转换为十进制
- 【商务智能】数据预处理
- 【词汇】ab-前缀、al-后缀、norm-词根
- 【Android NDK 开发】Android Studio 使用 CMake 导入动态库 ( 构建脚本路径配置 | 指定动态库查找路径 | 链接动态库 )
- [Spring cloud 一步步实现广告系统] 20. 系统运行测试
- 关于读构建之法后的疑惑
- MySQL数据库 高级查询(一)