Commit 99ffa1ab authored by he xu's avatar he xu
Browse files

Update README.md, design.md, img/7seg.png, img/button.png, img/ledsw.png,...

Update README.md, design.md, img/7seg.png, img/button.png, img/ledsw.png, img/cluster.jpeg, img/board.jpeg, img/page.png, img/segplay.png, img/topo.PNG, img/uart.png, img/wf.png, img/wf_btn.png, ledsw/echo.v, ledsw/fpgaol.xdc, ledsw/echo.bit, ledsw/README.md, seg/README.md, seg/fpgaol.xdc, seg/top.v, seg/top.bit files
parent b58debb8
# FPGAOL-Examples
# FPGAOL v1.1 使用说明
[FPGAOL](https://fpgaol.ustc.edu.cn)是由中国科大计算机教学实验中心组织开发的、基于Web端的线上硬件实验平台。用户可以远程访问我们部署好的FPGA([Nexys 4 DDR](https://reference.digilentinc.com/reference/programmable-logic/nexys-4-ddr/start))集群,上传本地生成好的比特流文件,并交互地控制FPGA,实时获得FPGA的输出。因为该结果是实际运行而非仿真产生的,所以可以确保其与线下操作FPGA是相同的。同时,由于线上设备具备出色的采样性能,能够精确发现人眼难以观察到的信号变化,FPGAOL平台能为用户快速调试程序提供便利。
<img src="img/page.png" alt="Home page" width="500" />
将FPGA部署在云上的方式,实现了实验资源的高效利用,也能帮助有需要的师生随时随地访问FPGA资源。目前,全校师生都可以通过统一身份认证登录FPGAOL平台,校外人士也可以通过游客账号使用本平台。
FPGAOL v1.1是FPGAOL平台的最近一次更新。本次更新带来的主要升级有:
* [新的资源获取机制](#获取FPGA)
* [支持快速扫描的七段数码管](#七段数码管)
* [采样精度为微秒级的波形图](#波形图)
本说明将介绍该版本的使用方法,并提供一些示例程序。为避免不必要的麻烦,我们**强烈建议**在实际编程中使用示例中提供的`fpgaol.xdc`文件。
**New**: 如果你对FPGAOL的实现感兴趣,欢迎阅读FPGAOL的[设计概要](./design.md)
## 获取FPGA
本版本中,我们引入了更完善的FPGA访问控制机制,用户可以在登陆后点击`acquire`按钮,稍等片刻后页面将给出资源的访问链接。目前用户每次使用FPGA资源的时间默认为**10分钟**,超时后即被释放,用户也可以通过首页的`release`按钮主动释放FPGA。
## 开关与LED
<img src="img/ledsw.png" alt="Screen Shot 2020-04-23 at 8.51.58 AM" width="300" />
FPGAOL v1.1的开关与LED部分与FPGAOL v1.0相比没有变化,管脚的对应关系为:
| SW | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: |
| 管脚 | D14 | F16 | G16 | H14 | E16 | F13 | G13 | H16 |
| LED | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: |
| 管脚 | C17 | D18 | E18 | G17 | D17 | E17 | F18 | G18 |
为了避免上一版本中因频繁刷新LED导致页面卡死的情况,本版本的LED刷新间隔为**0.1 s**,快于该频率的LED变化将无法正常显示。
### 示例程序
LED和SW部分的[示例程序](./ledsw)直接将开关与LED相连,开关的变化将直接体现在LED上。
## 七段数码管
<img src="img/7seg.png" alt="Screen Shot 2020-04-23 at 8.52.29 AM" width="600" />
数码管分为hex_play和seg_play两部分,实验时我们主要用到的是hex_play。
### hex_play
七段数码管是本次更新中改进较大的部分。FPGAOL v1.1拥有了8个七段数码管,并且引入了更贴近实际的显示方式。
由于FPGAOL上的管脚数量有限,我们对数码管进行了一定的**简化**:在使能方面,不再通过8个管脚分别使能8个数位,而是仅使能由`AN[3:0]`所表示的二进制数所对应的数位;在显示的数字方面,不再通过`SEG`信号独立控制每个段(segment),而是直接显示`D[3:0]`形成的16进制数。**例如**,若`AN=3'b010, D=4'b1010`,则在下标为2的数位上显示`A`
除此之外,数码管的使用方式与现实中无异。和现实中的数码管一样,我们建议的扫描频率为**50Hz**,也就是说,若要驱动8个数码管,需要一个**400Hz**的时钟。
数码管与FPGA上管脚的对应关系如下。**请注意**,如果你使用的是`Nexys-4-DDR-Master.xdc`,务必在使用时将对应行的`LVDS`改为`LVCMOS33`
| D0 | D1 | D2 | D3 | AN0 | AN1 | AN2 |
| :--: | :--: | :--: | :--: | :--: | :--: | :--: |
| A14 | A13 | A16 | A15 | B17 | B16 | A18 |
在此简要说明七段数码管的显示方式。现实中的七段数码管是通过快速的扫描,利用人眼的视觉延迟来实现在不同的数位上显示不同的数字的,但在网页上,这显然不可能。于是在新版本的FPGAOL中,我们先对采集到的数码管控制信号进行预处理,按照七段数码管的显示原理计算出每个数位上显示的数字,并直接在网页上显示。
具体来讲,确定数码管每一位所显示数字的算法大致为:
```
while true:
sleep(0.1) // 每隔0.1秒刷新一次
for i=0 to 7:
for j=0 to 15:
T[i][j] = 过去0.1秒内,AN为i且D为j的总时长
max_j = index_of_max(T[i]) // 选择在第i位上被显示时间最长的数字
display `max_j` on `i`
```
### seg_play
为了弥补hex_play不能按段来显示数字的缺陷,我们提供了seg_play,它是支持通过段来控制的一位数码管。为了节约管脚,它的控制信号是与LED共享的,可以通过LED的信号来控制它,具体的对应关系如下:
<img src="img/segplay.png" alt="Screen Shot 2020-04-23 at 8.58.59 AM" width="150" />
| 数码管 | A | B | C | D | E | F | G | 小数点 |
| :----: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | :----: |
| LED | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
### 示例程序
七段数码管的[示例程序](./seg)是一个以秒为单位的16进制计时器,当SW0为0时该计时器递增,反之则递减。
## UART
<img src="img/uart.png" alt="Screen Shot 2020-04-23 at 8.58.59 AM" width="500" />
该功能还没做完,待补充。
### 示例程序
TBA
## 软时钟与按钮
<img src="img/button.png" alt="Screen Shot 2020-04-23 at 8.52.40 AM" width="300" />
FPGAOL计划提供一个速度比较慢的由软件驱动的时钟,以免去同学们给FPGA板载时钟降频的麻烦,但本版本的FPGAOL并没有提供该功能。
本版本的FPGAOL提供了一个按钮,该按钮**按下时为高电平,松开时为低电平**,按钮所对应的管脚如下。**请注意**,如果你使用的是`Nexys-4-DDR-Master.xdc`,务必在使用时将对应行的`LVDS`改为`LVCMOS33`
| 按钮序号 | 0 |
| :------: | :--: |
| 管脚 | B18 |
## 波形图
<img src="img/wf_btn.png" width="250" />
在FPGAOL v1.0中,我们提供了一个实时刷新的波形图,但它的显示效果一般,最终成为了一个鸡肋的功能。在新版本中,我们去掉了这个实时波形图,转而将对FPGA的采样结果直接存储为**vcd**格式的波形文件,可以通过[GTKWave](http://gtkwave.sourceforge.net)等软件打开。
<img src="img/wf.png" alt="Screen Shot 2020-04-23 at 9.38.56 AM" width="600" />
目前,该波形图的采样间隔为**5 us**,希望它能为同学们**调试程序**、助教**远程检查实验**等提供便利。本文作者在前不久就通过该波形图锁定了我们的测试比特流中存在的bug,所以我认为如果使用得当,这有可能成为FPGAOL的一个*killer feature*
This is the instruction document of the fpgaol
\ No newline at end of file
# FPGAOL Design Overview
[FPGAOL](https://fpgaol.ustc.edu.cn)开发的过程中,我们不断地优化系统的性能,力图为用户提供和线下使用FPGA相同甚至更好的体验。我们进行了很多摸索,最终在有限的条件下支撑起了几十台FPGA节点的负荷。本文是对FPGAOL整体设计的总结,讨论了我们在一些重要问题上的思考过程和创新点,可以为日后的开发者或是希望深入了解FPGAOL项目的用户提供参考。
## 整体架构
FPGAOL采用了典型的Master-Worker的架构,一个**中心服务器**负责监控集群中各节点的工作状态并给用户分配FPGA资源,每个**节点**由一台树莓派和一个FPGA组成。用户通过[HTTP](https://tools.ietf.org/html/rfc2616)访问中心服务器并通过[WebSocket](https://tools.ietf.org/html/rfc6455)实时控制树莓派对FPGA进行烧写和输入输出。下图为我们的FPGA集群的一角。
<img src="img/cluster.jpeg" alt="FPGA borad" width="400" />
### Scale Up:减轻服务器的压力
从之前的描述可知,中心服务器是FPGAOL面对用户的接口,还负责控制整个集群,承担着比较大的压力。有趣的是,我们的服务器是一台十年前的奔腾双核台式机,性能并不出色。因此,从FPGAOL设计的初期,减轻服务器的压力,让我们的服务能轻松地从几台FPGA的规模扩展到几十台再到更多,一直是我们考虑的问题。
我们的解决方法是**将尽可能多的功能下放到集群中的树莓派上**。为此,我们在每台树莓派上都运行了一个Web Server,用户对FPGA的烧写和控制信号直接通过中心服务器上的**TCP转发**到达树莓派,树莓派对FPGA的采样结果也是直接发给用户。这样,中心服务器实际上充当了**网关**的角色,它不需要对用户和树莓派之间的通信进行任何处理,而只需要对网络数据包进行转发(每秒约1KB),计算开销很小。经过实验,同时工作的FPGA节点增加时,中心服务器的load average几乎不变。
在最新的FPGAOL v1.1版本中,我们还将渲染FPGA的控制页面的工作也从中心服务器下放到了树莓派上,这样,每个结点就完全实现了独立运行服务,与中心服务器无关。
### 高效利用网络带宽
FPGAOL的网络拓扑是一个树形结构,如下图所示:
<img src="img/topo.PNG" alt="Network Topology" width="400" />
尽管用户和树莓派之间的通信流量很小(1kb/s),但用户上传比特流的大小约为4MB,因此,一旦出现很多用户同时上传比特流的情况,网络的瓶颈处(汇聚交换机和接入交换机之间的百兆网)可能形成拥塞,**这会使得其他用户和树莓派间的实时通信出现丢包、卡顿**,严重影响服务质量,主要有以下两个解决方法:
* 按接入交换机对结点进行分组和**负载均衡**,尽量避免同一个分组中的多个结点同时上传比特流。
* 对用户上传的比特流文件进行压缩,减小带宽占用,经试验,可以将比特流压缩为几KB,效果较好。
## Master Node:中心服务器
如前一部分所述,FPGAOL的中心服务器是比较轻量的。除了为整个平台提供Web页面之外,它只负责对集群的管理和分配。以下为中心服务器的两个主要功能:
### Failure (& Recovery) Detection
初期的FPGAOL没有failure detection机制,导致用户有时会获取到未正常工作或不稳定的节点。后期我们引入了一个简单的binary failure detector,使得用户获取节点的正常率达到了95%以上,但仍有提升空间。
FPGAOL v1.0中failure detection较为困难的一大原因是硬件不稳定,**网线松动和电源接触不良**十分普遍,导致许多设备长期处在不稳定的状态,即**crash-recovery model**。尽管市面上有许多成熟的failure detector实现,但是他们大多面向设备故障后不会自动重启的**crash-stop model****对于不稳定的设备检测能力一般**[这里](https://github.com/fandahao17/Phi-Accrual-Recovery)是一个尚在开发中的Phi-Accural failure detector的改进版,希望能提升其对不稳定设备的检测能力。
在FPGAOL v1.1中,因为有了**自制的PCB板和机箱**,硬件稳定性得到的极大的提升,基本不再出现设备掉线的情况,因此failure detector的作用不再那么重要了。
### 基于token的访问控制
在FPGAOL v1.0中,会出现用户实际访问FPGA的情况与后台的记录不符的情况,例如用户还在FPGA页面上,但后台误认为其已经释放了资源。在新版本中,我们引入了基于token的访问控制机制,来避免这种情况的发生。
具体来讲,用户使用FPGA的一个周期为:
* 用户申请FPGA,服务器为其生成token,并发给对应的树莓派
* 用户进入FPGA界面,树莓派验证其token,若正确方可进入(确保一个用户只有一个token)
* 用户退出FPGA界面,不释放资源(避免了页面刷新导致的资源重新分配)
* 时间到,用户释放资源
## Worker Nodes:树莓派-FPGA节点
FPGAOL集群中的每个节点由一个树莓派和一个FPGA组成,下图为FPGAOL v1.1中的一个节点:
<img src="img/board.jpeg" alt="FPGA board" width="500" />
在笔者看来,FPGAOL的升级过程就是不断将计算任务从服务器和浏览器下放到树莓派上的过程。以下是我们利用树莓派的计算能力提升FPGAOL服务质量的两个例子。
### 基于DMA的高精度采样
FPGAOL的目标是为用户提供与线下操作FPGA相同甚至更好的体验。因为树莓派是一个具有高速时钟的通用计算机,我们可以利用它来实现对FPGA信号的**高精度采样**,从而发现到人眼无法观察到的信号变化,帮助用户更好地理解自己的程序。
但是,在运行着Linux操作系统的树莓派上,高精度的采样并不容易:(1)采样需要访问物理内存,而我们一般只能访问进程的虚拟内存(2)我们的采样程序可能被其他程序抢占,导致我们无法获得完整的采样结果(3)如果采样率过高,我们的采样程序可能会占用过多的CPU资源。
解决采样问题的方式是[DMA](https://en.wikipedia.org/wiki/Direct_memory_access),但是DMA也需要处理cache一致性等问题,笔者在[这篇文章](https://github.com/fandahao17/Raspberry-Pi-DMA-Tutorial)中详细介绍了我们是如何通过DMA实现**微秒级**的高精度采样的。
### 七段数码管的显示算法
七段数码管是FPGA上一个非常重要的输出部件,它是通过高频率的扫描,让人眼产生视觉延迟,从而达到在不同的数位上显示不同的数字的。然而,FPGAOL是基于Web端的,利用高频率的扫描进行显示是不可能实现的。因此,七段数码管的显示一度被视为FPGAOL中一个不可能实现的功能。
幸运的是,因为拥有了高精度的采样,我们得以根据采样得到的数据来**模拟数码管的显示过程**。也就是说,我们可以在树莓派上记录下扫描到每个数位时数码管要显示的数字和时长。经过一定时间后,对每一位,我们统计各个数字被显示的总时长,并取其中的最大值进行显示,若该位被使能的时间太短,就不在该位上显示数字。
以在4位数码管上显示数字`1234`为例,假设使能信号被一个200Hz的时钟驱动,我们的数码管模拟算法会记录下以下扫描信息:
| 时间(ms) | 0-5 | 5-10 | 10-15 | 15-20 | ... |
| :----------: | :--: | :--: | :---: | :---: | :--: |
| 被使能的数位 | 0 | 1 | 2 | 3 | ... |
| 显示的数字 | 4 | 3 | 2 | 1 | ... |
我们认为一个正常的数码管显示程序不会让显示数字的变化速度大于0.1s。因此间隔0.1s后,我们统计得到在第0位上,显示时间最长的数字为4,第1位为3,第2位为2,第3位为1,从而正确地得到每个数码管上显示的数字。
一个简化版的数码管显示算法为:
```
while true:
sleep(0.1) // 每隔0.1秒刷新一次
for i=0 to 7:
for j=0 to 15:
T[i][j] = 过去0.1秒内,AN为i且D为j的总时长
max_j = index_of_max(T[i]) // 选择在第i位上被显示时间最长的数字
display `max_j` on `i`
```
## Help Needed!
尽管我们一直努力地完善FPGAOL的功能,但目前仍有很多不尽如人意的地方。如果你对这个平台如何工作很感兴趣,或是有好的点子,或是想让学弟学妹不再为玄学的硬件实验而发愁,欢迎加入我们,和我们一起改进这个平台!
img/wf.png

72.2 KB

# LED和开关的例子
本示例将LED和SW直接相连,SW的变化直接映射到LED上。
File added
module echo (
input [7:0] sw,
output [7:0] led
);
assign led = sw;
endmodule
## This file is a general .xdc for the Nexys4 DDR Rev. C
## To use it in a project:
## - uncomment the lines corresponding to used pins
## - rename the used ports (in each line, after get_ports) according to the top level signal names in the project
## Clock signal
set_property -dict { PACKAGE_PIN E3 IOSTANDARD LVCMOS33 } [get_ports { clk }]; #IO_L12P_T1_MRCC_35 Sch=clk100mhz
create_clock -add -name sys_clk_pin -period 10.00 -waveform {0 5} [get_ports { clk }];
##LEDs
set_property -dict { PACKAGE_PIN C17 IOSTANDARD LVCMOS33 } [get_ports { led[0] }]; #IO_L20N_T3_A19_15 Sch=ja[1]
set_property -dict { PACKAGE_PIN D18 IOSTANDARD LVCMOS33 } [get_ports { led[1] }]; #IO_L21N_T3_DQS_A18_15 Sch=ja[2]
set_property -dict { PACKAGE_PIN E18 IOSTANDARD LVCMOS33 } [get_ports { led[2] }]; #IO_L21P_T3_DQS_15 Sch=ja[3]
set_property -dict { PACKAGE_PIN G17 IOSTANDARD LVCMOS33 } [get_ports { led[3] }]; #IO_L18N_T2_A23_15 Sch=ja[4]
set_property -dict { PACKAGE_PIN D17 IOSTANDARD LVCMOS33 } [get_ports { led[4] }]; #IO_L16N_T2_A27_15 Sch=ja[7]
set_property -dict { PACKAGE_PIN E17 IOSTANDARD LVCMOS33 } [get_ports { led[5] }]; #IO_L16P_T2_A28_15 Sch=ja[8]
set_property -dict { PACKAGE_PIN F18 IOSTANDARD LVCMOS33 } [get_ports { led[6] }]; #IO_L22N_T3_A16_15 Sch=ja[9]
set_property -dict { PACKAGE_PIN G18 IOSTANDARD LVCMOS33 } [get_ports { led[7] }]; #IO_L22P_T3_A17_15 Sch=ja[10]
##Switches
set_property -dict { PACKAGE_PIN D14 IOSTANDARD LVCMOS33 } [get_ports { sw[0]}]; #IO_L1P_T0_AD0P_15 Sch=jb[1]
set_property -dict { PACKAGE_PIN F16 IOSTANDARD LVCMOS33 } [get_ports { sw[1]}]; #IO_L14N_T2_SRCC_15 Sch=jb[2]
set_property -dict { PACKAGE_PIN G16 IOSTANDARD LVCMOS33 } [get_ports { sw[2]}]; #IO_L13N_T2_MRCC_15 Sch=jb[3]
set_property -dict { PACKAGE_PIN H14 IOSTANDARD LVCMOS33 } [get_ports { sw[3]}]; #IO_L15P_T2_DQS_15 Sch=jb[4]
set_property -dict { PACKAGE_PIN E16 IOSTANDARD LVCMOS33 } [get_ports { sw[4]}]; #IO_L11N_T1_SRCC_15 Sch=jb[7]
set_property -dict { PACKAGE_PIN F13 IOSTANDARD LVCMOS33 } [get_ports { sw[5]}]; #IO_L5P_T0_AD9P_15 Sch=jb[8]
set_property -dict { PACKAGE_PIN G13 IOSTANDARD LVCMOS33 } [get_ports { sw[6]}]; #IO_0_15 Sch=jb[9]
set_property -dict { PACKAGE_PIN H16 IOSTANDARD LVCMOS33 } [get_ports { sw[7] }]; #IO_L13P_T2_MRCC_15 Sch=jb[10]
##7-Segment Display
#set_property -dict { PACKAGE_PIN A14 IOSTANDARD LVCMOS33 } [get_ports { D[0] }]; #IO_L9N_T1_DQS_AD3N_15 Sch=xa_n[1]
#set_property -dict { PACKAGE_PIN A13 IOSTANDARD LVCMOS33 } [get_ports { D[1] }]; #IO_L9P_T1_DQS_AD3P_15 Sch=xa_p[1]
#set_property -dict { PACKAGE_PIN A16 IOSTANDARD LVCMOS33 } [get_ports { D[2] }]; #IO_L8N_T1_AD10N_15 Sch=xa_n[2]
#set_property -dict { PACKAGE_PIN A15 IOSTANDARD LVCMOS33 } [get_ports { D[3] }]; #IO_L8P_T1_AD10P_15 Sch=xa_p[2]
#set_property -dict { PACKAGE_PIN B17 IOSTANDARD LVCMOS33 } [get_ports { AN[0] }]; #IO_L7N_T1_AD2N_15 Sch=xa_n[3]
#set_property -dict { PACKAGE_PIN B16 IOSTANDARD LVCMOS33 } [get_ports { AN[1] }]; #IO_L7P_T1_AD2P_15 Sch=xa_p[3]
#set_property -dict { PACKAGE_PIN A18 IOSTANDARD LVCMOS33 } [get_ports { AN[2] }]; #IO_L10N_T1_AD11N_15 Sch=xa_n[4]
##Buttons
#set_property -dict { PACKAGE_PIN B18 IOSTANDARD LVCMOS33 } [get_ports { BTN }]; #IO_L10P_T1_AD11P_15 Sch=xa_p[4]
##VGA Connector
#set_property -dict { PACKAGE_PIN A3 IOSTANDARD LVCMOS33 } [get_ports { VGA_R[0] }]; #IO_L8N_T1_AD14N_35 Sch=vga_r[0]
#set_property -dict { PACKAGE_PIN B4 IOSTANDARD LVCMOS33 } [get_ports { VGA_R[1] }]; #IO_L7N_T1_AD6N_35 Sch=vga_r[1]
#set_property -dict { PACKAGE_PIN C5 IOSTANDARD LVCMOS33 } [get_ports { VGA_R[2] }]; #IO_L1N_T0_AD4N_35 Sch=vga_r[2]
#set_property -dict { PACKAGE_PIN A4 IOSTANDARD LVCMOS33 } [get_ports { VGA_R[3] }]; #IO_L8P_T1_AD14P_35 Sch=vga_r[3]
#set_property -dict { PACKAGE_PIN C6 IOSTANDARD LVCMOS33 } [get_ports { VGA_G[0] }]; #IO_L1P_T0_AD4P_35 Sch=vga_g[0]
#set_property -dict { PACKAGE_PIN A5 IOSTANDARD LVCMOS33 } [get_ports { VGA_G[1] }]; #IO_L3N_T0_DQS_AD5N_35 Sch=vga_g[1]
#set_property -dict { PACKAGE_PIN B6 IOSTANDARD LVCMOS33 } [get_ports { VGA_G[2] }]; #IO_L2N_T0_AD12N_35 Sch=vga_g[2]
#set_property -dict { PACKAGE_PIN A6 IOSTANDARD LVCMOS33 } [get_ports { VGA_G[3] }]; #IO_L3P_T0_DQS_AD5P_35 Sch=vga_g[3]
#set_property -dict { PACKAGE_PIN B7 IOSTANDARD LVCMOS33 } [get_ports { VGA_B[0] }]; #IO_L2P_T0_AD12P_35 Sch=vga_b[0]
#set_property -dict { PACKAGE_PIN C7 IOSTANDARD LVCMOS33 } [get_ports { VGA_B[1] }]; #IO_L4N_T0_35 Sch=vga_b[1]
#set_property -dict { PACKAGE_PIN D7 IOSTANDARD LVCMOS33 } [get_ports { VGA_B[2] }]; #IO_L6N_T0_VREF_35 Sch=vga_b[2]
#set_property -dict { PACKAGE_PIN D8 IOSTANDARD LVCMOS33 } [get_ports { VGA_B[3] }]; #IO_L4P_T0_35 Sch=vga_b[3]
#set_property -dict { PACKAGE_PIN B11 IOSTANDARD LVCMOS33 } [get_ports { VGA_HS }]; #IO_L4P_T0_15 Sch=vga_hs
#set_property -dict { PACKAGE_PIN B12 IOSTANDARD LVCMOS33 } [get_ports { VGA_VS }]; #IO_L3N_T0_DQS_AD1N_15 Sch=vga_vs
##Micro SD Connector
#set_property -dict { PACKAGE_PIN E2 IOSTANDARD LVCMOS33 } [get_ports { SD_RESET }]; #IO_L14P_T2_SRCC_35 Sch=sd_reset
#set_property -dict { PACKAGE_PIN A1 IOSTANDARD LVCMOS33 } [get_ports { SD_CD }]; #IO_L9N_T1_DQS_AD7N_35 Sch=sd_cd
#set_property -dict { PACKAGE_PIN B1 IOSTANDARD LVCMOS33 } [get_ports { SD_SCK }]; #IO_L9P_T1_DQS_AD7P_35 Sch=sd_sck
#set_property -dict { PACKAGE_PIN C1 IOSTANDARD LVCMOS33 } [get_ports { SD_CMD }]; #IO_L16N_T2_35 Sch=sd_cmd
#set_property -dict { PACKAGE_PIN C2 IOSTANDARD LVCMOS33 } [get_ports { SD_DAT[0] }]; #IO_L16P_T2_35 Sch=sd_dat[0]
#set_property -dict { PACKAGE_PIN E1 IOSTANDARD LVCMOS33 } [get_ports { SD_DAT[1] }]; #IO_L18N_T2_35 Sch=sd_dat[1]
#set_property -dict { PACKAGE_PIN F1 IOSTANDARD LVCMOS33 } [get_ports { SD_DAT[2] }]; #IO_L18P_T2_35 Sch=sd_dat[2]
#set_property -dict { PACKAGE_PIN D2 IOSTANDARD LVCMOS33 } [get_ports { SD_DAT[3] }]; #IO_L14N_T2_SRCC_35 Sch=sd_dat[3]
##Accelerometer
#set_property -dict { PACKAGE_PIN E15 IOSTANDARD LVCMOS33 } [get_ports { ACL_MISO }]; #IO_L11P_T1_SRCC_15 Sch=acl_miso
#set_property -dict { PACKAGE_PIN F14 IOSTANDARD LVCMOS33 } [get_ports { ACL_MOSI }]; #IO_L5N_T0_AD9N_15 Sch=acl_mosi
#set_property -dict { PACKAGE_PIN F15 IOSTANDARD LVCMOS33 } [get_ports { ACL_SCLK }]; #IO_L14P_T2_SRCC_15 Sch=acl_sclk
#set_property -dict { PACKAGE_PIN D15 IOSTANDARD LVCMOS33 } [get_ports { ACL_CSN }]; #IO_L12P_T1_MRCC_15 Sch=acl_csn
#set_property -dict { PACKAGE_PIN B13 IOSTANDARD LVCMOS33 } [get_ports { ACL_INT[1] }]; #IO_L2P_T0_AD8P_15 Sch=acl_int[1]
#set_property -dict { PACKAGE_PIN C16 IOSTANDARD LVCMOS33 } [get_ports { ACL_INT[2] }]; #IO_L20P_T3_A20_15 Sch=acl_int[2]
##Temperature Sensor
#set_property -dict { PACKAGE_PIN C14 IOSTANDARD LVCMOS33 } [get_ports { TMP_SCL }]; #IO_L1N_T0_AD0N_15 Sch=tmp_scl
#set_property -dict { PACKAGE_PIN C15 IOSTANDARD LVCMOS33 } [get_ports { TMP_SDA }]; #IO_L12N_T1_MRCC_15 Sch=tmp_sda
#set_property -dict { PACKAGE_PIN D13 IOSTANDARD LVCMOS33 } [get_ports { TMP_INT }]; #IO_L6N_T0_VREF_15 Sch=tmp_int
#set_property -dict { PACKAGE_PIN B14 IOSTANDARD LVCMOS33 } [get_ports { TMP_CT }]; #IO_L2N_T0_AD8N_15 Sch=tmp_ct
##Omnidirectional Microphone
#set_property -dict { PACKAGE_PIN J5 IOSTANDARD LVCMOS33 } [get_ports { M_CLK }]; #IO_25_35 Sch=m_clk
#set_property -dict { PACKAGE_PIN H5 IOSTANDARD LVCMOS33 } [get_ports { M_DATA }]; #IO_L24N_T3_35 Sch=m_data
#set_property -dict { PACKAGE_PIN F5 IOSTANDARD LVCMOS33 } [get_ports { M_LRSEL }]; #IO_0_35 Sch=m_lrsel
##PWM Audio Amplifier
#set_property -dict { PACKAGE_PIN A11 IOSTANDARD LVCMOS33 } [get_ports { AUD_PWM }]; #IO_L4N_T0_15 Sch=aud_pwm
#set_property -dict { PACKAGE_PIN D12 IOSTANDARD LVCMOS33 } [get_ports { AUD_SD }]; #IO_L6P_T0_15 Sch=aud_sd
##USB-RS232 Interface
#set_property -dict { PACKAGE_PIN C4 IOSTANDARD LVCMOS33 } [get_ports { UART_TXD_IN }]; #IO_L7P_T1_AD6P_35 Sch=uart_txd_in
#set_property -dict { PACKAGE_PIN D4 IOSTANDARD LVCMOS33 } [get_ports { UART_RXD_OUT }]; #IO_L11N_T1_SRCC_35 Sch=uart_rxd_out
#set_property -dict { PACKAGE_PIN D3 IOSTANDARD LVCMOS33 } [get_ports { UART_CTS }]; #IO_L12N_T1_MRCC_35 Sch=uart_cts
#set_property -dict { PACKAGE_PIN E5 IOSTANDARD LVCMOS33 } [get_ports { UART_RTS }]; #IO_L5N_T0_AD13N_35 Sch=uart_rts
##USB HID (PS/2)
#set_property -dict { PACKAGE_PIN F4 IOSTANDARD LVCMOS33 } [get_ports { PS2_CLK }]; #IO_L13P_T2_MRCC_35 Sch=ps2_clk
#set_property -dict { PACKAGE_PIN B2 IOSTANDARD LVCMOS33 } [get_ports { PS2_DATA }]; #IO_L10N_T1_AD15N_35 Sch=ps2_data
##SMSC Ethernet PHY
#set_property -dict { PACKAGE_PIN C9 IOSTANDARD LVCMOS33 } [get_ports { ETH_MDC }]; #IO_L11P_T1_SRCC_16 Sch=eth_mdc
#set_property -dict { PACKAGE_PIN A9 IOSTANDARD LVCMOS33 } [get_ports { ETH_MDIO }]; #IO_L14N_T2_SRCC_16 Sch=eth_mdio
#set_property -dict { PACKAGE_PIN B3 IOSTANDARD LVCMOS33 } [get_ports { ETH_RSTN }]; #IO_L10P_T1_AD15P_35 Sch=eth_rstn
#set_property -dict { PACKAGE_PIN D9 IOSTANDARD LVCMOS33 } [get_ports { ETH_CRSDV }]; #IO_L6N_T0_VREF_16 Sch=eth_crsdv
#set_property -dict { PACKAGE_PIN C10 IOSTANDARD LVCMOS33 } [get_ports { ETH_RXERR }]; #IO_L13N_T2_MRCC_16 Sch=eth_rxerr
#set_property -dict { PACKAGE_PIN C11 IOSTANDARD LVCMOS33 } [get_ports { ETH_RXD[0] }]; #IO_L13P_T2_MRCC_16 Sch=eth_rxd[0]
#set_property -dict { PACKAGE_PIN D10 IOSTANDARD LVCMOS33 } [get_ports { ETH_RXD[1] }]; #IO_L19N_T3_VREF_16 Sch=eth_rxd[1]
#set_property -dict { PACKAGE_PIN B9 IOSTANDARD LVCMOS33 } [get_ports { ETH_TXEN }]; #IO_L11N_T1_SRCC_16 Sch=eth_txen
#set_property -dict { PACKAGE_PIN A10 IOSTANDARD LVCMOS33 } [get_ports { ETH_TXD[0] }]; #IO_L14P_T2_SRCC_16 Sch=eth_txd[0]
#set_property -dict { PACKAGE_PIN A8 IOSTANDARD LVCMOS33 } [get_ports { ETH_TXD[1] }]; #IO_L12N_T1_MRCC_16 Sch=eth_txd[1]
#set_property -dict { PACKAGE_PIN D5 IOSTANDARD LVCMOS33 } [get_ports { ETH_REFCLK }]; #IO_L11P_T1_SRCC_35 Sch=eth_refclk
#set_property -dict { PACKAGE_PIN B8 IOSTANDARD LVCMOS33 } [get_ports { ETH_INTN }]; #IO_L12P_T1_MRCC_16 Sch=eth_intn
##Quad SPI Flash
#set_property -dict { PACKAGE_PIN K17 IOSTANDARD LVCMOS33 } [get_ports { QSPI_DQ[0] }]; #IO_L1P_T0_D00_MOSI_14 Sch=qspi_dq[0]
#set_property -dict { PACKAGE_PIN K18 IOSTANDARD LVCMOS33 } [get_ports { QSPI_DQ[1] }]; #IO_L1N_T0_D01_DIN_14 Sch=qspi_dq[1]
#set_property -dict { PACKAGE_PIN L14 IOSTANDARD LVCMOS33 } [get_ports { QSPI_DQ[2] }]; #IO_L2P_T0_D02_14 Sch=qspi_dq[2]
#set_property -dict { PACKAGE_PIN M14 IOSTANDARD LVCMOS33 } [get_ports { QSPI_DQ[3] }]; #IO_L2N_T0_D03_14 Sch=qspi_dq[3]
#set_property -dict { PACKAGE_PIN L13 IOSTANDARD LVCMOS33 } [get_ports { QSPI_CSN }]; #IO_L6P_T0_FCS_B_14 Sch=qspi_csn
# 七段数码管的例子
本示例是一个以秒为单位的16进制计时器,当SW0为0时,它正计时,当SW0为1时,它倒计时
## This file is a general .xdc for the Nexys4 DDR Rev. C
## To use it in a project:
## - uncomment the lines corresponding to used pins
## - rename the used ports (in each line, after get_ports) according to the top level signal names in the project
## Clock signal
set_property -dict { PACKAGE_PIN E3 IOSTANDARD LVCMOS33 } [get_ports { CLK100MHZ }]; #IO_L12P_T1_MRCC_35 Sch=clk100mhz
create_clock -add -name sys_clk_pin -period 10.00 -waveform {0 5} [get_ports { CLK100MHZ }];
##LEDs
#set_property -dict { PACKAGE_PIN C17 IOSTANDARD LVCMOS33 } [get_ports { led[0] }]; #IO_L20N_T3_A19_15 Sch=ja[1]
#set_property -dict { PACKAGE_PIN D18 IOSTANDARD LVCMOS33 } [get_ports { led[1] }]; #IO_L21N_T3_DQS_A18_15 Sch=ja[2]
#set_property -dict { PACKAGE_PIN E18 IOSTANDARD LVCMOS33 } [get_ports { led[2] }]; #IO_L21P_T3_DQS_15 Sch=ja[3]
#set_property -dict { PACKAGE_PIN G17 IOSTANDARD LVCMOS33 } [get_ports { led[3] }]; #IO_L18N_T2_A23_15 Sch=ja[4]
#set_property -dict { PACKAGE_PIN D17 IOSTANDARD LVCMOS33 } [get_ports { led[4] }]; #IO_L16N_T2_A27_15 Sch=ja[7]
#set_property -dict { PACKAGE_PIN E17 IOSTANDARD LVCMOS33 } [get_ports { led[5] }]; #IO_L16P_T2_A28_15 Sch=ja[8]
#set_property -dict { PACKAGE_PIN F18 IOSTANDARD LVCMOS33 } [get_ports { led[6] }]; #IO_L22N_T3_A16_15 Sch=ja[9]
#set_property -dict { PACKAGE_PIN G18 IOSTANDARD LVCMOS33 } [get_ports { led[7] }]; #IO_L22P_T3_A17_15 Sch=ja[10]
##Switches
set_property -dict { PACKAGE_PIN D14 IOSTANDARD LVCMOS33 } [get_ports { dir }]; #IO_L1P_T0_AD0P_15 Sch=jb[1]
#set_property -dict { PACKAGE_PIN F16 IOSTANDARD LVCMOS33 } [get_ports { sw[1] }]; #IO_L14N_T2_SRCC_15 Sch=jb[2]
#set_property -dict { PACKAGE_PIN G16 IOSTANDARD LVCMOS33 } [get_ports { sw[2] }]; #IO_L13N_T2_MRCC_15 Sch=jb[3]
#set_property -dict { PACKAGE_PIN H14 IOSTANDARD LVCMOS33 } [get_ports { sw[3] }]; #IO_L15P_T2_DQS_15 Sch=jb[4]
#set_property -dict { PACKAGE_PIN E16 IOSTANDARD LVCMOS33 } [get_ports { sw[4] }]; #IO_L11N_T1_SRCC_15 Sch=jb[7]
#set_property -dict { PACKAGE_PIN F13 IOSTANDARD LVCMOS33 } [get_ports { sw[5] }]; #IO_L5P_T0_AD9P_15 Sch=jb[8]
#set_property -dict { PACKAGE_PIN G13 IOSTANDARD LVCMOS33 } [get_ports { sw[6] }]; #IO_0_15 Sch=jb[9]
#set_property -dict { PACKAGE_PIN H16 IOSTANDARD LVCMOS33 } [get_ports { sw[7] }]; #IO_L13P_T2_MRCC_15 Sch=jb[10]
##7-Segment Display
set_property -dict { PACKAGE_PIN A14 IOSTANDARD LVCMOS33 } [get_ports { hexplay_data[0] }]; #IO_L9N_T1_DQS_AD3N_15 Sch=xa_n[1]
set_property -dict { PACKAGE_PIN A13 IOSTANDARD LVCMOS33 } [get_ports { hexplay_data[1] }]; #IO_L9P_T1_DQS_AD3P_15 Sch=xa_p[1]
set_property -dict { PACKAGE_PIN A16 IOSTANDARD LVCMOS33 } [get_ports { hexplay_data[2] }]; #IO_L8N_T1_AD10N_15 Sch=xa_n[2]
set_property -dict { PACKAGE_PIN A15 IOSTANDARD LVCMOS33 } [get_ports { hexplay_data[3] }]; #IO_L8P_T1_AD10P_15 Sch=xa_p[2]
set_property -dict { PACKAGE_PIN B17 IOSTANDARD LVCMOS33 } [get_ports { hexplay_an[0] }]; #IO_L7N_T1_AD2N_15 Sch=xa_n[3]
set_property -dict { PACKAGE_PIN B16 IOSTANDARD LVCMOS33 } [get_ports { hexplay_an[1] }]; #IO_L7P_T1_AD2P_15 Sch=xa_p[3]
set_property -dict { PACKAGE_PIN A18 IOSTANDARD LVCMOS33 } [get_ports { hexplay_an[2] }]; #IO_L10N_T1_AD11N_15 Sch=xa_n[4]
##Buttons
#set_property -dict { PACKAGE_PIN B18 IOSTANDARD LVCMOS33 } [get_ports { BTN }]; #IO_L10P_T1_AD11P_15 Sch=xa_p[4]
##VGA Connector
#set_property -dict { PACKAGE_PIN A3 IOSTANDARD LVCMOS33 } [get_ports { VGA_R[0] }]; #IO_L8N_T1_AD14N_35 Sch=vga_r[0]
#set_property -dict { PACKAGE_PIN B4 IOSTANDARD LVCMOS33 } [get_ports { VGA_R[1] }]; #IO_L7N_T1_AD6N_35 Sch=vga_r[1]
#set_property -dict { PACKAGE_PIN C5 IOSTANDARD LVCMOS33 } [get_ports { VGA_R[2] }]; #IO_L1N_T0_AD4N_35 Sch=vga_r[2]
#set_property -dict { PACKAGE_PIN A4 IOSTANDARD LVCMOS33 } [get_ports { VGA_R[3] }]; #IO_L8P_T1_AD14P_35 Sch=vga_r[3]
#set_property -dict { PACKAGE_PIN C6 IOSTANDARD LVCMOS33 } [get_ports { VGA_G[0] }]; #IO_L1P_T0_AD4P_35 Sch=vga_g[0]
#set_property -dict { PACKAGE_PIN A5 IOSTANDARD LVCMOS33 } [get_ports { VGA_G[1] }]; #IO_L3N_T0_DQS_AD5N_35 Sch=vga_g[1]
#set_property -dict { PACKAGE_PIN B6 IOSTANDARD LVCMOS33 } [get_ports { VGA_G[2] }]; #IO_L2N_T0_AD12N_35 Sch=vga_g[2]
#set_property -dict { PACKAGE_PIN A6 IOSTANDARD LVCMOS33 } [get_ports { VGA_G[3] }]; #IO_L3P_T0_DQS_AD5P_35 Sch=vga_g[3]
#set_property -dict { PACKAGE_PIN B7 IOSTANDARD LVCMOS33 } [get_ports { VGA_B[0] }]; #IO_L2P_T0_AD12P_35 Sch=vga_b[0]
#set_property -dict { PACKAGE_PIN C7 IOSTANDARD LVCMOS33 } [get_ports { VGA_B[1] }]; #IO_L4N_T0_35 Sch=vga_b[1]
#set_property -dict { PACKAGE_PIN D7 IOSTANDARD LVCMOS33 } [get_ports { VGA_B[2] }]; #IO_L6N_T0_VREF_35 Sch=vga_b[2]
#set_property -dict { PACKAGE_PIN D8 IOSTANDARD LVCMOS33 } [get_ports { VGA_B[3] }]; #IO_L4P_T0_35 Sch=vga_b[3]
#set_property -dict { PACKAGE_PIN B11 IOSTANDARD LVCMOS33 } [get_ports { VGA_HS }]; #IO_L4P_T0_15 Sch=vga_hs
#set_property -dict { PACKAGE_PIN B12 IOSTANDARD LVCMOS33 } [get_ports { VGA_VS }]; #IO_L3N_T0_DQS_AD1N_15 Sch=vga_vs
##Micro SD Connector
#set_property -dict { PACKAGE_PIN E2 IOSTANDARD LVCMOS33 } [get_ports { SD_RESET }]; #IO_L14P_T2_SRCC_35 Sch=sd_reset
#set_property -dict { PACKAGE_PIN A1 IOSTANDARD LVCMOS33 } [get_ports { SD_CD }]; #IO_L9N_T1_DQS_AD7N_35 Sch=sd_cd
#set_property -dict { PACKAGE_PIN B1 IOSTANDARD LVCMOS33 } [get_ports { SD_SCK }]; #IO_L9P_T1_DQS_AD7P_35 Sch=sd_sck
#set_property -dict { PACKAGE_PIN C1 IOSTANDARD LVCMOS33 } [get_ports { SD_CMD }]; #IO_L16N_T2_35 Sch=sd_cmd
#set_property -dict { PACKAGE_PIN C2 IOSTANDARD LVCMOS33 } [get_ports { SD_DAT[0] }]; #IO_L16P_T2_35 Sch=sd_dat[0]
#set_property -dict { PACKAGE_PIN E1 IOSTANDARD LVCMOS33 } [get_ports { SD_DAT[1] }]; #IO_L18N_T2_35 Sch=sd_dat[1]
#set_property -dict { PACKAGE_PIN F1 IOSTANDARD LVCMOS33 } [get_ports { SD_DAT[2] }]; #IO_L18P_T2_35 Sch=sd_dat[2]
#set_property -dict { PACKAGE_PIN D2 IOSTANDARD LVCMOS33 } [get_ports { SD_DAT[3] }]; #IO_L14N_T2_SRCC_35 Sch=sd_dat[3]
##Accelerometer
#set_property -dict { PACKAGE_PIN E15 IOSTANDARD LVCMOS33 } [get_ports { ACL_MISO }]; #IO_L11P_T1_SRCC_15 Sch=acl_miso
#set_property -dict { PACKAGE_PIN F14 IOSTANDARD LVCMOS33 } [get_ports { ACL_MOSI }]; #IO_L5N_T0_AD9N_15 Sch=acl_mosi
#set_property -dict { PACKAGE_PIN F15 IOSTANDARD LVCMOS33 } [get_ports { ACL_SCLK }]; #IO_L14P_T2_SRCC_15 Sch=acl_sclk
#set_property -dict { PACKAGE_PIN D15 IOSTANDARD LVCMOS33 } [get_ports { ACL_CSN }]; #IO_L12P_T1_MRCC_15 Sch=acl_csn
#set_property -dict { PACKAGE_PIN B13 IOSTANDARD LVCMOS33 } [get_ports { ACL_INT[1] }]; #IO_L2P_T0_AD8P_15 Sch=acl_int[1]
#set_property -dict { PACKAGE_PIN C16 IOSTANDARD LVCMOS33 } [get_ports { ACL_INT[2] }]; #IO_L20P_T3_A20_15 Sch=acl_int[2]
##Temperature Sensor
#set_property -dict { PACKAGE_PIN C14 IOSTANDARD LVCMOS33 } [get_ports { TMP_SCL }]; #IO_L1N_T0_AD0N_15 Sch=tmp_scl
#set_property -dict { PACKAGE_PIN C15 IOSTANDARD LVCMOS33 } [get_ports { TMP_SDA }]; #IO_L12N_T1_MRCC_15 Sch=tmp_sda
#set_property -dict { PACKAGE_PIN D13 IOSTANDARD LVCMOS33 } [get_ports { TMP_INT }]; #IO_L6N_T0_VREF_15 Sch=tmp_int
#set_property -dict { PACKAGE_PIN B14 IOSTANDARD LVCMOS33 } [get_ports { TMP_CT }]; #IO_L2N_T0_AD8N_15 Sch=tmp_ct
##Omnidirectional Microphone
#set_property -dict { PACKAGE_PIN J5 IOSTANDARD LVCMOS33 } [get_ports { M_CLK }]; #IO_25_35 Sch=m_clk
#set_property -dict { PACKAGE_PIN H5 IOSTANDARD LVCMOS33 } [get_ports { M_DATA }]; #IO_L24N_T3_35 Sch=m_data
#set_property -dict { PACKAGE_PIN F5 IOSTANDARD LVCMOS33 } [get_ports { M_LRSEL }]; #IO_0_35 Sch=m_lrsel
##PWM Audio Amplifier
#set_property -dict { PACKAGE_PIN A11 IOSTANDARD LVCMOS33 } [get_ports { AUD_PWM }]; #IO_L4N_T0_15 Sch=aud_pwm
#set_property -dict { PACKAGE_PIN D12 IOSTANDARD LVCMOS33 } [get_ports { AUD_SD }]; #IO_L6P_T0_15 Sch=aud_sd
##USB-RS232 Interface
#set_property -dict { PACKAGE_PIN C4 IOSTANDARD LVCMOS33 } [get_ports { UART_TXD_IN }]; #IO_L7P_T1_AD6P_35 Sch=uart_txd_in
#set_property -dict { PACKAGE_PIN D4 IOSTANDARD LVCMOS33 } [get_ports { UART_RXD_OUT }]; #IO_L11N_T1_SRCC_35 Sch=uart_rxd_out
#set_property -dict { PACKAGE_PIN D3 IOSTANDARD LVCMOS33 } [get_ports { UART_CTS }]; #IO_L12N_T1_MRCC_35 Sch=uart_cts
#set_property -dict { PACKAGE_PIN E5 IOSTANDARD LVCMOS33 } [get_ports { UART_RTS }]; #IO_L5N_T0_AD13N_35 Sch=uart_rts
##USB HID (PS/2)
#set_property -dict { PACKAGE_PIN F4 IOSTANDARD LVCMOS33 } [get_ports { PS2_CLK }]; #IO_L13P_T2_MRCC_35 Sch=ps2_clk
#set_property -dict { PACKAGE_PIN B2 IOSTANDARD LVCMOS33 } [get_ports { PS2_DATA }]; #IO_L10N_T1_AD15N_35 Sch=ps2_data
##SMSC Ethernet PHY
#set_property -dict { PACKAGE_PIN C9 IOSTANDARD LVCMOS33 } [get_ports { ETH_MDC }]; #IO_L11P_T1_SRCC_16 Sch=eth_mdc
#set_property -dict { PACKAGE_PIN A9 IOSTANDARD LVCMOS33 } [get_ports { ETH_MDIO }]; #IO_L14N_T2_SRCC_16 Sch=eth_mdio
#set_property -dict { PACKAGE_PIN B3 IOSTANDARD LVCMOS33 } [get_ports { ETH_RSTN }]; #IO_L10P_T1_AD15P_35 Sch=eth_rstn
#set_property -dict { PACKAGE_PIN D9 IOSTANDARD LVCMOS33 } [get_ports { ETH_CRSDV }]; #IO_L6N_T0_VREF_16 Sch=eth_crsdv
#set_property -dict { PACKAGE_PIN C10 IOSTANDARD LVCMOS33 } [get_ports { ETH_RXERR }]; #IO_L13N_T2_MRCC_16 Sch=eth_rxerr
#set_property -dict { PACKAGE_PIN C11 IOSTANDARD LVCMOS33 } [get_ports { ETH_RXD[0] }]; #IO_L13P_T2_MRCC_16 Sch=eth_rxd[0]
#set_property -dict { PACKAGE_PIN D10 IOSTANDARD LVCMOS33 } [get_ports { ETH_RXD[1] }]; #IO_L19N_T3_VREF_16 Sch=eth_rxd[1]
#set_property -dict { PACKAGE_PIN B9 IOSTANDARD LVCMOS33 } [get_ports { ETH_TXEN }]; #IO_L11N_T1_SRCC_16 Sch=eth_txen
#set_property -dict { PACKAGE_PIN A10 IOSTANDARD LVCMOS33 } [get_ports { ETH_TXD[0] }]; #IO_L14P_T2_SRCC_16 Sch=eth_txd[0]
#set_property -dict { PACKAGE_PIN A8 IOSTANDARD LVCMOS33 } [get_ports { ETH_TXD[1] }]; #IO_L12N_T1_MRCC_16 Sch=eth_txd[1]
#set_property -dict { PACKAGE_PIN D5 IOSTANDARD LVCMOS33 } [get_ports { ETH_REFCLK }]; #IO_L11P_T1_SRCC_35 Sch=eth_refclk
#set_property -dict { PACKAGE_PIN B8 IOSTANDARD LVCMOS33 } [get_ports { ETH_INTN }]; #IO_L12P_T1_MRCC_16 Sch=eth_intn
##Quad SPI Flash
#set_property -dict { PACKAGE_PIN K17 IOSTANDARD LVCMOS33 } [get_ports { QSPI_DQ[0] }]; #IO_L1P_T0_D00_MOSI_14 Sch=qspi_dq[0]
#set_property -dict { PACKAGE_PIN K18 IOSTANDARD LVCMOS33 } [get_ports { QSPI_DQ[1] }]; #IO_L1N_T0_D01_DIN_14 Sch=qspi_dq[1]
#set_property -dict { PACKAGE_PIN L14 IOSTANDARD LVCMOS33 } [get_ports { QSPI_DQ[2] }]; #IO_L2P_T0_D02_14 Sch=qspi_dq[2]
#set_property -dict { PACKAGE_PIN M14 IOSTANDARD LVCMOS33 } [get_ports { QSPI_DQ[3] }]; #IO_L2N_T0_D03_14 Sch=qspi_dq[3]
#set_property -dict { PACKAGE_PIN L13 IOSTANDARD LVCMOS33 } [get_ports { QSPI_CSN }]; #IO_L6P_T0_FCS_B_14 Sch=qspi_csn
File added
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment