SystemGenerator:数字信号处理之开发准备、流程预演


前言

本系列开端先学习B站“ Rong晔 ”的视频,作为FPGA在DSP用途学习的引子,视频做的非常之好,万分感谢!以下为Lytain的个人笔记,包含大量个人理解内容,若有错误,望指正。很喜欢这些夹带私货极少的前辈,再次感谢,无以言表。


1、开发准备

我的软件:VIVADO2018.2、MATLAB2018a、System Generator。

Note:版本的选择需要相关联才能联合使用(可直接看第6点)。

  1. 打开:https://www.xilinx.com/support.html

  2. 选择User Guides下载。
    在这里插入图片描述

  3. 可以看到“ DSP Design Using System Generator”的文档,默认是最新版Vivado的文件,如果使用的是旧版本,点击See All Versions。
    在这里插入图片描述

  4. 这里,我找到“ UG897 - Vivado Design Suite User Guide: Model-Based DSP Design using System Generator (v2018.2) ”的打开。

  5. 在目录中,找到“ Support for MATLAB ”,点击跳转。
    在这里插入图片描述

  6. 有一个叫“ UG973 ”的东西,打开后跳转到一个文档网址。
    在这里插入图片描述

  7. 在UG973的目录中,点击“ Compatible Third-Party Tools ”看支持的第三方工具版本。
    在这里插入图片描述

  8. 可以看到,2018.2的Vivado支持R2017a,R2017b和R2018a。很不幸,我之前装的Matlab是2019的,考虑代码的维护,我卸载Matlab这边,装了2018a版本的。另外,没装System Generator的,需要多装下,以前装了就不用了。至此,开发软件基本准备好了。
    在这里插入图片描述

  9. Mathworks官网上也有该问题的回复,非常直观。
    在这里插入图片描述
    还需要注意一点的是,Vivado2019.2是最后一个支持Windows7的版本,从2020.1开始,Vivado不再支持Windows7。


2、实际流程预演

主旨:把整体的开发流程实践一遍。
在这里插入图片描述

一、Matlab编写

1°打开Vivado、Matlab,注意Matlab需要从System Generator中启动。在打开别人的System Generator工程时,也需要这样的。打开后有如下提醒。
在这里插入图片描述

2°编写Matlab代码,然后运行(快捷键F5)。

clc;clear all;close all;
% -------------------------------demo--------------------------------------%
% To show the complete process of digital signal processing system designing
% -------------------------------------------------------------------------%
%% System parameters
N = 1024;   % Data depth
Fs = 10000; % Sampling frequency(Hz)
Ts = 1/Fs;  % Sampling time
%% Generate an input signal
A = 1;      % Amplitude
t = (0:1024-1)*Ts;     % Time(s)
f = 50;     % Frequency(Hz)
n = Fs/f;   % Data length of a period
x = A * sin(2*pi*f*t); % Input signal

figure(1)
plot(t,x);
hold on;
%% Demonstrate the algorithm: Multiply,Add and Delay
C = 2;     % Multiplier
D = n/2;   % Delay,half of period

% y_0 = C * x;
y_0 = zeros(1,N);
y_1 = zeros(1,N);
y   = zeros(1,N);
% 所有运算的算法,要用for循环更改为FPGA的形式
for i = 1:N
    y_0(i) = C * x(i);
    if(i>D)  % 当运算时间超过设定延迟参数后,才开始进行延迟
        y_1(i) = y_0(i-D);
    end
    y(i) = y_0(i) + y_1(i);  % Output signal
end


figure(1)
plot(t,y);
legend('Input signal','Output signal');

x_in(:,1) = 1:N;
x_in(:,2) = x;

Notes:代码编写时需要注意的一些细节
  1. Matlab中的运算和实际FPGA的运算编写存在一定区别,比如乘法,在Matlab中,可以直接使用“ * ”来实现。但FPGA不同,后者每做一个操作,都是需要时钟来驱动的,Matlab编写时要规范这种思路,用for循环的方式来表示每个时钟进行一次数据的处理。
  2. y_0、y_1和y一开始都被赋予了一个空的数组,目的是为了预分配内存,得到一个存储空间。
  3. 得到的数据图像,可以和工作区变量进行相互对应。
    在这里插入图片描述

二、Simulink搭建

1°打开Simulink,建立一个空模型Blank Model。
在这里插入图片描述

2°点击Simulink窗口上面四个框的Library Browser,可以打开仿真的一些库模型。打开后找到“ Xilinx Blockset ”的“ Basic Elements ”部分,这里面有个“ System Generator ”,直接拖动放到Simulink窗口,这个是必须的,否则运行啥都是错的。
在这里插入图片描述

