System Generator

本文是该系列的第22篇。上一篇介绍了使用Image From File和Video Viewer完成图像的采集和输出,并将两部分分别打包为子系统,使其具有通用性。本文将介绍如何使用Simulink提供的回调函数机制,实现从MATLAB工作空间采集和输出图像。

Simulink回调函数机制
在空白处右键->Model Properties,切换到“Callbacks”标签下,可以看到Simulink支持的回调函数,这些函数在某些时刻会自动触发,执行M文件中的程序:

点击每个函数,可以在右边看到该函数的触发时刻;右边的编辑框中输入执行的M文件的名称。M文件与slx文件在同一目录下。

System Generator设计
数据流方法完成图像的采集与输出,其实就是从MATLAB的工作空间中导入图像数据,再将结果导出到工作空间。按下图连接model:

本文是该系列的第21篇。前几篇介绍的音频信号处理本质上属于一维信号,直接采样与输出即可。但图像属于二维信号,如果想在Simulink中采集和输出图像,进行图像处理算法的仿真时会遇到一些问题。本文将介绍如何搭建图像的采集与输出模型。

采集图像需要解决的问题

Computer Vision System Toolbox中包含两个模块:Image From File可以读取图片格式的文件;Video Viewer可以输入图像并显示(类似于Scope观察信号波形一样)。

但是Image From File一次读出的便是完整的图片信息,是一个向量形式,而Gateway In只能接收标量数据的输入(即单个数据)。如果将两者直接相连,会出现如下错误:

Image From File读取一个256*256大小的图像,读出数据为一个256*256*3的数据(RGB三个通道),这个数据不能直接输入到FPGA中。我们需要利用Simulink提供的功能丰富的block完成数据之间的转换。

一、前言

  利用FPGA设计算法一直以来都是热点,同样也是难点。将复杂的数学公式 模型通过硬件系统来搭建,在低延时 高并行性等优势背后极大提高了设计难度和开发周期。Xilinx公司的sysGen(system generator)工具扩展了MATLAB的simulink,提供很多IP Catalog中没有的基础模块和针对DSP应用的硬件模型。工程师利用丰富的模块和MATLAB强大的数据处理及可视化能力能够更快速完成设计与仿真验证工作。

二、sysGen算法系统设计

  本文以个最简单的例子讲述利用sysGen搭建算法IP核,并集成到IP Integrator中作为ZYNQ PS端CPU的“定制外设”。仅用于测试目的。设计需求:在sysGen中搭建系统,将输入定点整数数据*2后输出,输入位宽为8bit。

本文是该系列的第20篇。数字水印是一种将标识信息嵌入到载体当中,且不影响载体使用的一种技术,主要分为时域水印嵌入算法(将水印嵌入到时域采样数据中)和变换域水印嵌入算法(先对音频做变换,将水印嵌入到变换域系数中)。本文将介绍一种简单的时域水印嵌入算法——LSB算法。

LSB算法

通常数字水印技术有不可感知性的要求,即嵌入数字水印后载体数据发生了变化,但是不会影响到该数据的使用,对使用者而言也不可察觉。

该算法将水印信息嵌入到数据的最低有效位(Least Significant Bit)部分,即将数据的LSB替换为需要加入的水印信息。这正是因为低位数据对整体数据的影响最小,这也导致嵌入的水印信息强度不高,否则会影响到载体的数据质量。因此该算法仅限用于脆弱性数字水印(相较于鲁棒性数字水印而言,无法承受大量失真)。

System Generator设计

该算法的实现很简单,在Simulink中添加block按下图连接:

本文是该系列的第19篇。语音编码压缩的目的是在尽量不损失信息的情况下降低码率,从而节省存储空间和通信带宽。To Multimedia File这个block就提供几种语音压缩方式:CCITT A律、CCITT μ律、GSM 6.10、PCM、ADPCM。本文将介绍一种很简单的增量调制(DM)编码方式。

DM编解码
DM(Delta Modulation)编码的原理很简单,信号处理的学习者对这个概念也不陌生(博主是在《现代通信技术概论》这本书中第一次接触到这个概念)。其编码原理如下:

第一幅图为语音信号,第二幅图为编码后的PWM信号。在对语音信号采样时,编码系统会比较相邻两个时刻的采样值,若信号幅度增加,则编码为1;若信号幅度减少,则编码为0(也可以相反)。系统的编码结果仅仅需要1比特来表示信号的增量关系。

解码时选择一个固定的量化阶数,根据DM编码值为1或0来决定输出信号是加上一个量化阶数、还是减去一个量化阶数。

学会System Generator(18)——音频信号采集与输出

本文是该系列的第18篇。数字信号处理的内容博大精深,音频信号处理、数字图像处理、雷达信号处理等等都属于DSP系统。从本文开始将记录一些简单的音频信号处理算法在System Generator中的实现方法。本文将介绍如何搭建音频信号的采集与输出模型。

