1、UUDIV无符号数除法器
- 基于FPGA的除法器原理介绍及设计实现
- FPGA除法器设计实现
- Verilog 除法器设计
2、FIR 滤波器
- Verilog 串行 FIR 滤波器设计
- Verilog 并行 FIR 滤波器设计
3、CORDIC
- 基于FPGA的CORDIC算法实现——Verilog版
- cordic算法的verilog实现及modelsim仿真
- Verilog实现Cordic算法
- cordic算法原理及verilog实现
4、FFT 快速傅里叶变换
- Verilog FFT 设计
- FFT原理及verilog实现
- https://github.com/DexWen/FFT_Verilog
5、CRC 循环冗余校验码
- CRC算法的硬件电路实现:串行电路和并行电路
- 基于FPGA 的CRC校验码生成器
- 实现串并数据CRC校验的四种Verilog
6、CSC RGB与 YUV色彩空间转换
- FPGA丨RGB转Ycbcr算法实现
7、Dither 抖动算法
- 视频处理算法——Dither
- 就以ZYNQ开发板为例,板子上有一个
PHY
芯片,它相当于物理层,我们的MAC
模块需要和该芯片连接。MAC
和PHY
之间的连接有一定的接口标准,比如MII/RMII/GMII/RGMII
接口。后者会将从MAC
模块接受到的信号做一定的转换,然后通过如RJ45
设备接口将信号发送到接收端。 - 接收端的
RJ45
接口也会将接收到的数据做一定转换,然后发送到自己端的PHY
芯片,然后PHY
将信号再通过MII/RMII/GMII/RGMII
接口发送给自己端的MAC
芯片。MAC
芯片会对接收到的信号进行解析,获取发送端想要传输的信号!!! - 其实这两端是对称的,数据也可以反过来传输。如果使用FPGA,那么FPGA端
MAC
模块就需要我们使用硬件描述语言去设计,它要有打包、发送/接收以及解析数据包的能力!!! - 如果需要使用
UDP
协议或者ARP
协议,那就在MAC
层的上一层添加即可,将UDP
帧和ARP
帧作为MAC
帧的数据段进行传输。
一些IP核自带xdc
文件,该约束文件也会起作用,所以如果该约束文件里已经有了相关约束,那么在整个工程的xdc
文件中就不需要设置约束了。
其实引脚约束就是将FPGA芯片的引脚和你代码里定义的信号连接起来,这样你的代码对信号的高低电平控制也会使绑定的物理引脚的电平高低变化,这样信号就引了出来,从而驱动和物理引脚连接的模块。
所以无论是板子上其他的板载芯片,还是相对于板子的外设,第一步我们都需要先将物理引脚和它们相连,然后使用约束文件将被控制模块所需的信号和物理引脚绑定到一块。
在第一步里,需要分两种情况:
- 如果是其他的板载芯片,那么FPGA芯片和它们之间其实已经连接好了;
- 如果是外设,我们就需要考虑使用哪些引脚来驱动以及手动实现物理连接;
无论是一些问题的解答,还是官方的各种文档,都可以到官方的技术支持页面去搜索。对于各类文档,不仅可以直接搜索,也可以按照下面的导航去查找。
1、Pmod接口
Pmod
上的引脚也是直连芯片的,我们可以将它们作为普通IO使用,根据需要进行正确的引脚绑定即可!!! 2、FMC接口
FMC
也是扩展接口,可以根据需要进行引脚绑定!!!
可参考:FPGA开发板中的FMC中信号定义
3、协议接口
没有已经安排在BANK
上的待绑定SPI、IIC、以及JTAG引脚
,如果需要,可以使用其他未做特殊用途的引脚使用,比如上述的FMC和PMOD
。
之前一直以为Xilinx SDK
只是在使用ZYNQ
的时候才会用到,不过后来明白了,只要是你创建了一个SOC
,不管是软核(MicroBlaze
,使用FPGA的逻辑资源就可以搭建,不需要硬核处理器)还是硬核(zynq 的 ARM A9 处理器
),都可以导出硬件,然后在SDK上写应用程序。
以一个串口环回实验为例!!! 借这个图重点说一个细节:(以genesys2开发板为例)
从图中可以看出,上位机的tx、rx
端分别和fpga
的rx、tx
端连接。RTL代码是要下载到fpga
中的,也即它是以fpga
为中心写的逻辑,那么代码里的tx、rx
就是指的fpga
的tx、rx
。
如果你是使用microUSB
进行串口通信,那么上图中的上位机的tx
和rx
就是下图中的usb转串芯片
的信号输出和输入引脚,也就是下图中的TXD、RXD
。所以我们需要将下图中的TXD、RXD
分别连接到芯片的rx、tx
,但是一定要注意芯片的rx、tx
到底是哪一个引脚,不能搞错了。
就拿上面两张图来说,这里
usb转串芯片
的RXD
引脚写的是UART_RX_OUT(Y23)
,我一开始也以为这就是芯片的rx
引脚,在约束文件中也有如下内容: set_property -dict {PACKAGE_PIN Y23 IOSTANDARD LVCMOS33} [get_ports uart_rxd] set_property -dict {PACKAGE_PIN Y20 IOSTANDARD LVCMOS33} [get_ports uart_txd] 所以我就直接把代码中的rx、tx
分别绑定到了Y23、Y20
,正常来说,这是没有问题的,因为约束文件中的引脚就是指的fpga
芯片的引脚,不用交叉连接。
但是上面也说了,RXD
其实是usb转串芯片
的接收端口,也就是上位机的rx
,并不是fpga
的rx
,所以导致我在上板实验时串口通信失败,并且一直找不到原因。我之所以会弄错,是因为引脚旁的信号名写的是UART_RX_OUT
,我并没有看到还有个OUT;还有就是官方给的约束文件中也是把UART_RX_OUT(Y23)
这个信号连接到了uart_rxd
,这就导致我弄反了引脚。 所以,Y23
其实是上位机的rx
,它需要连接到fpga
的tx
,也就是代码中的tx
,rx
同理!!!我们只需要把约束文件中的引脚绑定反过来即可,如下所示: set_property -dict {PACKAGE_PIN Y20 IOSTANDARD LVCMOS33} [get_ports uart_rxd] set_property -dict {PACKAGE_PIN Y23 IOSTANDARD LVCMOS33} [get_ports uart_txd] 这里的uart_rxd、uart_txd
对应的就是代码中的input接收端
和output发送端
!!!如下所示:
所以,当你发现自己串口通信始终不成功时,一定要记得看一下tx和rx引脚有没有绑定反!!!