![](https://img-blog.csdnimg.cn/20201014180756738.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
FPGA
文章平均质量分 65
以FPGA为开发平台
FPGA硅农
数字IC设计,FPGA开发
展开
-
约束综合中的逻辑互斥时钟(Logically Exclusive Clocks)
逻辑互斥时钟是指设计中活跃(activate)但不彼此影响的时钟。常见的情况是,两个时钟作为一个多路选择器的输入,并根据sel信号决定哪一个时钟被激活。一个处理逻辑互斥时钟的重要指导思想就是逻辑互斥时钟不应该在mux以外的地方发生交互。如上图所示,设计中共有两个时钟,分别是CLKA和CLKB,两个时钟是多路选择的,某一时刻,只有一个时钟对电路起作用。一种约束的方法是使用约束,即假定SEL恒为0或者1,然后进行时序分析。flop-1发起时钟flop-2捕获时钟CLKACLKACLKBCLKA。原创 2023-08-13 19:12:37 · 848 阅读 · 0 评论 -
基于FPGA的VGG16卷积神经网络加速器
VGG在2014年由牛津大学Visual GeometryGroup提出,获得该年lmageNet竞赛中Localization Task(定位任务)第一名和 Classification Task (分类任务)第二名。与AlexNet相比,VGG使用了3个3x3卷积核来代替7x7卷积核,使用了2个3x3卷积核来代替5x5卷积核,从而在保证具有相同感知野的条件下,提升了网络的深度,在一定程度上提升了神经网络的效果。原创 2023-05-12 10:21:25 · 4461 阅读 · 1 评论 -
UVM仿真环境搭建
本实验使用环境为:Win10平台下的Modelsim SE-64 2019.2。原创 2023-02-25 20:30:30 · 2911 阅读 · 1 评论 -
【数字IC/FPGA】小数分频
由于Verilog只能在时钟的上升沿或者下降沿改变电路的状态,因此精确的小数分频是无法通过Verilog实现的,我们只能实现的小数分频,即某段时间内,该时钟的周期平均为TT为小数)。我们以8.6分频为例,来阐述小数分频的实现方法。T8.6对应于MN(即M8N6),另一方面,T也可以表示为TMabb将M通分至分母ab,则TMaM1bab这里我们发现组成小数分频使用了a个M分频和b个M1分频的整数分频电路。上述方法被称作”原创 2023-02-06 23:09:01 · 1914 阅读 · 0 评论 -
vivado tcl开发流程
本文以简单的led灯为例,阐述基于tcl的Vivado开发流程。原创 2022-12-12 16:13:20 · 1886 阅读 · 2 评论 -
System Verilog断言
断言通常被称为序列监视器或者序列检验器,是对设计应当如何执行特定行为的描述,是一种嵌入设计检查。如果检查的属性(property)不是我们期望的表现,那么在我们期望事件序列的故障上会产生警告或者错误提示。断言用来检查模拟序列行为或者激励生成的正确性,断言作为功能验证的一种重要手段,可以脱离测试用例而覆盖测试点,所以断言覆盖率可以是功能覆盖率的一部分,完善的断言能为全面的功能覆盖率尺度打下良好的基础。断言两个重要的时间点:采样时刻和匹配时刻,断言在 preponed 域采样,在observed 域执行检查原创 2022-12-06 10:38:21 · 2657 阅读 · 1 评论 -
AXI VDMA回环测试
vdma回环测试该硬件系统的数据流向为:DDR–>AXI VDMA–>AXI DATA FIFO–>AXI VDMA–>DDR即将一幅图像由一段地址空间搬运至另一段地址空间。其中,AXI VDMA配置如下:地址位宽32,缓存3帧,读写通道的配置如上图所示。写通道Fsync Options选择s2mm tuser,读通道选择None,即保持默认。AXI4-Stream DATA FIFO配置如下:此外,为了更直观地感受整个数据传输过程,我们还在硬件系统中加入了ILA,以实时抓原创 2022-12-05 20:04:02 · 2431 阅读 · 4 评论 -
xilinx hls实现sobel检测
hls实现sobel边缘检测原创 2022-12-05 13:02:42 · 1083 阅读 · 0 评论 -
Zynq PL端中断实验
在PL端设计两个IP核,具有中断功能。在PS端调用这两个IP核,IP核1计算完成后,如果其调用次数小于10,则继续调用,否则结束运行,IP核2每次计算完成后,如果其调用次数小于5,则继续调用,否则结束运行。...原创 2022-08-17 09:24:56 · 1684 阅读 · 0 评论 -
FIR滤波器的Verilog实现
FIR滤波器是非递归型滤波器的简称,又叫有限长单位冲激响应滤波器。带有常系数的FIR滤波器是一种LTI(线性时不变)数字滤波器。冲激响应是有限的意味着在滤波器中没有发反馈。长度为N的FIR输出对应于输入时间序列x(n)的关系由一种有限卷积和的形式给出,具体形式如下:y(n)=Σk=0N−1h(k)×x(n−k)y(n)=\Sigma_{k=0}^{N-1}h(k)\times x(n-k)y(n)=Σk=0N−1h(k)×x(n−k)其运算过程可以采用如下图所示的流程:设计部分(采用移位寄存器+并行原创 2022-07-13 09:23:14 · 6534 阅读 · 3 评论 -
单比特跨时钟域--握手
单比特跨时钟域握手代码分析:当需要发送数据时,发送方拉高req信号并一直保持,接收方对req信号进行同步,并检测上升沿,之后,发送方将req_sync_d2同步回去,并在检测到ack_sync_d2信号为高时,拉低req信号,至此,握手过程结束。从图中可以看出,第二次req信号拉高必须在上一次的req信号拉低后进行,否则两次发送将会发生重叠,从而丢失数据。...原创 2022-06-16 15:45:22 · 468 阅读 · 0 评论 -
Vivado HLS INT8/9乘法优化
在HLS设计中,有时候1个DSP往往可以计算两个INT8或者INT9乘法,下面是一个DSP计算两个INT9乘法的代码实现:设计文件头文件测试文件结果综合后结果可以看到,我们的的确确实现了1个DSP计算两个INT9乘法的效果(必须有一个乘数是共享的)......原创 2022-06-06 15:15:58 · 674 阅读 · 0 评论 -
时序违例的解决方法
时序违例可以分为两种情况,分别为建立时间违例和保持时间违例建立时间违例降低频率时钟频率定的太高,导致Tcycle太小,使得不满足建立时间要求。当然最简单的就是降低时钟频率,但是一般一个电路架构定下来的时候为了满足速度与吞吐率的要求,频率一般不允许有太大的改动。提升工艺那就是工艺定的实在不合适,基本cell延时很大,可以换更先进的工艺。上面两种可能性在实际真正的项目里面发生的可能不大,因为一般项目实际编码之前,架构师对工艺与频率都是评估过的。实际让我们工程师去解决的问题就是由于两级寄存器之间的组原创 2022-05-26 14:16:16 · 5704 阅读 · 0 评论 -
Xilinx BRAM IP介绍
BRAM IP核介绍BRAM简介BRAM类型三种读写模式写优先读优先No change总线支持输出寄存BRAM简介BRAM,即Block RAM,是FPGA中一种重要的存储资源,另一种常见的存储资源是DRAM(Distributed RAM),Distributed RAM 经过综合工具综合,通过多级 LUT 查找表资源级联实现,因此会消耗较多的逻辑资源。而是BRAM是FPGA 厂商在逻辑资源之外,给 FPGA 加入的专用 RAM 块资源。相比分布式 RAM,BRAM 块内部以及与逻辑资源之间经过特意原创 2022-04-30 12:36:52 · 4048 阅读 · 0 评论 -
【FPGA/数字IC】UART、IIC和SPI总线介绍
UARTUART(通用异步接收发送器):也就是我们通常所说的串口,主要用于调试。UART的主机和从机,至少需要三根线,分别是RX,TX和GND,其中TX用于发送数据,RX用于接收数据,因此是全双工的UART协议也很简单,主要包括空闲位,起始位,数据位,奇偶校验位和停止位,空闲位为高电平,表示当前无数据传输,起始位为一个一位的低电平信号,数据位一般是5,6,7,8位,由双方事先约定好,然后是奇偶校验位,用于数据出错的检测,但由于出错的概率很小,因此现在一般都不需要,最后停止位是一位的高电平信号。SPI原创 2022-04-26 21:17:08 · 2851 阅读 · 2 评论 -
RISC-V CPU设计(三)---多周期CPU的设计与实现
基本情况本多周期CPU支持RV32I指令集(fence,ecall,ebreak除外),已通过部分指令的测试,如代码有bug,欢迎指出。模块划分代码将CPU划分为以下几个模块:1.控制单元:ControlUnit用于产生控制信号,是CPU的大脑,指挥中枢。2.分支决策单元:BranchUnit用于决定B型指令是否发生跳转3.立即数单元:ImmUnit用于从指令中解析出立即数.4.寄存器堆:RegisterFileRISC-V的32个寄存器,其中x0寄存器恒为0,不可更改。5.指令存储原创 2022-03-18 10:16:12 · 4830 阅读 · 2 评论 -
【数字IC/FPGA】UART的Verilog实现
UART通用异步收发器(Universal Asynchronous Receiver/Transmitter,UART)可以和各种标准串行接口,如RS 232和RS 485等进行全双工异步通信,具有传输距离远、成本低、可靠性高等优点。一般UART由专用芯片如8250,16450来实现,但专用芯片引脚都较多,内含许多辅助功能,在实际使用时往往只需要用到UART的基本功能,使用专用芯片会造成资源浪费和成本提高。UART只需要两条信号线:RXD和TXD,其中RXD是UART的接收端,TXD是UART的发送端原创 2022-03-16 08:58:43 · 5366 阅读 · 3 评论 -
RISC-V CPU设计(二)---数据通路
本文讲述五级流水线RISC-V CPU数据通路,我们采用的是如下图所示的架构R型指令的数据通路IF阶段根据PCF读取指令,并将PCF和读取到的指令寄存到IF2ID段寄存器:PCD<=PCFInstr<=IM[PCF]ID阶段根据Instr生成控制信号,在R型指令中,用到的有:MemToRegD:(写入寄存器的数是否来自MEM,R型指令该信号为0,即写入寄存器的数据并非来自MEM)。AluControlD[3:0]:用于指示ALU进行何种操作。AluSrc1D:第一个源操作数原创 2022-03-11 14:48:08 · 2300 阅读 · 0 评论 -
RISC-V CPU设计(一)---RV32I指令集介绍
RV32I是RISC-V最基本的指令集,包括6种,其中4种为核心的类型(R/I/S/U)。下面给出了这6种指令的格式指令详情如下R型指令包含两个源寄存器和一个目的寄存器编号,都是5位的(32个寄存器),指令的执行过程较为简单:Reg[rd]=Reg[rs1] op Reg[rs2]I型指令I型指令分为三类,分别为寄存器-立即数型、LOAD型和JALR型,下面分别作一介绍寄存器-立即数型比如ADDI指令,执行的操作为Reg[rd]=Reg[rs1] op ImmLOAD型包括LW,L原创 2022-03-11 11:18:58 · 2901 阅读 · 0 评论 -
【数字IC/FPGA】线性反馈移位寄存器
线性反馈移位寄存器LFSR用于产生可重复的伪随机序列PRBS,该电路有n级触发器和一些异或门组成,如下图所示。它和移位寄存器最大的区别就是他有反馈。其中,gng_ngn为反馈系数,取值只能为0或1,取为0时表明不存在该反馈之路,取为1时表明存在该反馈之路;这里的反馈系数决定了产生随机数的算法的不同。用反馈函数表示成y=a0x0+a1x+a2x2.......y=a_0x^0+a_1x+a_2x^2.......y=a0x0+a1x+a2x2.......反馈函数为线性的叫线性移位反馈序列,否则原创 2022-03-10 10:30:00 · 1599 阅读 · 0 评论 -
FIFO实现位宽转换
之前在博客中实现了位宽相同的同步FIFO,然而,实际的应用场景往往更加复杂,它不仅需要FIFO实现先入先出的功能,有时候还需要实现数据位宽的转换,本文就介绍了如何通过Verilog实现一个具有位宽转换功能的同步FIFO。写数据低位宽,读数据高位宽在这种情况下,需要写入RDATA_WIDTH/WDATA_WIDTH个数据,才能读出一个数据,相应的RTL代码如下(主要设置了一个wr_cnt计数器):`timescale 1ns / 1ps/////////////////////////////////原创 2022-03-01 10:45:00 · 5923 阅读 · 3 评论 -
基于FPGA的Yolov4 tiny目标检测网络加速器
简介之前实现了基于FPGA的Winograd CNN加速器(VGG16)和基于FPGA的MobileNet v2加速器,但这两个算法在本质上区别不大:一个是VGG16,另一个是轻量级的MobileNet v2,所实现的功能都是图像分类。因此,为了尝试更多的应用,本文在FPGA上实现了一个目标检测网络----Yolov4 tiny。yolo4 tiny的结构是YOLOv4的精简版,属于轻量化模型,参数只有600万相当于原来的十分之一,这类网络不仅能实现对图像的分类任务,还可以找出目标的位置,因此,更加贴近实原创 2022-02-27 16:47:54 · 27687 阅读 · 66 评论 -
基于System Verilog的序列检测器
本文通过system verilog,实现了一个10010序列检测器状态机设计状态机是数字电路设计中一个十分重要的概念,许多复杂的控制都可以通过状态机完成,本文要实现的10010序列检测器,同样也可以通过状态机来实现。下面是状态机设计的思路:S0表示当前检测到的序列为0,如果检测到1,则转换到S1,否则保持原状态不变;S1表示当前检测到的序列为1,如果检测到1,则保持状态不变,如果检测到0,则跳到状态S2;S2表示当前检测的序列为10,如果检测到1,则跳转到S1,否则跳转至S3;S3表示当前检原创 2022-02-24 10:45:00 · 641 阅读 · 0 评论 -
跨时钟域处理(三)---握手
在跨时钟域(一)中,我们介绍了打两拍的方法,尽管这个方法可以有效处理单bit跨时钟域信号的亚稳态问题,但是当发送方的时钟比接收方的时钟快时,有可能出现信号有效时间过段,接收方采样不到的情况。握手就是解决这一问题的有效方法,同时,握手还可以解决多bit跨时钟域信号的同步。本文就对该方法作一介绍。同步握手同一时钟控制下的握手过程比较简单,这里以著名的AXI4协议为例,如下图所示发送方要发送数据的时候,就拉高VALID信号,同时把要发送的数据放到数据总线上,接受方看到VALID信号为高,并且自己也有时间接原创 2022-02-22 22:29:48 · 6780 阅读 · 0 评论 -
基于System verilog的异步FIFO实现
异步FIFO读写分别采用相互异步的不同时钟。在现代集成电路芯片中,随着设计规模的不断扩大,一个系统中往往含有数个时钟,多时钟域带来的一个问题就是,如何设计异步时钟之间的接口电路。异步FIFO是这个问题的一种简便、快捷的解决方案,使用异步FIFO可以在两个不同时钟系统之间快速而方便地传输实时数据。异步FIFO设计中,最重要的就是满和空信号的设计,具体的思路就是通过读写指针的比较,来生成相应的full或者empty信号,在之前同步FIFO的设计中已经讲到了这一判断方法,即:在指针中添加一个额外的位(extr原创 2022-02-22 14:17:15 · 1718 阅读 · 2 评论 -
基于System verilog的同步FIFO实现(二)
上一篇博客基于System verilog的同步FIFO实现(一)通过设置一个计数器,来判断FIFO的空或满状态,该方法由于多设置了一个计数器,因此会产生额外的资源,当fifo比较大时,会降低fifo最终可以达到的速度。本文则通过另一种方式生成full与empty信号:比较读指针和写指针。判断方法:1.当FIFO复位之后,读指针和写指针的都指向第0个位置,此时FIFO为空;2.当写指针绕了一圈又追上读指针后,即wr_ptr=rd_ptr,此时FIFO为满;3.当读指针也绕了一圈追上写指针后,即wr原创 2022-02-22 11:50:35 · 1203 阅读 · 0 评论 -
基于System Verilog的同步FIFO实现(一)
FIFO,全称First In First Out,它是数字电路设计中一个重要的基本单元,它分为同步FIFO和异步FIFO,所谓同步FIFO,是指读写都是在同一个时钟的驱动下进行的,而异步FIFO读写操作的时钟是分离的,本文主要讲述同步FIFO的实现。如图,是同步FIFO的一个示意图,它由clk,rst,wr_en,rd_en,full,empty,rdata,wdata等信号构成,其中,full,empty用于指示fifo的状态(空或满),wr_en,rd_en分别为写使能和读使能信号,在FIFO的设原创 2022-02-22 01:23:53 · 2964 阅读 · 0 评论 -
FPGA奇数分频的实现
在FPGA开发中,我们往往需要对时钟进行分频,得到满足我们需求的时钟频率。尽管这些分频的工作完全可以由PLL等ip核完成,但通过verilog语言同样也可以实现。在本博客中,我们仅讨论整数倍分频。偶数倍分频偶数倍分频的实现较为简单,一般是设置一个计数器,从0开始计数,达到N-1后又重新归零,分频的时钟信号在(N/2-1)时翻转。奇数倍分频三分频分别设置两个模3计数器cnt1,cnt2,以及两个中间信号clk1,clk2,clk1信号在clk信号的上升沿且cnt1=0或2的时候翻转,而clk2信号在原创 2022-02-07 13:29:08 · 1742 阅读 · 2 评论 -
CNN加速器中的NC4HW4内存排布格式
传统的存储格式(NCHW和NHWC)在卷积神经网络(CNN)中,特征图是一个4维的张量,分别为batch维度N,通道维度C,特征图高H和特征图宽W,在不同的深度学习框架中,特征图也有着不同的存储格式,例如NCHW和NHWC,两者的区别就是通道所在的维度不同,在不同的情况下,这两种存储格式都有各自的优点,下图即为两种存储格式的示意图。在使用FPGA设计加速器时,由于FPGA的片上BRAM资源十分有限,无法一次性容纳所有的特征图数据,因此往往会采取分片的策略,即对于一个C×H×WC \times H \t原创 2022-02-02 21:01:39 · 3050 阅读 · 0 评论 -
DDR3 MIG IP核仿真与学习
MIG IP核介绍在Xilinx系列的FPGA中,为了方便用户对DDR进行读写,官方提供了用于访问DDR的IP核MIG,全称为Memory Interface Generator,具体可参考赛灵思官方文档参考手册:ug586(7 Series Devices Memory Interface Solutions v4.1)。下图是MIG IP核的架构,从图中可以看出,MIG主要有面向用户的端口和面向DDR的端口,用户通过使用MIG能够通过用户端口的信号,来完成对DDR SDRAM的访问,达到简化操作的目的原创 2022-01-03 19:49:02 · 5021 阅读 · 6 评论 -
Xilinx IDDR与ODDR原语的使用
IDDR原语如图所示,IDDR原语的输入输出包括D,CE,C,S,R,Q1,Q2,其中,D为输入的双倍速率的数据,即D在时钟的上升沿和下降沿都会发生切换,一个时钟周期发送2bit数据,CE为时钟使能信号,C为时钟信号,S,R为复位和置位信号,Q1,Q2为单倍速率的输出数据。IDDR主要有三种工作模式,分别是:OPPOSITE_EDGE, SAME_EDGE,SAME_EDGE_PIPELINED 。下面分别作一介绍:1.OPPOSITE_EDGE在该模式下,上升沿采样到的数据(如DOA)和下降原创 2021-12-26 20:26:10 · 11587 阅读 · 0 评论 -
FPGA并串转换的实现
介绍随着电子行业技术的发展,特别是在传输接口的发展上,IEEE1284被 USB 接口取代,PATA被 SATA 取代,PCI被 PCI-Express 所取代,无一不证明了传统并行接口的速度已经达到一个瓶颈了,取而代之的是速度更快的串行接口,于是原本用于光纤通信的SerDes 技术成为了为高速串行接口的主流。串行接口主要应用了差分信号传输技术,具有功耗低、抗干扰强,速度快的特点,理论上串行接口的最高传输速率可达到10Gbps 以上。因此,串并/并串转换在FPGA设计中具有重要意义。方法一:Xilinx原创 2021-12-24 20:35:04 · 5375 阅读 · 0 评论 -
CRC循环冗余校验码的Verilog实现
原理见博客设计文件:`timescale 1ns / 1ps//////////////////////////////////////////////////////////////////////////////////// Company: // Engineer: // // Create Date: 2021/12/23 14:32:17// Design Name: // Module Name: crc// Project Name: // Target Devic原创 2021-12-23 15:38:06 · 733 阅读 · 0 评论 -
Zynq使用math.h函数库
问题:在Zynq的开发过程中,有时候可能会用到math.h等库,然而,简单的#include<math.h>在编译时会报错:undefined reference to ***解决方法:1.右键工程,选择C/C++ Build Settings2.按照1,2,3,4操作3.在弹出的窗口中输入m(表示math库),点击ok,并应用4.再次编译,发现编译过程不报错:...原创 2021-12-12 09:47:12 · 1762 阅读 · 0 评论 -
基于FPGA的Winograd CNN加速器
Winograd算法winograd算法,它的本质就是通过减少卷积运算中的乘法,来减少计算量。我们以3x3,s=1的卷积为例,讲讲Winograd算法的具体流程。一个r×sr\times sr×s的卷积核,和一个输入特征图进行卷积运算,得到m×nm\times nm×n的输出,我们记为:F(m×n,r×s)F(m\times n,r\times s)F(m×n,r×s)其计算量为μ(F(m×n,r×s))=(m+r−1)∗(n+s−1)\mu (F(m\times n,r\times s))=(m原创 2021-11-24 10:34:11 · 6031 阅读 · 2 评论 -
Xilinx HLS实现AXI DMA
在本文中,我们将通过HLS自己动手实现一个AXI DMA,仿照的是官方AXI DMA IP核的直接模式,即给定发送起始地址和发送长度,以及接收起始地址和接收长度,就能进行一次DMA传输。HLS设计代码如下dma.cpp#include"dma.h"void axi_dma(data_t* axi_rd,data_t* axi_wr,hls::stream<data_t> axis_mm2s,hls::stream<data_t> axis_s2mm, int原创 2021-09-09 14:13:45 · 1776 阅读 · 1 评论 -
基于FPGA的MobileNet V2卷积神经网络加速器
MobileNet V2介绍MobileNetV2是在V1基础之上的改进。V1主要思想就是深度可分离卷积。而V2则在V1的基础上,引入了Linear Bottleneck 和 Inverted Residuals。下图是MobileNet V2中的一个基本模块可以看到,该模块由三个卷积组成,第一第三个卷积是标准的1x1卷积,起到升维和降维的作用,而中间的是一个depthwise卷积,每一个卷积层之后,都紧接着一个BN层,以加速网络的收敛。同时,我们观察到,该模块的输入和输出有一个残差连接,即输入和最原创 2021-09-08 21:15:58 · 10036 阅读 · 30 评论 -
Vivado HLS中多端口数组的RTL建模
在加速器的设计中,由于FPGA片上存储资源(BRAM)有限,因此我们需要对输入数据进行分片,每次加载一块数据到片上缓存,然后进行计算,在使用HLS进行设计的时候,这三个缓存往往具有以下形式:输入特征缓存InBuffer[Tn][R][C],并且为了能在一个时钟周期内访问多个数据,我们还会对数组的第一个维度进行array_partition操作,对应到实际的电路,其实就是多个BRAM,从而提供多个数据读写的端口。权重缓存WeightBuffer[Tm][Tn][K][K],同样,为了能在一个时钟周期内原创 2021-08-05 22:50:35 · 859 阅读 · 0 评论 -
Vivado FFT IP核学习
FFT IP核配置1.点击ip catalog,输入FFT,选择FFT IP核,打开如下界面进行配置:2.点击implementation,进行如下配置3.点击detailed implementation,可进一步配置4.查看配置完的情况以及IP核例化编写如下代码`timescale 1ns / 1ps//////////////////////////////////////////////////////////////////////////////////// Compa原创 2021-07-30 14:25:08 · 1939 阅读 · 1 评论 -
基于System Verilog的8点FFT实现
我们采用system verilog实现一个8点的基于蝶形运算单元的FFT变换,如下图,是蝶形运算单元的示意图。然后,由于FFT涉及复数运算,因此,我们编写如下复数类型以及运算符的一个包:`timescale 1ns / 1ps//////////////////////////////////////////////////////////////////////////////////// Company: // Engineer: // // Create Date: 2021原创 2021-07-22 14:10:30 · 2178 阅读 · 2 评论