音频信号基础概念
音频信号属于一维信号,一些基本概念如下:

  • 采样频率:根据奈奎斯特采样定理,采样频率Fs应该不低于声音信号中最高频率2倍。常见的音频格式文件(如mp3、wav等)有几个固定的采样频率:11025Hz、22050Hz、44100Hz、48000Hz。
  • 量化精度:即每个声音样本用多少位(bit)表示。通常以字节为单位。
  • 声道:现在的音频文件几乎都是立体声(左声道、右声道),也可以用“格式工厂”等工具转换为单声道。
  • 单声道音频信号采集与输出

    1.搭建模型
    在Simulink中添加block按下图连接:

    学会System Generator(17)——转置型FIR滤波器设计

    本文是该系列的第17篇。上一篇介绍了使用低层次封装的block搭建直接型FIR滤波器结构的方法,对设计进行时序分析,并将设计流水线化来提高系统的工作频率。转置型FIR滤波器是一种由直接型FIR滤波器变换而来的结构,在几乎相同的结构下有着更好的性能,本文将对此做介绍。

    转置型FIR滤波器
    滤波器结构框图如下:

    直接型FIR滤波器是对输入数据做寄存,这样当设计没有采用流水线时,最长的路径为输入到输出,有一个乘法器和多个加法器(见上篇);转置型FIR滤波器是对加法器的输出结果做寄存,这样相当于将原本最长的路径拆分为几段,缩短了延迟,大大提升了系统工作频率。

    需要注意的是,虽然看起来直接型FIR和转置型FIR的结构完全相同,只是延迟器的位置不同。但转置型FIR滤波器是对乘加运算之后的值(位宽有扩展)做寄存,消耗的资源实际上更多,在系数越多的情况下越明显。

    System Generator设计

    学会System Generator(16)——流水线设计方法详解

    本文是该系列的第16篇。流水线(pipeline)是FPGA设计中经常提到的一种技巧,通过消耗更多的资源来提升系统的运行速度。本文将以FIR滤波器的设计为主题,详细介绍如何把一个设计“流水线化”,并进行时序分析体会流水线设计带来的好处。

    流水线
    这里先用通俗易懂的语言描述一下流水线设计思想。假设小A要从成都到哈尔滨旅游,如果直接坐火车过去恐怕要累得受不了;如果在旅程中间加几站,比如到西安、北京、天津找个客栈休息一下,路上就更加精力充沛了。

    对于信号而言也是一样,加入一个状态为1的信号x需要从寄存器A传输到寄存器B,这条路线上只有组合逻辑(没有休息的地方),那么x必须保证在路上的时间保持1不变,如果传到一半值变为0了那就出错了。所以,A到B的延时就决定了系统的工作频率不能高于多少(否则会出错),系统的最大工作频率也是由最长路径上的延时决定的。

    但是,假设在A到B这条路上,增加几个寄存器(信号休息的“客栈”),相当于将路径拆分为几段,信号x就不必再害怕丢失状态。缩短了路径,也就缩短了延时,也就提高了系统可以工作的最高频率。这个过程就称作“设计流水线化”。

    无流水的FIR滤波器设计

    1.搭建模型

    本文是该系列的第15篇。数字控制振荡器(NCO)是FPGA中常用的一个模块,在《FPGA数字信号处理系列》第一篇就对其做了相关介绍。System Generator中的block大致可以分为两类:高层次封装(面向系统级,如第2篇设计中用到的Digital FIR Filter)和低层次封装(面向底层,与FPGA资源的联系更直接)。

    本文将采用IIR滤波器、DDS、DDS Compile IP核3种设计原理在System Generator中实现NCO。前两种采样低层次封装block,后一种采用高层次封装block,体会其中的差别。

    基于IIR滤波器的NCO实现

    1.搭建模型
    使用一个二阶IIR滤波器对单位脉冲信号滤波,只要保证系统的极点位于S域的单位圆上,即可得到正弦波输出。在Simulink中添加block按下图连接:

    本文是该系列的第14篇。第5篇中在介绍Gateway In block时谈到了System Generator中的数据类型,及不同的量化和溢出方式。本文将以两个简单的设计实例,更直观地说明不同的量化和溢出方式有什么区别。

    溢出(Overflow)方式对比
    从Simulink向System Generator的数据转换过程中可能会出现溢出(Simulink中的值超出了所设置数据格式能够表示的范围),Overflow可以设置为不同的处理方式:

  • Wrap:舍弃掉需要表示的值的高位。
  • Saturate:溢出的数转换为(所设置的数据格式能表达的)最大值或最小值。
  • Flag as error:溢出时Simulink会报错(这个选项只在Simulink仿真时有效,在导出到FPGA时仍当作wrap处理)。
  • 在Simulink中添加block按下图连接:

    同步内容