在走近FPGA预告篇中,我们已经提到了系列文章使用的开发平台,硬木课堂Xilinx Artix 7 FPGA板,如下图所示。它使用的FPGA芯片型号为Xilinx Artix-7 XC7A75T,具有电平开关、LED、矩阵键盘、数码管等基本外设,同时还有高速ADC/DAC,音频Codec,SD卡,32位DDR3L(共1GB)外设用于SoC设计的进阶实验,另外,上方的I/O插槽可以直接插入特定型号的LCD屏幕与摄像头,极大地方便了图像处理相关应用的实现。
硬木课堂出品的Xilinx Artix-7板卡,XC7A75T起步,向上最高兼容到XC7A200T
该FPGA板采用的芯片型号为XC7A75T,从Xilinx官网的数据手册中可以找到7系列FPGA芯片的资源对比,可以看出75T在所有Artix-7系列的FPGA中资源量属于中上,虽然相比于100T和200T而言资源量还是少了许多,但是完成基础的FPGA实验和进阶的SoC设计实验(包括图像处理相关)是足够的。75T和100T, 200T的FPGA芯片是兼容的,硬木课堂同时还提供有200T的FPGA板,以应对更复杂的应用场景需求。
Xilinx Artix-7系列FPGA资源表
Artix-7系列FPGA芯片采用下图所示的基本可配置逻辑块(CLB),其中包括6输入查找表、可选的双向5输入查找表、分布式存储、移位寄存器、高速进位算术逻辑功能以及大量多路复用器。基本可配置逻辑块(CLB)是用于实现时序电路和组合电路的主要逻辑资源。每个CLB都连接到一个交换矩阵(Switch Matrix),以访问通用路由矩阵。每个CLB内部包含两个slice。7系列FPGA中的LUT可以配置为具有一个输出的6输入LUT,也可以配置为具有独立输出但共享地址或逻辑输入的两个5输入LUT。 每个5输入LUT输出都可以选择在触发器中寄存。每个slice由4个这样的6输入LUT、8个触发器、多路复用器和算术运算单元构成。每片四个触发器可以选择配置为锁存器。但在这种情况下,该片中其余的四个触发器必须保持未使用状态。
Artix-7系列FPGA的CLB
更多关于FPGA内部原理结构的介绍,可以阅读《FPGA原理与结构》[日]天野英晴主编,赵谦译 这本书,这本书对FPGA的内部原理阐释得比较清楚,对于初学者也比较友好。另外,如果能够找到《FPGA设计指南-器件、工具和流程》 [美] Clive “Max” Maxfield 著, 杜生海 邢闻 译 这本书也不错,感觉作者的语气比较幽默,但是似乎已经买不到新书了(略有遗憾)。在《FPGA原理与结构》中文版出版之前我就是看的《FPGA设计指南》一书,都很好地帮助理解FPGA的原理结构,从而更好地利用FPGA学习电路设计。
FPGA调试器和UART
在本系列文章使用的FPGA板上的右下方有两个接口,如下图。其中上方的接口(FPGA-Jtag)为FPGA下载接口,通过该接口下载比特流到FPGA中进行配置,功耗较小时,供电也是PC机通过该接口给板卡供电。如果功耗较大,则需要使用FPGA板右上角的辅助供电接口(POWER),可以使用手机5V充电器给板卡供电。
FPGA调试器接口和Arm调试器接口
DAP-JTAG是在板卡用在SoC设计时,调试FPGA内部的Arm内核用的,在未来的走近SoC系列中会应用到。
FPGA-JTAG和DAP-JTAG各自带了一个UART转USB接口。在UART实验中会用到此功能。
FPGA-JTAG除了提供FPGA的调试外,还提供了UART转USB功能
set_property PACKAGE_PIN Y21 [get_ports FTDI_RX]
set_property PACKAGE_PIN Y22 [get_ports FTDI_TX]
电平开关和LED
本系列所使用的FPGA板提供了12个直接由FPGA控制的LED灯LED11-LED0,每一个LED灯都由FPGA芯片的一个引脚直接驱动,如图所示。当FPGA的引脚输出高电平时LED灯点亮,反之则熄灭。在LED灯旁边也有12个电平开关,可以作为输入信号,当电平开关处在DOWN位置(靠近开发板边缘)时向FPGA相应引脚输入低电平,当电平开关在UP位置时向FPGA相应引脚输入高电平,如图。
开发板上实体LED和拨动开关
拨动开关的对应FPGA引脚在XDC文件中描述如下,开关拨向上方输出高电平,拨向下方输出低电平:
set_property PACKAGE_PIN E16 [get_ports {SW_In[11]}]
set_property PACKAGE_PIN A15 [get_ports {SW_In[10]}]
set_property PACKAGE_PIN B15 [get_ports {SW_In[9]}]
set_property PACKAGE_PIN D15 [get_ports {SW_In[8]}]
set_property PACKAGE_PIN A14 [get_ports {SW_In[7]}]
set_property PACKAGE_PIN D14 [get_ports {SW_In[6]}]
set_property PACKAGE_PIN A13 [get_ports {SW_In[5]}]
set_property PACKAGE_PIN B13 [get_ports {SW_In[4]}]
set_property PACKAGE_PIN C13 [get_ports {SW_In[3]}]
set_property PACKAGE_PIN E13 [get_ports {SW_In[2]}]
set_property PACKAGE_PIN E14 [get_ports {SW_In[1]}]
set_property PACKAGE_PIN B16 [get_ports {SW_In[0]}]
LED的对应FPGA引脚在XDC文件中描述如下,FPGA引脚输出高电平,LED被点亮,FPGA引脚输出低,LED熄灭:
set_property PACKAGE_PIN AA20 [get_ports {led[11]}]
set_property PACKAGE_PIN V22 [get_ports {led[10]}]
set_property PACKAGE_PIN W21 [get_ports {led[9]}]
set_property PACKAGE_PIN W22 [get_ports {led[8]}]
set_property PACKAGE_PIN U22 [get_ports {led[7]}]
set_property PACKAGE_PIN U21 [get_ports {led[6]}]
set_property PACKAGE_PIN T21 [get_ports {led[5]}]
set_property PACKAGE_PIN T20 [get_ports {led[4]}]
set_property PACKAGE_PIN R19 [get_ports {led[3]}]
set_property PACKAGE_PIN P20 [get_ports {led[2]}]
set_property PACKAGE_PIN P19 [get_ports {led[1]}]
set_property PACKAGE_PIN AA21 [get_ports {led[0]}]
矩阵键盘
FPGA板带有一个4x4的矩阵键盘,可以用于一些外界的控制交互,如图所示。
实体矩阵键盘
矩阵键盘原理图
键盘一般设为输入(默认下拉),列键盘设为输出。需要注意的是,按下按键时信号存在抖动,所以需要设计按键消抖模块以免按键抖动带来未预期的系统错误。
set_property PACKAGE_PIN AA10 [get_ports {row[0]}]
set_property PACKAGE_PIN V10 [get_ports {row[1]}]
set_property PACKAGE_PIN W10 [get_ports {row[2]}]
set_property PACKAGE_PIN AA9 [get_ports {row[3]}]
set_property PACKAGE_PIN AB10 [get_ports {col[0]}]
set_property PACKAGE_PIN W11 [get_ports {col[1]}]
set_property PACKAGE_PIN AA11 [get_ports {col[2]}]
set_property PACKAGE_PIN T14 [get_ports {col[3]}]
set_property PULLDOWN true [get_ports {row[3]}]
set_property PULLDOWN true [get_ports {row[2]}]
set_property PULLDOWN true [get_ports {row[1]}]
set_property PULLDOWN true [get_ports {row[0]}]
数码管
FPGA板上配有配有6个七段数码管DIG1-DIG6(当正放FPGA开发板时,从左至右为1-6),每个数码管都由一个专用片选信号(DIG1- DIG6)控制,如图所示。七段数码管的每个引脚均通过共阴模式连接到 FPGA芯片上,当FPGA输出高电压时,对应的字码段点亮,反之则熄灭。数码管的片选信号也直接与FPGA引脚相连,当FPGA输出低电压时,对应的数码管选中,反之则不选中。
6位数码管实物
数码管原理图
set_property PACKAGE_PIN Y16 [get_ports {Digitron_Out[7]}]
set_property PACKAGE_PIN W14 [get_ports {Digitron_Out[4]}]
set_property PACKAGE_PIN Y17 [get_ports {Digitron_Out[5]}]
set_property PACKAGE_PIN AA15 [get_ports {Digitron_Out[6]}]
set_property PACKAGE_PIN AB17 [get_ports {Digitron_Out[3]}]
set_property PACKAGE_PIN AB16 [get_ports {Digitron_Out[2]}]
set_property PACKAGE_PIN AB15 [get_ports {Digitron_Out[1]}]
set_property PACKAGE_PIN AA16 [get_ports {Digitron_Out[0]}]
set_property PACKAGE_PIN AA14 [get_ports {DigitronCS_Out[0]}]
set_property PACKAGE_PIN AB11 [get_ports {DigitronCS_Out[1]}]
set_property PACKAGE_PIN Y13 [get_ports {DigitronCS_Out[2]}]
set_property PACKAGE_PIN AA13 [get_ports {DigitronCS_Out[3]}]
set_property PACKAGE_PIN AB13 [get_ports {DigitronCS_Out[4]}]
set_property PACKAGE_PIN Y14 [get_ports {DigitronCS_Out[5]}]
3组IO的介绍
FPGA板上方有3组IO接口,可以用于LCD显示屏和摄像头的直插(对于示例中用到的摄像头和LCD显示屏,分别可以直接插到右边和左边的IO接口组,效果如图。在我之前写过的一篇文章中(https://zhuanlan.zhihu.com/p/98980911)对使用摄像头和LCD显示屏进行开发的过程有更多的描述,另外,在后续系列文章中也会对相关的实验进行详细的介绍
3组对外IO,可以直接插2.4寸并口屏,串口屏,摄像头等模块
在对外IO上插接LCD和摄像头(兼容多种分辨率,多种引脚分布)
高速ADC/DAC
FPGA开发板的左上方是高速ADC/DAC芯片,该芯片是来自 MAXIM公司(Now ADI)的超低功耗模拟前端,最高工作频率达到20MHz,芯片型号为Max5864。Max5864集成了双路的8位ADC以及双路的10位DAC,其数字输出电平为+1.8V至+3.3V(TTL/CMOS兼容),且该芯片的ADC和DAC既可以同时工作也可以独立工作。其关断与工作模式由三线的串行接口来控制。高速ADC/DAC芯片左侧的一组黄色贴片排母IO接口包含两组ADC输入接口,分别标识为ADC1和ADC2,还包含两组DAC输出接口,分别标识为DAC1和DAC2,可通过导线与示波器、信号源等仪器相连进行实验。
高速数据采集Codec,包括两路8位20MSPS ADC和两路10位20MSPS DAC
##ADC_data
set_property PACKAGE_PIN E18 [get_ports {ADC_data[0]}]
set_property PACKAGE_PIN F18 [get_ports {ADC_data[1]}]
set_property PACKAGE_PIN F19 [get_ports {ADC_data[2]}]
set_property PACKAGE_PIN F20 [get_ports {ADC_data[3]}]
set_property PACKAGE_PIN C20 [get_ports {ADC_data[4]}]
set_property PACKAGE_PIN D20 [get_ports {ADC_data[5]}]
set_property PACKAGE_PIN A19 [get_ports {ADC_data[6]}]
set_property PACKAGE_PIN A20 [get_ports {ADC_data[7]}]
##DAC_data
set_property PACKAGE_PIN A18 [get_ports {DAC_data[0]}]
set_property PACKAGE_PIN B20 [get_ports {DAC_data[1]}]
set_property PACKAGE_PIN G21 [get_ports {DAC_data[2]}]
set_property PACKAGE_PIN F21 [get_ports {DAC_data[3]}]
set_property PACKAGE_PIN E21 [get_ports {DAC_data[4]}]
set_property PACKAGE_PIN D21 [get_ports {DAC_data[5]}]
set_property PACKAGE_PIN A21 [get_ports {DAC_data[6]}]
set_property PACKAGE_PIN B21 [get_ports {DAC_data[7]}]
set_property PACKAGE_PIN C22 [get_ports {DAC_data[8]}]
set_property PACKAGE_PIN B22 [get_ports {DAC_data[9]}]
##AD_DA_clk 、SPI
set_property PACKAGE_PIN D19 [get_ports AD_DA_clk]
set_property PACKAGE_PIN E22 [get_ports AD_DA_SCLK]
set_property PACKAGE_PIN D22 [get_ports AD_DA_DIN]
set_property PACKAGE_PIN G22 [get_ports AD_DA_CSn]
音频和SD卡
FPGA开发板的左下侧载有立体声多媒体数字信号编译码器芯片WM8978。WM8978是Wolfson推出的一款全功能音频处理器,带有一个HI-FI级数字信号处理内核,支持增强3D硬件环绕音效,以及5频段的硬件均衡器,可以有效改善音质。在音频编译码芯片的左侧有两个音频接口,位于上侧的是音频输入接口,可通过音频连接线连接音频播放设备(如手机)来输入音频信号,位于下侧的是音频输出接口,可以连接耳机播放音乐。另外,在FPGA开发板相同位置的背面,还有一个Micro SD卡的插槽,可放置SD卡。
24位音频Codec芯片
set_property PACKAGE_PIN D16 [get_ports aud_bclk]
set_property CLOCK_DEDICATED_ROUTE FALSE [get_nets aud_bclk_IBUF]
set_property PACKAGE_PIN A16 [get_ports aud_lrc]
set_property PACKAGE_PIN E19 [get_ports aud_adcdat]
set_property PACKAGE_PIN C18 [get_ports aud_mclk]
set_property PACKAGE_PIN C17 [get_ports aud_dacdat]
set_property PACKAGE_PIN C19 [get_ports aud_scl]
set_property PACKAGE_PIN D17 [get_ports aud_sda]
DDR3L
开发板上FPGA正下方是两片DDR3L SDRAM存储器芯片,产自Micron公司。DDR SDRAM的全称是双倍速率同步动态随机存储器(Double Data Rate Synchronous Dynamic Random Access Memory),其在时钟的上升沿和下降沿都能进行数据传输。DDR3是DDR2的后继者,提供了相较于DDR2 SDRAM更高的运行效能与更低的电压。而DDR3L的L是Low Voltage的缩写,DDR3的工作电压为1.5V,而DDR3L工作电压为1.35V。
32位宽,1GB DDR3L存储器
开发板上DDR3L SDRAM芯片的型号为MT41K256M16TW,即一片该DDR3L SDRAM存储器芯片的深度为256M,宽度为16bit (2Byte),故存储器容量为512MB(256M×2Byte),两片DDR3L芯片地址线已经连在了一起,相当于一片深度不变但数据宽度翻倍(32bit)的DDR3L SDRAM,两片存储器芯片构成的存储器总容量为1GB。
DDR3L的引脚较多,我们将在DDR3L的章节中专门介绍。
千兆以太网
在FPGA开发板的右上侧载有千兆以太网PHY芯片以及网口。该芯片为Realtek公司的RTL8211E,支持1000Mbps的网络传输速率,通过RGMII接口与FPGA进行数据通信,传输时钟为125MHz,4bit的发送数据TXD与接收数据RXD在时钟的上升沿和下降沿采样。开发版上板载的RTL8211E已配置好RX与TX延迟,工作电压为3.3V。
千兆以太网接口和PHY芯片,我们采用RGMII接口,节约引脚
set_property PACKAGE_PIN V17 [get_ports {rgmii_rxd[3]}]
set_property PACKAGE_PIN AB20 [get_ports {rgmii_rxd[2]}]
set_property PACKAGE_PIN AA19 [get_ports {rgmii_rxd[1]}]
set_property PACKAGE_PIN V19 [get_ports {rgmii_rxd[0]}]
set_property PACKAGE_PIN U18 [get_ports {rgmii_txd[3]}]
set_property PACKAGE_PIN U17 [get_ports {rgmii_txd[2]}]
set_property PACKAGE_PIN AB18 [get_ports {rgmii_txd[1]}]
set_property PACKAGE_PIN AA18 [get_ports {rgmii_txd[0]}]
set_property PACKAGE_PIN R14 [get_ports e_mdc]
set_property PACKAGE_PIN P14 [get_ports e_mdio]
set_property PACKAGE_PIN Y18 [get_ports rgmii_rxc]
set_property PACKAGE_PIN V18 [get_ports rgmii_rxctl]
set_property PACKAGE_PIN Y19 [get_ports rgmii_txc]
set_property PACKAGE_PIN W17 [get_ports rgmii_txctl]
VGA接口
如果需要连接扩展显示,也可以通过FPGA板右边的VGA接口连接扩展显示设备,VGA接口共有15针,分成3排,每排5个孔,接口原理图如下。VGA接口具有分辨率高、显示速率快、颜色丰富等优点。VGA接口不但是CRT显示设备的标准接口,同样也是LCD液晶显示设备的标准接口,具有广泛的应用范围。
VGA接口实物
VGA接口原理图
VGA与FPGA的引脚对应关系:
VGA_R0 R17;VGA_R1 W16;VGA_R2 W15;VGA_R3 U16;VGA_G0 T16;VGA_G1 V15;VGA_G2 U15;VGA_G3 V14;VGA_B0 AB12;VGA_B1 P16;VGA_B2 W12; VGA_B3 Y12;VGA_HS T15; VGA_VS V13。