3°双击System Generator的图标进入配置。

在这里插入图片描述
点击Clocking配置界面,我板子上的时钟是50MHz的,做相应的更改。
在这里插入图片描述
配置后的图片如下,除时钟周期外的,都默认。弄好后,点击Apply,OK即可。
在这里插入图片描述

4°添加“ Gateway In ”和“ Gateway Out ”模块,生成的工程会根据这个名字直接产生,因此需要提前设置好输入和输出的名字。

5°在“ Basic Elements ”中添加Delay延迟模块,“ Math ”中添加AddSub加法模块,CMult乘法模块。按照算法的设计,将模块连接起来。
在这里插入图片描述

6°添加一些Simulink本身的模块,为仿真提供一些便利。在仿真库的“ Simulink ”的“ Sources ”一栏中有“ Form Workspace ”,也就是从工作区中获取输入源,将其拖到窗口中。在仿真库的“ Simulink ”的“ Sinks ”一栏中有“ Scope ”,是用来查看输出的波形的。这两个都是Simulink本身自带的模块,不会产生到FPGA中,必须使用gateway的方式让FPGA和外部数据进行交流。

7°将窗口的“ Dispaly ”的“ Signal & Ports ”的“ Port Data Types ”勾选好,这会是我们看到信号线上的数据类型。
在这里插入图片描述

8°信号输入的配置,信号的输入可以是矩阵格式,第一列是时间序列,第二列是数据序列。编写代码,将时间序列和数据序列组合起来即可(通过Matlab的F9快捷键,可以只运行选中的几句代码)。先断开“ Form Wordplaces ”与“ Gateway In ”的连接,将仿真时间改为1024,点运行后,得到如下波形,和预期是一致的。
在这里插入图片描述

9°修改运算模块的参数。双击CMult模块,将Constant value的值改为C(注意不是2,因为在Matlab中修改参数更为简单),直接读取工作区的变量。另外,其Latency可以设置为0,表示得到结果后直接输出,不经过延迟。延迟模块Delay,同样将其Latency改为D(也是Matlab中的参数直接使用,平时工作时,建议参数用脚本直接写好)。

10°最终仿真的结果如下面所示。
在这里插入图片描述

11°可以发现,输入数据经过Gateway In后变成定点型。
在这里插入图片描述
将原精度16,14改为32,16。这是消耗了大量资源来保证工程的准确的。以完成工程为目标后,再进行优化。
在这里插入图片描述
重新运行后,可以发现,Gateway In定点数据(32、16)经过CMult模块(16、14)后,输出为定点数据(48、30),这是因为CMult模块为了保证数据不溢出,进行的精度扩展(32+16、16+14)。Delay模块输出精度不变。Add模块,为保证进位不溢出,整数部分也需要扩展1位,小数部分则无进位需求(49、30)。
在这里插入图片描述
这里输出的幅值只有2,极大的资源都被浪费了,后续要保证位宽的一致。

11°为了将输出数据和输入数据的位宽一致,需要用到“ Convert ”模块,其在“ Basic Elements ”中。
在这里插入图片描述

三、Vivado仿真

1°双击“ System Generator ”,按照之前配置好的,点击“ Generate ”。显示下列图,表示顺利的生成了。接着到Vivado上进行后续的开发。
在这里插入图片描述

2°仿真前,先进行Synthesis综合。不进行综合直接仿真也是可以的,但可能会出现一些莫名其妙的错误,所以先进行下综合。

3°点击仿真后,在Vivado中打开了仿真界面,且有仿真数据。之所以不用再自己编写testbeach,是因为在Simulink仿真环境搭建时,有一个Gateway In,会自动将Source的数据作为testbeach导进来。是其自动帮忙做的。

4°刚开始得到的波形是一个“ 数字型 ”的,需要做以下配置,将显示的波形进行设置下。
在这里插入图片描述
右键信号“ Value ”,选择“ Waveform Style ”的“ Analog ”后,再选择一次“ Analog Settings ”进行模拟参数的配置。
在这里插入图片描述
根据输出波形的范围,进行设置。
在这里插入图片描述
上述Analog参数设置完后,还需要对进制进行设置。
在这里插入图片描述
在这里插入图片描述
对输出进行同样的设置,仿真更长时间,点击“ Zoom Fit ”后,得到完整的波形图。
在这里插入图片描述

5°如果只是仿真的话,基本没啥问题,但要下载到开发板调试,需要做一些改动。但为了拿到其他地方用的话,这个Gateway In还是要保留的,作为FPGA模块的输入接口。

