找回密码
 注册
关于网站域名变更的通知
查看: 409|回复: 1
打印 上一主题 下一主题

编译 Matlab到FPGA

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2018-10-8 09:50 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
编译 MatlabFPGA
一、模型的设计原理
         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)- V, D; r. I! ~: ?; F6 g' i& L0 K% A
coef_prec = {xlSigned,c_nbits,c_binpt,xlRound,xlWrap};: y- @7 Q& f- @) y
out_prec = {xlSigned,o_nbits,o_binpt};" [! ^1 l$ {8 c9 Z; v; N+ N" t5 l8 o
coefs_xfix = xfix(coef_prec,coefs);
! y5 O1 f% Y5 |' U, f# d
persistent coef_vec,coef_vec = xl_state(coefs_xfix,coef_prec);* n4 D# d4 _! I, l) m* l
persistent x_line,x_line = xl_state(zeros(1,len-1),x);# _' q: `/ |) ~+ v$ S
persistent p,p = xl_state(zeros(1,lat),out_prec,lat);
& O  l7 h. _6 \: d, Q& m
sum = x * coef_vec(0);
$ H  S: Q( {- J0 S) g- S& B) F* o0 C
for idx = 1:len-1
- c2 ]! g8 v0 u  z' X& t
sum = sum + x_line(idx-1) * coef_vec(idx);& O! N$ V; \8 y2 |
sum  = xfix(out_prec,sum);
8 @% c2 G( M; Q2 l9 j
end
& Z' m" e  Q$ N' }6 |6 U# O
y = p.back;4 v: d: T: x+ k
p.push_front_pop_back(sum);
/ c' `1 z0 Z1 ]. |
x_line.push_front_pop_back(x);
) O( X% N4 O* w* O

' E( K% G! \8 V, L' H8 V
fir_tranpose.m文件
function y = fir_transpose(x,lat,coefs,len,c_nbits,c_binpt,o_nbits,o_binpt)  d' b5 R2 R) |
coef_prec = {xlSigned,c_nbits,c_binpt,xlRound,xlWrap};2 X4 c6 j4 L0 u& J8 f/ C4 Z
out_prec = {xlSigned,o_nbits,o_binpt};
$ n* T: K6 A2 F  z; c1 N
coefs_xfix = xfix(coef_prec,coefs);. ~" H& b" f* s1 l. y7 l
persistent coef_vec,coef_vec = xl_state(coefs_xfix,coef_prec);
! N7 x; p, X+ ^; _: r. v
persistent reg_line, reg_line = xl_state(zeros(1,len),out_prec);# u- Z& ~6 [4 `) F" {
if lat <= 0+ o2 {( |& S  Z) G
error('latency must be at least 1');
. l% X) G* v" h! p
end' d4 O. }& M" z8 \- W
lat  = lat -1;
' ~" L) y  V1 _+ l8 g0 ?( E8 H
persistent dly,* P3 i  _+ R; _" y
if lat <= 0
4 [0 S1 e$ e2 ]& n8 Z
y = reg_line.back;
( c  Q  q1 m' a. A$ y/ J7 j
else) x$ u& V4 V, ^1 ?# y. E: M
dly = xl_state(zeros(1,lat),out_prec,lat);
; y- p! U2 n. i3 R3 c
y = dly.back;
; V& d: R8 d! c  {4 H5 ]
dly.push_front_pop_back(reg_line.back);
7 e7 d, z6 g$ f: M8 m* }
end
1 a0 j' T" m2 ?
: o  j0 W0 y  }0 l: |5 R& ^
for idx = len-1:-1:1# ~4 ?; s; h0 c. ]5 I+ v1 I! S  w4 P
reg_line(idx) = reg_line(idx-1) + coef_vec(len-idx-1)*x;/ x( p/ T- a1 H/ m
end) [% m  C1 N' L" h
: W( A( n$ p4 k' w; K  e
reg_line(0) = coef_vec(len-1) * x;
, Y4 H" y$ x! _7 c+ w; G
三、系统模型的建立
打开System Generator,然后打开Simulink,新建一个设计。
在Libraries找到Xilinx Blockset ,展开Math,将2个MCode元件加入到设计中。
在Xinlinx Blockset,展开Basic Elements,将Gateway In 和Gateway Out 元件加入到设计。
展开Simulink,找到Sources,将Band-Limited White Noise 元件加入到设计;
在Simulink 的 Sinks 中找到Scope,加入到设计。
在Xilinx Blockset 的Basic Elements 中将System Generator 符号加入到设计。

( ^3 ^! r! m2 a+ c+ d! s$ ?! T. w( m' n5 y
双击上面的MCode元件符号,打开参数配置对话框,在Basic标签页,点击Browse,定位到simple_fir.m的路径。单击inteRFace,安下图所示配置。在Advanced标签页,勾选Enable printing with disp。
双击下面的MCode元件,在Basic标签页加载fir_transpose.m文件。在Interface标签下,参数如下配置。在Advanced标签页,勾选Enable printing with disp
最后按下图所示连接

% b7 {3 v9 i; E: ~1 H. [
* e" {; Q6 W2 O1 p& u" N! |7 Y
四、仿真
在Simulink的工具栏文本框中输入100,然后点击仿真按钮,最后双击Scope符号,查看仿真图像

" H& c4 |/ J' n$ }1 D6 r2 b) [2 m$ }

/ t! M' Q% Z+ H' a8 `
, s" ^! h( P$ Y) m8 Z  X  I" R$ t
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-7-22 18:53 , Processed in 0.109375 second(s), 26 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表