1)实验平台:正点原子开拓者FPGA 开发板
2)摘自《开拓者FPGA开发指南》关注官方微信号公众号,获取更多资料:正点原子
3)全套实验源码+手册+视频下载地址:http://www.openedv.com/thread-13912-1-1.html
![82e063a7a37df1e9e4e7a976cf7b474b.png](https://i-blog.csdnimg.cn/blog_migrate/a5cf72cab28f6a9d7ec500899c0a61ca.jpeg)
第四十四章 以太网传输图片(VGA显示)
我们在“基于ROM的VGA图片显示实验”中利用FPGA片上存储资源存储图片,并通过VGA将
图片显示到显示器屏幕上。但是由于FPGA片上存储资源有限,只能存储分辨率较小的图片。在
本章,我们将学习如何利用SDRAM来存储图片,并通过VGA接口显示。
本章包括以下几个部分:
44.1 SDRAM-VGA图片显示简介
44.2 实验任务
44.3 硬件设计
44.4 程序设计
44.5 下载验证
SDRAM-VGA图片显示简介
利用VGA接口显示图片时,需要一个存储器用于存储图片数据。这个存储器可以采用FPGA
片上存储资源,也可以使用片外存储设备,如SDRAM、SD卡、FLASH等。
由于FPGA的片上存储资源有限,所以能够存储的图片大小也受到限制。开拓者开发板上的
FPGA芯片型号为EP4CE10F17C8,它的片上存储资源为414Kbit,也就是说存储的图片大小不能
超过414Kbit。对于分辨率为640*480的图片,当采用RGB565数据格式时,所需要的存储空间为
640*480*16bit=4915200bit=4800Kbit(1Kbit=1024bit)。也就是说,即使是采用VGA最小的
显示分辨率——640*480,FPGA的片上存储资源也远远不能够满足图片存储的需求。
开拓者开发板上的SDRAM存储容量为256Mbit(1Mbit=1024Kbit),可以存储54张上述格式
的图片。另外,相比于开发板上的SD卡、FLASH等片外存储设备,SDRAM还具有读写速度快的优
点。因此,在利用VGA显示图片时,SDRAM是一种非常理想的存储设备。
然而,SDRAM不像SD卡一样可以事先将图片导入。作为易失性存储器,SDRAM中的数据在掉
电后会丢失,因此用于VGA图片显示时需要向SDRAM中写入图片数据。这里我们采用开发板上的
网口接收上位机发送的图片数据,然后将其写入SDRAM,最终通过VGA接口显示。
我们在“SDRAM读写测试实验”中对SDRAM作了详细的介绍,包括SDRAM存储结构、寻址方
法、操作时序等。如果大家对这部分内容不是很熟悉的话,请参考“SDRAM读写测试实验”中
的SDRAM简介部分。
实验任务
本章的实验任务是使用开拓者开发板上的网口接收上位机传输的图片(分辨率为640*480),
然后将图片存储在SDRAM中并通过VGA接口在显示器屏幕上显示。
硬件设计
SDRAM部分的硬件设计原理与“SDRAM读写测试实验”完全相同,请参考“SDRAM读写测试
实验”中的硬件设计部分。以太网接口部分的硬件设计请参考“以太网通信实验”中的硬件设
计部分。VGA接口部分的硬件设计请参考“VGA彩条显示实验”中的硬件设计部分。
由于SDRAM、以太网接口和VGA接口的引脚数目较多且在前面相应的章节中已经给出它们的
管脚列表,这里不再列出管脚分配。
程序设计
图 44.4.1是根据本章实验任务画出的系统框图。上位机通过网线将图片以bin文件格式
传输到开发板上,UDP模块负责接收图片数据;然后将UDP模块输出的位宽为32bit的数据转成
16bit,并通过SDRAM控制器存入SDRAM;最后VGA驱动模块通过SDRAM控制器读取SDRAM中存储的
图片数据并通过VGA接口显示在显示器上。
![ff673a0d6c8bacc52c50c6f46f400e64.png](https://i-blog.csdnimg.cn/blog_migrate/9514933600f0427c96091fccb8f62647.jpeg)
图 44.4.1 以太网传输图片(VGA显示)实验系统框图
程序中各模块端口及信号连接如图 44.4.2所示:
![e26552a0bfd3c1ac6b14827c672f4078.png](https://i-blog.csdnimg.cn/blog_migrate/fd15ca3029ac5d2e93a26a012e512852.jpeg)
图 44.4.2 顶层模块原理图
FPGA顶层(eth_sdram_vga)例化了以下五个模块:PLL时钟模块(pll_clk)、UDP模块(udp)、
32bit转16bit模块(udp_32_to_16bit)、SDRAM控制器模块(sdram_top)以及VGA驱动模块
(vga_driver)。
PLL时钟模块(pll_clk):本实验中VGA驱动模块所需要的像素时钟为25MHz,SDRAM控制
器工作在100MHz时钟频率下,另外还需要一个输出给SDRAM芯片的100MHz相位偏移时钟。因此
需要一个PLL模块用于产生系统各个模块所需的时钟频率。
UDP模块(udp):UDP模块实现以太网通信的收发功能,该模块内部例化了以太网接收模
块(ip_receive)、以太网发送模块(ip_send)和CRC32校验模块(crc32_d4)。由于本章实
验中网口只负责接收数据,所以其中以太网的发送功能并没有用到。有关该模块的详细介绍请
大家参考“以太网通信实验”章节。
32bit转16bit模块(udp_32_to_16bit):该模块将UDP模块输出的位宽为32bit的数据转
换成16bit,这是因为数据需要写入SDRAM,而SDRAM控制器的数据接口位宽为16bit。
SDRAM控制器模块(sdram_top):SDRAM控制器模块负责驱动SDRAM片外存储器。该模块将
SDRAM复杂的读写操作封装成类似FIFO的用户接口,非常方便用户的使用。有关该模块的详细
介绍请大家参考“SDRAM读写测试实验”章节。
VGA驱动模块(vga_driver):VGA驱动模块根据VGA时序参数输出行、场同步信号;同时
它还要输出数据请求信号用于读取SDRAM中的图片数据,并将图片通过VGA接口显示。
顶层模块的代码如下:
1 module eth_sdram_vga(
2 input clk, //FPGA外部时钟,50MHz
3 input rst_n, //按键复位,低电平有效
4 //以太网接口
5 input eth_rx_clk, //MII接收数据时钟
6 input eth_rxdv, //MII输入数据有效信号
7 input [ 3:0] eth_rx_data, //MII输入数据
8 output eth_tx_en, //MII输出数据有效信号
9 output eth_rst_n, //以太网芯片复位信号,低电平有效
10 //SDRAM接口
11 output sdram_clk, //SDRAM 芯片时钟
12 output sdram_cke, //SDRAM 时钟有效
1