judyzhong 的blog

参考资料:xilinx大学计划
实验平台:ZYBO开发板

本次实验要做的是一个基于FPGA的简单图像处理程序, 共实现两个功能:
1.输出一个灰度图像的直方图。
2.将一个曝光不足的图像进行处理,使其对比度更大。

一、Vivado HLS 部分

首先我们用Vivado HLS来编写FPGA图像处理所用的IP核。

1.绘制直方图

1.首先编写相应的C/C++语言程序,加入到Vivado HLS工程中,再编写相应的testbench代码进行编译测试。


代码很简单大家看一下就明白了。

注意到右侧Directive窗口中的优化部分,分别表示doHist的输出接口使用AXI4-lite传输协议,inStream图像输入接口采用AXI4协议,输入数组histo存入bram中,loop_init循环进行展开。

2.点击Run C Simulation进行对C/C++源文件进行编译测试。

几种常见的ROM,RAM初始化文件格式

一、coe格式
Xilin ROM的初始化文件,ISE初始化ROM的时候要用扩展名为coe的文件。其格式如下:
MEMORY_INITIALIZATION_TADIX=2; //2表示数据是二进制格式,也可以是8,10,16
MEMORT_INITIALITION_VECTOR=
01110100,
00100000,
11110101,
……

二、bin格式
bin格式是纯数据本身,不包含任何地址信息,烧写或下载时通常需要制定地址。

三、intel hex格式

记录格式
  Intel HEX由任意数量的十六进制记录组成。每个记录包含5个域,它们按以下格式排列:
  :llaaaatt[dd…]cc
  每一组字母对应一个不同的域,每一个字母对应一个十六进制编码的数字。每一个域由至少两个十六进制编码数字组成,它们构成一个字节,就像以下描述的那样:
  : 每个Intel HEX记录都由冒号开头.
  ll 是数据长度域,它代表记录当中数据字节(dd…)的数量.
  aaaa 是地址域,它代表记录当中数据的起始地址.
  tt 是代表HEX记录类型的域,它可能是以下数据当中的一个:

GPIO Product Guide笔记(Xilinx)

GPIO是通用并行IO接口的简称。他将总线信号转化为IO设备要求的信号类型,实现地址译码输出数据,锁定输入数据缓冲的功能。GPIO控制器的基本结构如图1所示。

总线接口模块实现地址译码,并将特定总线信号转化为内部总线;中断逻辑模块,根据中断控制以及中断产生条件产生中断请求信号。输入/输出控制模块将内部总线信号转化为基本的输入/输出引线,并实现输出数据锁定,输入数据暂存的功能。

一、SCCB介绍

SCCB是OmniVision Serial Camera Control Bus的简称,即OV公司的串行摄像机控制总线。OV公司定义的SCCB是一个3线结构,但是,为了缩减Sensor的pin封装,SCCB大多采用2线方式。

开始传输数据

结束数据传输

传输规则
一个基本传输单元称作一个相
一个相包含总共9比特,前8比特为数据,第9比特为 Don't-Care bit 不关心比特,该第9比特的数据取决于
传输任务是读还是写。一个传输任务的最大相个数是3

Vivado HLS 设计优化

在使用高层次综合,创造高质量的RTL设计时,一个重要部分就是对C代码进行优化。Vivado Hls总是试图最小化loop和function的latency,为了实现这一点,它在loop和function上并行执行尽可能多的操作。比如说,在function级别上,高级综合总是试图并行执行function。

除了这些自动优化,directive是用来:
(1) 并行执行多个tasks,例如,同一个function的多次执行或同一loop的多次迭代。这是流水线结构。
(2) 调整数组的物理实现((block RAM),函数,循环和端口,以提高数据的可用性,并帮助数据流更快地通过设计。
(3) 提供关于数据dependency的信息,或者缺乏数据dependency,允许执行更多的优化。最终的优化是修改C源代码,以消除在代码中意外的dependency,但是这可能会限制硬件的性能。

本文使用的sample设计是一个matrix multiplier函数。目标是在每一个时钟周期处理一个新的sample,并实现数据流接口。

优化matrix multiplier

solution1

Vivado HLS学习笔记(三)

参考资料:Xilinx大学计划

已经看了几天的Vivado和Vivado HLS的使用流程了,已经对整个Xilinx FPGA的开发流程有了一点初步的了解。下面就来简单的介绍一下。

HLS开发流程

1.打开Vivado HLS

1.建立Vivado HLS工程文件
建立工程文件的部分就不赘述了。只要选择对你所开发的FPGA开发板就好。
2.编写源文件与Test Bench测试文件
3.分别在Source和Test Bench目录下添加你所编写的C/C++文件。

6.点击Run C Synthesis对多编写的C/C++文件进行高级综合的编译。随后会输出高级综合之后所估计的资源使用情况和端口信息等等,同时会生成verilog文件,但是大多这些verilog文件都是不可读的。

2.打开Vivado

ZYNQ 片内pin Delay导入Allegro

最近设计一款产品的时候,需要用到zynq7015,在参考picozed的设计的时候,他们的原理图中有这样一句话,如下图所示

明确说DDR设计的时候需要考虑片内延时,当时问过专业layout的朋友,他们告诉我这个一般是别人提供的,你只需要导入就可以了。只导入也简单,可这数据从哪里来,没有人能告诉我,问过安富利的FAE他们也没有告诉我哪里有,于是和朋友讨论这个问题,也在手册里面到处找,最后在UG586中看到这样一段

哈哈,赶紧打开Vivado

petalinux(一)自动登录及启动配置

最近开始使用zynq7020开发产品,使用的了petalinux创建系统的确很方便,但创建的系统每次都要人工登录,查看相关文档实现自动登录步骤如下:

1、创建自动登录的APP ,调用命令如下:
#petalinux-create -t apps --name autologin --enable

2、切换到APP目录
#cd
/components/apps/autologin

3、修改APP内容(autologin.c)如下:
#include
#include
int main()
{
execlp( "login", "login", "-f", "root", 0);
}

4、修改Makefile,将install部分修改如下:
$(TARGETINST) -d -p 0755 autologin /etc/init.d/autologin
$(TARGETINST) -s /etc/init.d/autologin /etc/rc5.d/S99autologin

5、重新编译即可

Vivado中异步FIFO的实现和使用

FIFO应用:
1、在千兆以太网数据写入,往DDR3里面写数据时候
2、AD采样时钟和内部时钟不同时,需要FIFO进行转换
3、同频异相时也需要用FIFO进行转换

Vivado中FIFO generator的配置方法

1、

2、standard FIFO
read mode读取时会延迟一个周期时钟,first word fall through
read mode 读取时没有延时时钟周期,给使能就有数据,read latency=0。

3、

时钟无缝切换

时钟切换分成两种方式,普通切换和去毛刺无缝切换。

普通切换,就是不关心切出的时钟是否存在毛刺,这种方式电路成本小。如果时钟切换时,使用此时钟的模块电路处于非工作状态,或者模块内电路被全局复位信号reset住的,即使切出毛刺也不会导致DFF误触发,这样的模块可以选择用此种切换方式。

写法很简单assign clk_o = sel_clkb ? clkb : clka ,当sel_clkb为 1 时选择clkb,否则选择clka。不过在实际设计中,建议直接调用库里的MUX单元set_dont_touch,不要采用这里的assign写法,因为这种写法最后综合得到的可能不是MUX而是复杂组合逻辑,给前后端流程的时钟约束和分析带来不便。

同步内容