四、FPGA测试

1°使用ROM的IP,保存输入的数据,而不在使用Gateway的方式。在“ Xilinx Blockset ”中的“ Memory ”选择ROM拖出。使用ROM还需要一个计数器,根据计数器值的变化,来读取不同的ROM值,计数器在“ Xilinx Blockset ”中的“ Math ”有。
在这里插入图片描述
在这里插入图片描述

2°在新的文件夹下Generate新的工程。

五、ILA数据导出与读取

1°添加ILA的IP核(在Vivado中)。
在这里插入图片描述
在这里插入图片描述

2°复制例化模板,在顶层中进行例化。
在这里插入图片描述
由于top module输入信号输出信号位宽过多,占用太多的引脚,可以稍微修改下,让其别出现在顶层中,只作为中间变量,给内部的ILA查看。
在这里插入图片描述
更改完后,在Vivado左栏的“ Open Elaborated design ”可以进行RTL的分析,检查基本模块的连接是否正确。
在这里插入图片描述
在这里插入图片描述

3°添加管脚约束,由于只有一个时钟管脚,就不适用xdc文件了。直接点击Vivado最上方“ Window ”的“ I/O Ports ”,下方进行配置(需要“ Open Elaborated design ”步骤之后,才能有这个)。
在这里插入图片描述

4°在FPGA上测试的结果,,居然没有ILA跳出来,有些崩溃,小睡了10mins。起来检查Bug。
在这里插入图片描述
显示的问题如上所示,大概是指debug core被删除了,这问题估计比较常见,这里花些时间处理掉。

弄了一个小时。。。尝试改了代码、一些配置和玄学的操作,还是没成功,没办法留坑了,明早拿A7和Spartan6的板卡过来,先排除不是代码的问题。

2020年12月19日,估计今天还是没法填坑,因为调试器留在实验室了,先学些其他的,晚点回来填。

2020年12月20日,今天中午填坑了之前留下的BUG,首先代码是没啥问题的,只是Zynq板卡容易遇到ILA被优化掉无法查看信号的问题,尝试了网上很多方法,都没有解决。但有个方法是可行的,就是“ 搭一个最小系统,用SDK跑一段小代码,这样Refresh后ILA就能正常启动 ”,只不过时间关系,我没有选择去实验。我直接换用了手头的另一块A7板卡,型号是XC7A75TFGG484-1的,稍微改动下“ System Generator ”的配置后,生成工程,烧入板子,ILA是可以正常启动的,没啥问题。
在这里插入图片描述
ILA的波形如下面所示。
在这里插入图片描述
还存在一个问题,就是Radix居然没有Real Settings的选项,找了好久,不知道除了啥问题,但总之波形基本正确。
在这里插入图片描述


参考文献

  1. 现在查看vivado手册的位置——开发笔记

  2. ug973-vivado-release-notes-install-license.pdf

  3. Rong晔前辈的视频第0、1、2期

  • 3
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
《FPGA数字信号处理设计流程System Generator入门与提高》是一本重要的书籍,它介绍了系统生成器(System Generator)在FPGA数字信号处理领域的应用和设计流程。该书提供了丰富的示例和源代码,使读者能够更好地理解和掌握FPGA数字信号处理的设计方法和工具。 在书中,作者首先介绍了FPGA数字信号处理的基本概念和原理,包括数字信号处理的基本知识、FPGA的基本结构和工作原理,以及系统生成器的基本功能和使用方法。接着,作者详细介绍了使用系统生成器进行FPGA数字信号处理设计的流程,包括系统搭建、模块化设计、仿真和验证等关键步骤。 书中的源代码主要是通过系统生成器和MATLAB进行开发和调试的,涵盖了常见的数字信号处理算法和应用,如滤波、变换、调制解调等。这些源代码包括了完整的设计框架和关键代码段,可以直接在系统生成器中使用或者根据需要进行修改和优化。 通过学习该书的源代码,读者可以了解到系统生成器在FPGA数字信号处理设计中的实际应用,掌握使用系统生成器进行设计的方法和技巧。同时,书中的示例和源代码也可以作为读者进行FPGA数字信号处理项目开发的参考和借鉴,提高设计的效率和可靠性。 总之,该书提供了系统生成器在FPGA数字信号处理设计中的全面介绍和实例源代码,对于初学者是入门的好教材,对于有一定经验的读者则是提升技术水平的宝贵资料。读者可以通过仔细学习和实践,掌握FPGA数字信号处理设计的基本原理和方法,并在实际项目中运用。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

学不懂啊阿田

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值