EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
3 @, w7 Q, j; @4 k2 S
从上海回长沙的开始一段时间并不是那么的顺利,一度怀疑自己学习的方向是不是错了,也开始怀疑自己能力,降低要求,找个单位签了算了。我给尤老师打电话,把自己的疑惑跟他谈了谈,马上纠正我的错误想法并且坚定我的信心。现在,比起之前的情况好了很多,手里也有了offer。真的很感谢至芯。也告诉所有喜欢FPGA的人,喜欢,就坚持,不要因为一点点阻碍就放弃自己的梦想。 &nBSP; 大家看到我这篇文章的题目之前加了“系列”两个字,那就是说关于“波 ”,我们不会只有这一篇,而是包括正弦波、混合波以及各种滤波器实现。这里面涉及到的一些理论,我尽量用简单、通俗易懂的语言来讲给大家。
% U9 ~! y6 U- m' z, W一.目标波形7 D# G; F9 R, y& F o* p0 @
正弦波想必大家都不陌生,在高中的时候就有接触过,什么正余弦定理,积化和差、和差化积、半角/全角公式等等。当然大家完全不需要回去重新复习这些,只看博客的内容就够了。大家先想一想正弦波的函数图象,它的波形是什么样子的,什么?这个也想不到,没关系,就是下面这个样子^_^。
) s1 I! l& w* `6 m/ M
( V v- a1 } _3 e2 j% o
博主不要闹,这哪里是什么正弦波,不要欺负我读书少!!! 别急,且听我慢慢说来,咳咳。。。上图给出的就是我们今天要实现的波形,先在视觉上面给大家一个直观的感受。该波形是由标准的正弦波通过变频、移相得到的。所谓万变不离其宗,根源还是正弦波。: t" ~! d% a2 \+ L, a
二.相关概念
2 z7 K" m+ j/ |' U- H5 | Q4 G 大家对下面的公式一定不陌生! d! s9 g2 N9 U% a! l5 U( |
y=f(x)=Asin(wx+k)=Asin(2*pi*f*x+k);
( E% E. {7 Y# p7 N, I# ^4 I A :振幅 f:频率 k:相位
) l2 Z& U6 ^: W" X4 A" O, u 知道了这三个参数就能确定唯一一组波形。下面看看生成正弦波的步骤,并在步骤里面穿插讲解。# x" u; G4 F* V6 b; i. @$ Y
1.离散化 将连续的正弦波信号进行离散化;应用matlab软件进行实现;
: c" o, v" ], \. T/ }% z+ | A) ?& {
# j8 m' V) n1 R# S
a)频率控制字M
! ~- F8 _: j8 ~& u$ F4 ?# ] 以一个周期为例,在正弦波上面采集等间隔的离散的点,然后将这些点用平滑的曲线连接,就可以将波形表示出来。伟大的奈奎斯特告诉我们,要将波形恢复出来,采样频率要>=2*该波形频率,即采样点数要大于等于2。我们可以将一个周期分成2、4、8、16........2^N的份数,可以连续选取采样点,也可以隔1、2、。。。M个点采样。这里的M就是频率控制字。它的作用是控制目标波形的频率。这里先这么记住,往后面看。 b)目标波形的频率fs7 H0 P. b! t8 H# m) q
既然我要生成一个正弦波,我当然要知道我生成的正弦波的频率,目标波形的频率fs=M*fclk/2^N;9 b5 w$ K& o# ~. u
fs怎么来的?
6 O* d" X8 D2 H1 O2 }. l 将一个周期分成2^N份,每M个点采样,那么一个周期要采多少个点?2^N/M;
4 w0 ]+ j8 f! ]( k. j4 [ 每个时钟采一个点,采集2^N/M个点需要2^N/M个Tclk,转换成频率,乘变成除,就得到目标公式了。
& h* t! o' g3 j8 m# |c)相位控制字
7 D, f' u2 O0 n8 W! U/ {' B 相位的控制也比较简单,以相位为0作为标准:8 t8 w4 q- T+ R, i# E+ x
90度——2^N/4;
' ?! Q0 q/ m! l8 Q0 d 180度——2^N/2;
0 r1 `, U2 Z1 c2 h 270度——2^N*3/4;
& o4 A! e4 V7 f/ _* f! T3 k7 q- { 相信大家也看出规律了,教大家一个快速的方法,将份数类比成角度360,对份数做运算相应的就是对角度做运算,得到期望的相位。
) Q) r, { x6 J( \/ }0 ~) r# ^$ i. B 注:如果你对于这些参数如何用代码控制还不是很清楚控制,那么具体看代码就一目了然了。$ o" _2 C8 [7 Z p
2.将离散化后的正弦波一个整周期存储到Ram中 # k9 J% \6 W6 t9 l
(1).将离散后的数据进行定点化,Ram的规格是256*8,数据规格:1bit符号位+7bit小数位4 _1 d8 _" o" `" ^
d)幅值
?& C6 r* A+ M1 l) V5 c 以8bit位宽的RAM为例。8bit数据能表示的有符号数的范围是-128——127,幅值即为127。2 W& G. u) Q& W) v
将浮点数定点化:这里8bit全部表示整数位宽,所以讲正弦值*127然后取整,再去掉符号,将数据生成mif文件(matlab实现)
/ _" G* E! R8 J! _( ` (2).创建一个Ram 用于存储离散数据
# d; j9 d- |, k8 G0 r. S 创建一个单口RAM,深度256,位宽为8,将mif文件导入即可。7 g4 c, b9 c5 \6 a; n! e, j
三.仿真步骤! |* N: o6 i6 ?& I1 M* g
该工程相应的仿真步骤如下:5 r# w" j0 `9 W
1.打开ModelSIM,改变当前路径' s: ^0 G6 p% F1 f% E8 h& |; F
File->Change Directory& y( t/ Q5 X* p' \, O0 a- F
将路径切换到sim文件夹下面
" l7 q+ D) f6 x1 _! j. e; y t! u
! F) _) g! j4 F% U2.在命令行中敲入do run.do,自动执行仿真
( {( X9 b/ u( k9 Z& T
7 A4 B: }: M+ M 3.输出格式设置- S" G6 n2 s( Q& z
选中o_wave信号,右键选中Format->Analog(custom) ,打开设置选项
) C: `$ a$ y; B4 `# Y
# b/ n/ H& B8 e# Z+ h K' z. c" F% {7 G/ U9 T8 {: E3 D3 R
Height改成120,Max改成127,Min改成-128,点击ok。5 q ^8 G. O+ `) a3 C1 o* W4 p
" f& K8 `. f3 q
( m9 o0 @. V& Y+ P* n
4.效果图
& P6 v( A# I) ]* S7 x4 B ^. |
% o9 s* G) X0 p! M
四.总结 确定一个唯一的正弦波需要知道三个参数,幅值、频率、相位。结合了采样定理,说明了采样过程与这三个参数的对应关系,明确这些就可以用代码实现。由于篇幅原因,需要代码的同学,留言写下自己的邮箱,我会把代码打包好发给各位,包括(功能文件,测试文件,仿真文件、工程等)。: g4 h+ _. U0 }" ] m
. D' |( G9 j3 c, ]) x9 Y0 `0 L e6 ?, o+ E5 {% p6 g
|