EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
一、模型的设计原理 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 Vfir_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的路径。单击inte RFace,安下图所示配置。在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
|