龙骑士 的blog

Xilinx加法器IP核adder

1.加法器IP核配置

2.adder_top.v代码
`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
//
// Create Date: 10:20:30 07/19/2017
// Design Name:
// Module Name: adder_top
// Project Name:
// Target Devices:
// Tool versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//

Xilinx FPGA设计代码风格

Xilinx FPGA设计代码风格 以后逐渐补充

1、时钟信号的分配策略
(1)、使用全局时钟可以为信号提供最短的延时和可以忽略的扭曲;
(2)、FPGA特别适合于同步电路的设计,尽可能减少使用始终信号的种类;
(3)、减少时钟摆率的一种有效方法是使用一个时钟信号生成多个时钟使能信号,分别驱动触发器的时钟使能端,也就是说让所有的触发器都在同一个使能的控制下,只有使能打开的时候,所有触发器才可以装入数据;
(4)、避免时钟信号产生毛刺,所以要采用时序逻辑,尽量避免组合逻辑。

2、使用SRL16移位寄存器,很灵活的配置

3、尽量多的使用触发器资源,比如状态编码时使用独热码。

4、信号的反相处理
(1)、如果输入信号需要反相,则要尽可能的调用输入带反相功能的符号,而不是使用分离的反相器来进行反相
(2)、如果一个信号反相后驱动了多个负载,则应该将反相这个功能分散到各个负载中去实现。因为在FPGA中集中反相然后驱动多个负载往往会多占用一个逻辑块,而且延时也增加了;分散信号的反相可以与其它逻辑在同一单元内完成而不消耗额外的逻辑资源。

2、如何提高电路工作频率

verilog 实现IIC

verilog 实现IIC协议算是一个简单的IP核,本来是挂在AXI总线上,可以通过microblaze对其进行配置。最近在弄ADV7511,用到IIC来配置它.直接上代码:
module iic_drive(
input clk,
input reset_n,

// 与控制器通信信号
input [31:0] slv_reg0,
input [31:0] slv_reg1,
input [31:0] slv_reg2,
input [31:0] slv_reg3,
input [31:0] slv_reg4,
output reg [ 7:0] iic_rddb,
output iic_busy,

// 外部信号
output iic_scl,
input iic_sda_in,
output sda_dir,
output sda_r
);

// SCL 分频系数
// 产生IIC时钟 100M/20K = 5000
parameter SCL_SUM = 13'd5000;

// 仿真时

ZYNQ-ZedBoard USB HOST问题初探

在用Vivado (2015.4.2)在ZedBoard上搭建如图所示的PS最小系统时,USB-OTG无法正常使用且在启动LOG中报错。

经过与原厂的各个启动文件进行对比替换,最后确定是Vivado工程生成的bit流出了问题。也就是说建立的工程不对。

USB 启动错误提示信息:外置PHY芯片初始化失败,载入模块失败。
ehci_hcd: USB 2.0 'Enhanced' Host Controller (EHCI) Driver
usbcore: registered new interface driver usb-storage
usbcore: registered new interface driver usbserial
usbcore: registered new interface driver usbserial_generic
usbserial: USB Serial support registered for generic

Vivado 和 matlab 联合生成算法模块代码

FPGA的一大应用就是数字信号处理(DSP),尤其是大数据量高速处理的场合,比如雷达,成像,超声等领域。但是直接用Verilog实现DSP算法,是一件很费时费力的事情,而且改动也不是很方便。目前有几种折中的办法,一是用HLS,大概的思路就是用C/C++先编写算法,然后转译为Verilog语言;另一种就是用MATLAB等工具,直接生成Verilog代码。

步骤如下:

首先,关联MATLAB和Vivado

在【开始】菜单,找到配置工具,打开

选择MATLAB路径

注意到 R2015a 目录 即可。

打开MATLAB2015,新建一个simulink模型

Xilinx千兆以太网与万兆以太网IP接口

说明:对于IP核输出数据的解析最好的工具就是其自带的仿真文件,里面既将接收的数据进行了解析,又将发送给IP核的数据进行了封装,这对于了解数据结构和协议是十分有帮助的,以太网如此,pcie、ram、fifo等其它IP也如此,我们只需将ip自带的仿真文件改为我们自己的逻辑即可,接口连接并不变。

1.对于千兆以太网的IP核接口,无需过多说明,因输出的数据是8bit,且根据valid、last、ready这三个信号可以很好的控制,然后将接收到的数据按照需要的位宽进行拼接给下级模块(或写进fifo)使用,或者将下级模块发送过来的数据(或从fifo读取)按照8bit位宽输进ip。对于其它接口,我们只需设置好相应固定值即可,因这些接口与我们自己的逻辑并无关联。

2.对于万兆以太网IP核接口
1)采用64bit位宽时,数据在时钟上升沿采样,8字节并行传输,对应字节编号0-7;
2)采用32bit位宽(即DDR模式)时,在时钟的上升沿与下降沿均进行采样,在编号4-7字节的数据发送或接收完成以后,再对0-3字节的数据进行传输;

搭建Zedboard交叉编译环境

关于搭建zedboard的编译环境这个话题我也有点无奈了,开发的过程中遇到电脑出故障,虚拟机损坏等问题,为了避免再次繁琐的去搜索别人的配置命令,我还是自己写一个吧,留作笔记。

配置环境:

vm虚拟机:VMware Workstation 12 Player

Ubuntu操作系统:ubuntu-16.04.1-desktop-amd64.iso

1.第一步:虚拟机上安装Ubuntu 64bit操作系统

这一步我们就省略了,比较都是下一步,下一步就可以完成的。

2.第二步:安装编译器依赖库

在Xilinx Wiki网站(http://wiki.xilinx.com/zynq-tools)下载Sourcery CodeBench,由于这个环境是为32-bit系统设计的,64-bit系统的用户需要先安装部分32-bit库,在Ubuntu终端中进入root权限,输入下面命令:
sudo su
apt-get install ia32-libs ia32-libs-gtk

但有可能会出错,根据提示信息输入下面的命令:
apt-get install lib32ncurses5 lib32z1

安装完成后,接着输入命令:
dpkg-reconfigure dash

Xilinx Serdes时钟纠正clock correction

1、时钟纠正原理
时钟纠正比较简单,下面一个图就能说清楚。
首先为什么要使用时钟纠正,是因为CDR恢复的用户时钟user_clk和硬核时钟XCLK虽然频率一样,但是会有略微的不同,正是这样导致内部的FIFO有可能读空和写满,这样就会导致传输错误。与其传输出错误,不如我们就发送一个特定的序列让它去“出错”。在FIFO快满的时丢弃这个序列,在FIFO快读空时加入这个序列。由于收发双方约定好了这个序列是什么,这样可以避免出错。

2、设置buff大小
即设置最小延迟和最大延迟,buff中的内容在小于或大于这两个值时就会插入或删除特定的CC序列。设置最小延迟要求如下表。(IP核里面不用设置这个,因为提供了PPM offset核CC序列发送的周期,IP核会自己计算出来,真是智能!)

Xilinx Serdes通道绑定channel bonding

1、通道绑定原理

通道绑定只支持8b10b编码协议,通道绑定利用内部的FIFO来抵消通道间的延时差,原理如下图

master channel 和slave channel都有特定的字节,可以是K码。当master 检测到K码时,进行一个计数,slave检测到K码同样会计数。等master 计数到sequence max_skew时,通过移动指针消除前面的延时。

2、通道间的级联

下面是两个级联的例子

Xilinx 高速收发器Serdes深入研究

一、为什么要用Serdes

传统的源同步传输,时钟和数据分离。在速率比较低时(<1000M),没有问题。

在速率越来越高时,这样会有问题

由于传输线的时延不一致和抖动存在,接收端不能正确的采样数据,对不准眼图中点。
然后就想到了从数据里面恢复出时钟去采样数据,即CDR

这样就不存在延迟不一致的情况,有轻微的抖动也不会影响采样(恢复的时钟会随着数据一起抖动)。

同步内容