FPGA series # 前期小知识点

整理以前的笔记,知识点记录。

  • DSP芯片的内部采用程序和数据分开的哈弗结构,具有专门的硬件乘法器,可以用来快速地实现各种数字信号处理算法。
      哈弗(Harvard)结构是一种存储器并行体系结构,主要特点是将程序和数据存储在不同的存储空间中,即程序存储器和数据存储器是两个独立的存储器,每个存储器独立编址,独立访问。CPU首先到程序指令存储器中读取程序指令内容,解码后得到数据地址,再到相应对的数据存储器中读取数据,并进行下一步操作(通常是执行)。
      程序指令存储和数据存储分开,可以使指令和数据有不同的数据宽度。
  • Localparam里面的参数计算是计算机算,不是放FPGA里算,这里叫做硬参。
      软参是拉进input里面,在上板运行时可以改的。
  • ARM系列
    ARM7、ARM9、ARM9E、ARM10E、ARM11、Cortex、SecurCore、OptimoDE Data Engines、Intel的Xscale、Intel的StrongARM11系列。
    Cortex系列处理器是基于ARMv7架构的
    Cortex-M:Cortex-M0、Cortex-M0+、Cortex-M3、Cortex-M4
    Cortex-R:R4、R5、R7
    Cortex-A:A5、A7、A8、A9、A15、A50
  • 递归:程序调用自身,即一个函数调用本身。
    迭代:利用已知的变量值,根据递推公式不断演进得到变量新值。
      从直观上讲,递归是将大问题化为相同结构的小问题,从待求解的问题出发,一直分解到已知答案的最小问题为止,然后再逐级返回,从而得到大问题的解。而迭代是从已知值出发,通过递推式,不断更新变量新值,一直到能够解决要求的问题为止。
  • FFT:Fast Fourier Transformation 离散傅氏变换(DFT)的快速算法,即快速傅氏变换。就是将系数表示法转化为点值表示法相乘,再由点值表示法转化为系数表示法的过程,第一个过程叫求值(DFT),第二个过程叫插值(IDFT)。一种时域和频域之间的转换。
      一个模拟信号,经过ADC采样(模拟信号经过A/D转换变为数字信号的过程称为采样)后就变成了数字信号,根据采样定理,采样频率要大于信号频率的两倍。采样得到的数字信号,就可以做FFT变换了。N个采样点,经过FFT后,就可以得到N个点的FFT结果。
      假设采样频率为fs,采样点数为N,那么FFT结果就是一个N点的复数,每一个点就对应着一个频率点,某一点n(n从1开始)表示的频率为:fn=(n-1)*fs/N
      举例说明:用1kHZ的采样频率采样128点,则FFT结果的128个数据即对应的频率点分别是:0,1k/128,2k/128,… …,127k/128。频率点的幅值为:该点复数的模值除以N/2。(n=1时是直流分量,其幅值是该点的模值除以N)
      N点FFT从左到右共有log2N级蝶形,每级有N/2L组,每组有L个。
      关于FFT知乎上有一篇很好的讲解:

https://zhuanlan.zhihu.com/p/19763358?utm_source=wechat_timeline&utm_medium=social&utm_oi=690668085673222144&from=timeline

