原创 Xilinx System Generator 学习笔记(2)编译 Matlab到FPGA

2017-10-19 09:38 1811 8 8 分类: FPGA/CPLD

一、模型的设计原理

         SysGen 通过使用MCode模块提供了对Matlab的直接支持。MCode模块支持将输入值应用到M函数,用于对使用Xilinx定点数据类型的评估,并且在每个采样周期进行评估。模块通过使用永久的状态变量来保持内部状态。模块的输入端口是由M函数指定的输入变量所决定的,输出端口由M函数的输出变量决定。这个模块为构建有限状态机、控制逻辑等,提供一个便捷的方法。

  下面通过MCode构建两个滤波器,并将两个模块的计算结果进行比较。

二、

simple_fir.m 文件

function y = simple_fir(x,lat,coefs,len,c_nbits,c_binpt,o_nbits,o_binpt)
coef_prec = {xlSigned,c_nbits,c_binpt,xlRound,xlWrap};
out_prec = {xlSigned,o_nbits,o_binpt};
coefs_xfix = xfix(coef_prec,coefs);
persistent coef_vec,coef_vec = xl_state(coefs_xfix,coef_prec);
persistent x_line,x_line = xl_state(zeros(1,len-1),x);
persistent p,p = xl_state(zeros(1,lat),out_prec,lat);
sum = x * coef_vec(0);
for idx = 1:len-1
sum = sum + x_line(idx-1) * coef_vec(idx);
sum  = xfix(out_prec,sum);
end
y = p.back;
p.push_front_pop_back(sum);
x_line.push_front_pop_back(x);



fir_tranpose.m文件

function y = fir_transpose(x,lat,coefs,len,c_nbits,c_binpt,o_nbits,o_binpt)
coef_prec = {xlSigned,c_nbits,c_binpt,xlRound,xlWrap};
out_prec = {xlSigned,o_nbits,o_binpt};
coefs_xfix = xfix(coef_prec,coefs);
persistent coef_vec,coef_vec = xl_state(coefs_xfix,coef_prec);
persistent reg_line, reg_line = xl_state(zeros(1,len),out_prec);
if lat <= 0
error('latency must be at least 1');
end
lat  = lat -1;
persistent dly,
if lat <= 0
y = reg_line.back;
else
dly = xl_state(zeros(1,lat),out_prec,lat);
y = dly.back;
dly.push_front_pop_back(reg_line.back);
end

for idx = len-1:-1:1
reg_line(idx) = reg_line(idx-1) + coef_vec(len-idx-1)*x;
end

reg_line(0) = coef_vec(len-1) * x;


三、系统模型的建立

打开System Generator,然后打开Simulink,新建一个设计。

Libraries找到Xilinx Blockset ,展开Math,2MCode元件加入到设计中。

Xinlinx Blockset,展开Basic Elements,Gateway In Gateway Out 元件加入到设计。

展开Simulink,找到Sources,Band-Limited White Noise 元件加入到设计;

Simulink  Sinks 中找到Scope,加入到设计。

Xilinx Blockset Basic Elements 中将System Generator 符号加入到设计。



双击上面的MCode元件符号,打开参数配置对话框,在Basic标签页,点击Browse,定位到simple_fir.m的路径。单击interface,安下图所示配置。在Advanced标签页,勾选Enable printing with disp


双击下面的MCode元件,在Basic标签页加载fir_transpose.m文件。在Interface标签下,参数如下配置。在Advanced标签页,勾选Enable printing with disp

最后按下图所示连接



四、仿真

Simulink的工具栏文本框中输入100,然后点击仿真按钮,最后双击Scope符号,查看仿真图像




文章评论0条评论)

登录后参与讨论
相关推荐阅读
LoneSurvivor 2018-02-25 08:26
C++输入/输出流(2)
1. get()函数#include<iostream>using namespace std;int main(){    char s1[80], s2[...
LoneSurvivor 2018-02-23 12:19
C++输入/输出流(1)
1. 输入/输出流类层次 C++的输入/输出流类库是用派生方法建立起的,它有2个平行的基类,streambuf和ios。其他的流类都是从这两个基类直接或间接派生的。1.1   s...
LoneSurvivor 2018-02-19 11:36
C++多态(4)——特殊运算符重载和类类型转换
1.“++”和“--”的重载     运算符“++”和“--”的重载要区分前置和后置两种形式。如果不区分前置和后置,则使用operator++()或operator—()即可,否...
LoneSurvivor 2018-02-12 11:15
C++多态(3)——运算符重载
1.     运算符重载的定义     运算符重载也是实现多态的一个重要手段。运算符重载实现的是编译时的多态,即静态多态性。C++预定义的...
LoneSurvivor 2018-02-12 10:31
C++多态(2)——纯虚函数与抽象类
   抽象类是一种特殊的类,它提供了统一的操作界面。建立抽象类是为了多态地使用抽象类的成员函数。抽象类是包含纯虚函数的类。 1.     ...
LoneSurvivor 2018-02-11 16:24
C++多态(1)
1.     多态      多态是人类思维方式的一种直接模拟,多态性是指不同对象接收到相同的消息时,根据对象类的不同而产生不同...
我要评论
0
8
1
2
3
4
5
6
7
8
9
0
关闭 站长推荐上一条 /4 下一条