![](https://img-blog.csdnimg.cn/20200921183512593.jpg?x-oss-process=image/resize,m_fixed,h_224,w_224)
FPGA/Vivado学习笔记
文章平均质量分 64
FPGA学习笔记!!!
耐心的小黑
七月份就上班了,比较忙!
展开
-
基于Vivado MIG IP核的DDR3读写实验(top_rom_ddr/ddr_top)
一、前言关于Vivado MIG IP核详细配置可以参考我之前的文章:基于Vivado MIG IP核的DDR3控制器(DDR3_CONTROL)关于MIG IP核的用户端的接口时序可以参考这篇文章:XILINX 的 MIG IP(非AXI4)接口时序以及控制二、实验内容本次实验的内容主要是通过MIG IP核向DDR3读写数据,DDR3的接口时序由ddr_top模块提供:ddr_top模块的数据来源是wr_fifo,wr_fifo的数据实际来自top_sd_photo模块(本实验仿真原创 2021-10-27 12:11:09 · 2519 阅读 · 4 评论 -
FPGA 16bit 串口发送程序设计
一、前言在之前的一篇文章—FPGA UART串口通信实现 中,已经介绍过了串口通信的基础知识。你可能会发现,串口发送的一帧中数据位只能为5、6、7、8 位,也就是一次最多发送8bit的数据。最近在做一个项目,需要将图像数据保存到本地。想法是先将到来的图像数据写入RAM中,然后再读出来并用串口发送出去,串口调试助手一般都可以保存接收的数据到本地,这样就可以将图像数据保存到本地了。但是我的图像数据是16位的,我需要保存全部bit,不能截断后直接使用8bit串口发送的程序,所以就干脆利用状态机设计一个16bi原创 2021-09-10 12:19:37 · 1684 阅读 · 1 评论 -
基于Vivado MIG IP核的DDR3控制器(DDR3_CONTROL)
一、前言由于DDR3的控制时序相当复杂,为了方便用户开发DDR3的读写应用程序,Xilinx官方就提供了一个MIG(Memory Interface Generator) IP核,它可以为用户生成一个DDR3控制器。该控制器结构如下:它提供了用户接口(左侧),内部会将用户接口接收到的时序转换成DDR3所需的真正时序,并通过物理端(右侧)的接口连接到DDR3。由于用户接口的时序比较简单,因此该控制器就隐藏了极其复杂的DDR3的控制时序,让用户只需要按照用户端的时序来操作就可以对DDR3进行相应的读写。原创 2021-09-20 16:54:45 · 7698 阅读 · 3 评论 -
为什么要选择FPGA加速AI计算?
为什么微软选择了FPGA? 因为微软和Google是两种不同的基因,Google喜欢尝试新技术,所以自然要用TPU去追求最高的性能。但是,微软是一家商业文化很重的公司,选择一个方案看的是性价比和商业价值。做专用芯片尽管很炫,但是是否真的值得? ...原创 2020-03-14 18:14:01 · 2244 阅读 · 0 评论 -
FPGA VGA图片显示(vga_top)
以下内容来自正点原子的FPGA开发指南,觉得讲的不错,就搬了过来。一、VGA简介传送门:VGA介绍二、实验内容使用开拓者开发板上的VGA接口在显示器的屏幕中心位置显示彩色图片。显示分辨率为640*480,刷新速率为60hz,图片的大小为100 * 100。三、程序设计图 21.4.1是根据本章实验任务画出的系统框图。其中,时钟分频模块负责产生像素时钟,VGA驱动模块产生行场同步信号及像素点的纵横坐标,VGA显示模块输出图像数据,ROM用于存 储需要显示的图片。VGA显示模块中的ROM是通过例原创 2021-01-27 18:27:32 · 2391 阅读 · 10 评论 -
FPGA 读取SD卡图片数据(top_sd_photo)
以下内容来自正点原子的FPGA开发指南,觉得讲的不错,就搬了过来。一、SD卡介绍传送门:https://blog.csdn.net/qq_39507748/article/details/113195336初始化以及读写操作的流程文章中也有说到。二、实验内容使用FPGA开发板向SD卡指定的扇区地址中写入512个字节的数据,写完后将数据读出,并验证数据是否正确。三、程序设计SD卡初始化、写操作以及读操作是相互独立且不能同时进行的,因此我们可以将SD卡的初始化、写操作以及读操作分别划分为三个独立的原创 2021-01-28 08:57:59 · 4590 阅读 · 2 评论 -
Vivado FPGA代码固化流程(以genesys2为例)
第一步:先综合,然后打开综合设计第二步:点击Tools—Edit Device Properties(注意,必须按照第一步打开综合后的设计,才能找到这个选项),然后配置相应参数。可以选择压缩bit流,这样后面固化时会快一些。选择合适的固化速率,可以适当设置高一些(默认是3MHZ),因为固化本身比较慢;设置SPI 的bus width,因为flash使用的是QSPI,也即SPI4x(后面还会设置此参数),所以这里要设置为4。选择编程模式,因为我们是将程序固化到flash中,以后上电自动从fla原创 2021-04-23 22:23:32 · 4858 阅读 · 4 评论 -
Vivado中Debug操作方式总结(ILA)
Vivado中提供了多种Debug的操作方式,下面就来总结一下:方式一:代码中例化ILA IP核需要探测多少个信号,信号的位宽是多少,直接选择即可:下面界面可以选择探测信号宽度以及触发方式:方式二:通过网表标记综合后生成网表,在网表中设置Debug:Mark Debug或者在综合后的原理图中Mark Debug,这和网表debug是一致的:在标记Debug后,就等于选择了需要debug的信号,之后在综合设置里设置Debug参数即可:选择需要Debug的信号,设置时钟域以及触发方式转载 2021-04-21 11:35:15 · 6541 阅读 · 0 评论 -
FPGA 中差分时钟的使用
一、前言很多FPGA的板载时钟(板载晶振提供)不是普通的单端时钟信号,而是差分时钟信号,比如我正在使用的genesys2开发板。此时我们就不能像使用普通时钟信号一样直接使用差分时钟信号,而是需要使用IBUFGDS(xilinx 原语)或者PLL将差分信号转换成单端信号。PLL之所以也可以用来将差分时钟转换成单端时钟,是因为我们可以设置其输入时钟的source为Differential clock capable pin,也即告诉PLL输入时钟差分时钟。其实PLL也是在自己内部调用IBUFGDS来实现信原创 2021-04-20 17:24:38 · 16955 阅读 · 4 评论 -
Vivado报错:[DRC REQP-1712] Input clock driver: Unsupported PLLE2_ADV connectivity.
一、报错内容[DRC REQP-1712] Input clock driver: Unsupported PLLE2_ADV connectivity. The signal clk_50m_gen/inst/clk_in on the clk_50m_gen/inst/plle2_adv_inst/CLKIN1 pin of clk_50m_gen/inst/plle2_adv_inst with COMPENSATION mode ZHOLD must be driven by a clock原创 2021-04-20 16:03:32 · 10835 阅读 · 8 评论 -
vivado cordic IP核实现开方运算
一、前言在FPGA上进行开方运算,除了可以自己写开方算法,如上一篇文章:verilog 整数开方算法实现(逐次逼近法)。还有一种更加简单的方式就是直接调用IP核,下面就使用Xilinx官方提供的cordic IP核来实现开方运算。二、IP核配置三、程序设计module square( input clk, input rst_n, input data_in_valid, input [15:0] data_in, output data_out_val原创 2021-04-09 09:32:11 · 9524 阅读 · 7 评论 -
FPGA中的bank含义
可编程输入/输出单元简称I/O单元,是芯片与外界电路的接口部分,完成不同电气特性下对输入/输出信号的驱动与匹配要求。FPGA内的I/O按组分类,每组都能够独立地支持不同的I/O标准。通过软件的灵活配置,可适配不同的电气标准与I/O物理特性,可以调整驱动电流的大小,可以改变上、下拉电阻。为了便于管理和适应多种电器标准,FPGA的IOB被划分为若干个组(bank),每个bank的接口标准由其接口电压VCCO决定,一个bank只能有一种VCCO,但不同bank的VCCO可以不同。只有相同电气标准的端口才能连接转载 2021-04-05 19:17:35 · 16426 阅读 · 1 评论 -
Vivado 报错:[Place 30-574] Poor placement for routing between an IO pin and BUFG.
一、报错原因[Place 30-574] Poor placement for routing between an IO pin and BUFG. If this sub optimal condition is acceptable for this design, you may use the CLOCK_DEDICATED_ROUTE constraint in the .xdc file to demote this message to a WARNING. However, the原创 2021-04-05 09:26:29 · 22875 阅读 · 3 评论 -
FPGA 频率计实验
参考:正点原子开拓者 FPGA 开发指南数字频率计是一种基本的测量仪器,被广泛应用于航天、电子、测控等领域。基于传统测频原理的频率计的测量精度将随被测信号频率的下降而降低,在使用中有较大的局限性,而等精度频率计不但具有较高的测量精度,而且在整个频率区域能保持恒定的测试精度。一、等精度频率计简介频率测量在电子设计和测量领域中经常用到,因此对频率测量方法的研究在实际工程应用中具有重要意义。常用的频率测量方法有两种:周期测量法和频率测量法。周期测量法是先测量出被测信号的周期T,然后根据频率f = 1/T原创 2020-11-01 11:27:44 · 7262 阅读 · 5 评论 -
FPGA 动态数码管显示实验
参考:正点原子开拓者 FPGA 开发指南一、数码管动态显示简介由于一般的静态驱动操作虽然方便,但占用的I/0口较多,例如要驱动6位8段数码管,以静态驱动方式让数码管各个位显示不同的数值,如“123456”,需要占用6 × 8 = 48个I/O口,虽然对于FPGA这种I/O口较多的芯片而言,在资源允许的情况下可以使用,但一般不建议浪费宝贵的I/O口资源,尤其在I/O口资源紧张的情况下,所以对于多位数码管一般采用动态驱动方式使数码管显示数字。那么什么是动态驱动方式呢?为了更好的理解数码管动态驱动,我们首先原创 2020-10-31 22:17:00 · 13704 阅读 · 1 评论 -
FPGA 按键控制LED灯亮灭切换实验
一、实验内容有四个按键,分别控制四个LED灯的亮灭切换。二、实验说明1、代码中,使用位宽为4的key_h作为输入,分别连接着四个按键,也即每一位的高低对应着按键的松按。使用位宽为4的led作为输出,分别连接着四个LED,也即每一位的高低对应控制LED的亮灭切换。2、采集按键状态的时候,采用了这篇文章:FPGA中按键消抖的三种方案 中的方案二来对按键进行消抖。3、在检测下降沿的时候,使用(前一拍数据)&(后一拍数据取反)的方式进行检测。若结果为1,则说明检测到了下降沿。三、代码解析1、R原创 2020-10-22 23:01:07 · 8125 阅读 · 4 评论 -
Vivado PLL IP核的使用
一、PLL IP核配置当我们需要用到分频或者倍频的时候,就需要使用Vivado中的 PLL IP核来获得我们想要的时钟频率。下面简单说明一下如何配置PLL IP核。1、查找 PLL IP核2、指定用于分频的输入频率3、设置输出频率、相位以及占空比4、设置locked信号的名字Locked信号是用来观察pll输出时钟是否和输入时钟锁定。当锁定时,这个Locked信号就变为高电平。5、如果需要,可以在此对之前的设置进行修改并覆盖详细还可以参考这篇文章:https://blog.csd原创 2020-10-22 19:13:30 · 22287 阅读 · 0 评论 -
Vivado ROM IP核的使用
一、ROM IP核配置ROM 要比之前说的RAM简单的多,因为它只有读数据的端口,没有写数据的端口。不过还是可以配置成单端口或者双端口,这里的双端口指的都是读数据的端口。因为比较简单,这里就不做过多介绍,下面是我本次实验的ROM IP核的配置情况:1、查找 ROM IP核可以看到,其实和之前的RAM是一样的。2、选择单口ROM3、设置数据位宽和深度4、初始化ROM这里使用的是coe文件,文件内容如下:MEMORY_INITIALIZATION_RADIX=16; //表示原创 2020-10-22 17:14:09 · 13281 阅读 · 6 评论 -
Vivado FIFO IP核的使用
一、Vivado FIFO IP核介绍可以参考这篇文章,很详细:https://blog.csdn.net/weixin_42151221/article/details/103410556下面是我的FIFO IP核的配置情况:1、选择异步FIFO2、设置写数据和读数据的位宽以及深度3、可以设置是否需要Almost Full Flag 或者 Almost Empty Flag4、设置读写计数二、实例该实例实现的功能是:分别以100MHZ和75MHZ的写读时钟进行写读FIFO,当然这原创 2020-10-22 16:37:49 · 10796 阅读 · 11 评论 -
Vivado 双口RAM IP核的使用
一、双口RAM介绍双口RAM(dual port RAM)在异构系统中应用广泛,通过双口RAM,不同硬件架构的芯片可以实现数据的交互,从而实现通信。例如,一般情况下,ARM与DSP之间的通信,可以利用双口RAM实现,ARM通过EBI总线连接到双口RAM的A口,DSP通过EMIF总线(也可以是uPP总线,取决于速度需求)连接到双口RAM的B口,两者对同一块存储区域进行操作,即可实现两者的数据交互。但是,因为双口RAM的A口和B口都可以对相同的内存地址进行操作,这就引出了一个问题—假如通信双方在两个端口对同原创 2020-10-22 11:33:12 · 11791 阅读 · 2 评论