FFT是离散傅立叶变换的快速算法,可以将一个信号变换 到频域。有些信号在时域上是很难看出什么特征的,但是如 果变换到频域之后,就很容易看出特征了。这就是很多信号 分析采用FFT变换的原因。另外,FFT可以将一个信号的频谱 提取出来,这在频谱分析方面也是经常用的。
  近年来为了进一步加速CNN在FPGA上的运算速度,人们开始利用一些快速算法来降低卷积操作中的乘法数量,并将这些算法部署到FPGA上,如FFT算法,Winograd算法。
  快速算法主要分为三个步骤:
  ① 首先将输入图像与卷积核转换到特殊域(如,在FFT算法中将图像先转换到频域);
  ② 接下来将转换后的数据进行点对点相乘;
  ③ 最后将相乘的结果逆变换回时域。

  • 头文件:使用< >:表示引用标准库头文件,编译器会从系统配置的库环境中去找。
        使用“ ”:一般表示引用用户自定义的头文件,编译器默认会从当前文件夹中寻找,如果找不到,则到系统默认库环境中寻找。
  • HLS进行开发的流程分三步:
    ① 首先在Vivado HLS工具中将C/C++转换成RTL代码并打包成IP核
    ② 然后在Vivado IP中将HLS IP核与ZYNQ的PS集成在一起
    ③ 最后在SDk中编写驱动完成整个设计
      在这个流程中开发者需要根据应用特点选择合适的接口,合适的DMA,每一次调整都要先在HLS中调整,然后在Vivado中更新IP,操作流程十分繁琐。
      SDSoC替开发者完成后两项工作,需要一些约束条件,这些约束条件以SDS Pragma的形式给出。
  • SDS Pragma根是否与数据传输相关可以分成两类:
      ① 第一类SDS Pragma决定了算法加速IP连接到PS的哪个端口,调到哪种类型的Data mover,在DDR中的内存如何分配,包括SDS
      data copy/zero_copy,
      data access_pattern,
      data mem_attribute,
      data sys_port 和 data_mover
      这些指令可以形成不同的组合,不同的组合最终实现的数据传输性能差距很大。
      ② 第二类SDS Pragma包括SDS async/wait,partition,buffer_depth,resource以及trace,这类指令的功能各异,使用频率也不高。
  • SoC:即CPU+FPGA的模式,通过CPU上的操作系统来调度FPGA的运行,这种架构可以使FPGA加速器和CPU能通过片上总线进行紧耦合,从而提高数据带宽,提高执行效率,减少加速器的调度代价。
      在软硬件划分时,在FPGA内部实现主要的网络运算过程;在ARM处理器上对输入图片和每层参数进行预加载和分配,并对FPGA的初始阶段进行控制。
  • SDRAM从发展到现在已经经历了五代,分别是:
    SDR SDRAM;
    DDR SDRAM;
    DDR2 SDRAM;
    DDR3 SDRAM;
    DDR4 SDRAM
      第一代SDRAM采用单端(single-ended)时钟信号,内存用时钟频率命名,如PC100,PC133则表明时钟信号为100MHz或133MHz。数据读写速率也为100MHz或133MHz。(Hz指的是线缆的频率带宽,代表的是单位时间内线路中电信号的震荡次数)。
      第二、三、四代DDR(Double Data Rate)内存则采用数据读写速率作为命名标准,并在前面加上一个数字表示其DDR代数的符号。如PC-2700是DDR-333,其工作频率是333/2=166MHz,2700表示带宽为2.7GB/s。DDR3从DDR3-800到DDR3-1600。

很早以前做的一些小知识点汇总,放上来防丢失:
  1. 写代码养成好习惯,主要是代码风格和代码思路。比如matlab代码,习惯以%%符号来分区以%注释明确每一分区或者一行所做的事情或是代码思路。可以将写的代码前面以function xxx开头,类似于封装成函数,以便以后调用。平时用不着的时候就以%%分区,用%注释掉。新建的代码文件都要在开始加上这几行语句:close all;%关闭之前生成的图像,clear; %清空workspace变量,clc; %清空命令行窗口。而写verilog代码时,要清楚verilog是并行思维且每一行代码代表一个电路,有硬件思维。
  2. Verilog里一般不声明输出类型的话,一般默认是wire型的,如果想在输出处寄存一下,比如使用always时序语句,则必须声明为reg型。Wire仅仅是线,不能赋值。
  3. 有些语句是不可以综合的,具体在使用时可参考百度。
  4. 要关注使能所起的作用,首先对自身端口的影响,其次对其他端口的影响。
  5. 不要急着下手码代码,先理清逻辑,各部分互相牵制的地方,可以画张草图,把该模块的思路理清楚。比如gamma模块与前后模块的联系,哪些必要的端口,画一个基本的输入输出图。
  6. 复位是个很重要的信号。Resetn表示电平为低时复位,为高时有效(n表示否)。注意复位信号是高时有效还是为低时有效。
  7. IP核输入可以是wire或reg,但输出一定是reg。
  8. 在仿真里发现错误往回追源的时候可以用scope里的层级,分析有问题的信号是哪个模块里的哪个部分。并在源代码里选中变量,F3上下查找。
  9. 硬件语言更多的考虑时间问题,比如两个reg之间的时间,一块语句运算的时间不能超过一拍,否则数据可能无效。这里涉及到建立时间保持时间的概念,简单来说,建立时间指在时钟沿到来之前数据从不稳定到稳定所需要的时间。如果建立的时间不满足要求,那么数据将不能在这个时钟上升沿被稳定打入触发器。保持时间是指数据稳定后保持的时间,如果保持的时间不满足要求,那么数据同样也不能被稳定地打入触发器。
  10.Matlab里检查bug要逐级往上检查,用plot(); max(max()); size(); 等等这种函数来检查。
  11.Matlab中,imshow显示的图片格式其内容都是整数型的。
  12.Verilog中#的用法——参数传递,传递的参数是子模块中定义的parameter。以及parameter和 localparameter的区别,parameter可用作在顶层模块中例化底层模块时传递参数的接口,localpara meter的作用域仅限于当前module,不能作为参数传递的接口。
  13.异步时钟信号不能在同一个IP核中使用。
  14.在查看IP核时,旁边的红色标志表示锁住,选择tools→report→report_IP staus upgrade。但IP catalog内有该IP核,若没有则需由加载。
  15.在一个设计开始就要考虑到低电平或高电平复位、同步或异步复位、上升沿或下降沿触发等问 题,在所有模块中都要遵守它。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值