基于vhdl的DDS设计.docx
《基于vhdl的DDS设计.docx》由会员分享,可在线阅读,更多相关《基于vhdl的DDS设计.docx(19页珍藏版)》请在冰豆网上搜索。
基于vhdl的DDS设计
基_于vhdl的DDS设计
&&BASYS板上实现DDS设计&&
1.创建新工程DDS
2.设置参数
3.添加或新建VHDLmodel
编译综合
4.将VHDL模块转化成图形化符号,以便之后在原理图输入法中应用
将fredevider3、phaseregister转化为SchematicSymbol。
5.创建IP核(Rom)
Rom宽度为8bit,深度为256
一路next到page4,导入.coe文件(.coe文件的生成见附)
字体为红色则存在错误,黑色为正确,点Generate,等待生成IP核。
6.原理图输入法创建顶层文件(.sch)
点finish后进入top.sch原理图设计界面
选择自己的工程路径,Symbols中出现fredevider3、phaseregister、rom的图形化符号。
连接器件
编译综合
无错误即可
7.波形仿真
reset先设为1再设为0,产生复位信号;periodn[1:
0]设为“00”;pir[4:
0]设为“00001”(步进角);保存top_test。
8.编写ucf文件,进行管脚配置
一个DDS工程便完成了
编译综合,生成.bit文件
用Digilent将.bit文件下载到basys板子即可。
附:
对于ROM模块,主要是生成相应的.coe文件。
1.在Matlab中生成正余弦波形的浮点值,并量化为16bit定点波形数值:
%生成ROM的.coe文件
clc
clearall
closeall
x=linspace(0,pi/2,1024); %在区间[0,2pi]之间等间隔地取1024个点
y_cos=cos(x);
y_sin=sin(x);
y_cos=y_cos*2^16;
y_sin=y_sin*2^16;
fid=fopen('D:
/cos_coe.txt','wt'); fprintf(fid,'%16.0f\n',y_cos);
fclose(fid);
fid=fopen('D:
/sin_coe.txt','wt');
fprintf(fid,'%16.0f\n',y_sin);
fclose(fid);
2.生成.coe文件在D盘根目录下,将cos_coe.txt和sin_coe.txt的后缀改成.coe。
打开文件,把每一行之间的空格用文本替换功能换成“,”(这可以通过强大的UltraEdit来实现!
),并在最后一行添加一个分号“;”。
最后,在文件的最开始添加下面两行:
memory_initialization_radix=10;
memory_initialization_vector=
然后,保存文件退出。
3.将coe文件加载到BLOCKROM所生成的ROM中。
新建一个BLOCKROM的IPCore,其位置为“Memories&StorageElements---->RAMs&ROMs----->BlockMemoryGeneratorv2.4”。
在第1页中选择“singleportrom”,在第2页中选择位宽为16,深度为1024,在第3页下载coe文件,如下图,然后双击Finish,完成IPCore的生成。
如果coe文件生成得不对,Browse前面的框中是显示红色的文件名,coe文件错误类型主要有数据基数不对和数据的长度不对两种。
coe文件的格式如下:
MEMORY_INITIALIZATION_RADIX=10;
MEMORY_INITIALIZATION_VECTOR=
512,515,518,522,525,528,531,535,538,54
。
。
。
。
。
。
。
。
12,23;
注意:
前面的2行不要动,RADIX后面的数字表示的是进制,这里取10进制。
结尾用的是分号
在matlab中关键的步骤如下,我们以一个周期1000个采样,位数为10位的正弦表格为例子。
n=0:
999;y=round(sin(2*pi*0.001*n)*512)+512;//后面加上512是为了防止出现负数
y=mod(y,1024);//因为是10位,所以,没有1024,对1024取余数,把1024转化成0
dlmwrite('b.txt',y);//dlmwrite函数是使得产生的数据之间是用逗号隔开的。
得到b.txt文件,用记事本打开,在最上面加上
MEMORY_INITIALIZATION_RADIX=10;
MEMORY_INITIALIZATION_VECTOR=
同时数据结尾用分号结尾
最后另存为,选择后缀为.coe,将文件导入到ROM以后,单击show,或者是显示初始数据的按钮(各个ISE不太一样),说明数据导入正确。
这是一个coe文件的例子
;Sampleinitializationfilefora
;32-bitwideby16deepRAM(这是注释说明性文字)
memory_initialization_radix=16;(2,10,16,分别表示2进制,10进制,16进制)
memory_initialization_vector=
01234567
89ABCDEF;(最后用“;”结尾)
目标:
生成一个正弦查找表,共32个数,数据宽度16;
1.在matlab中输入a=sin(pi*(0:
31)/16)*32767;//生成16位
符号数,32767为2的15次方减1;
2. a=int16( a);//把a转换成16位整数
3.这时可以把matlab里显示的数据copy出来
memory_initialization_radix=10;
memory_initialization_vector=
paste在这里最后用“;”结尾,然后存成coe文件。
4.或者把数据存成文本文件
fid=fopen('sin.coe','wt');
fprintf(fid,'%d',a);
fclose(fid);
然后打开文件,把
memory_initialization_radix=10;
memory_initialization_vector=
加进去
如下所示:
memory_initialization_radix=10;
memory_initialization_vector=
0 6393 12539 18204 23170 27245 30273 32137 32767
32137 30273 27245 23170 18204 12539 6393 0 -6393
-12539 -18204 -23170 -27245 -30273 -32137 -32767 -32137 -30273
-27245 -23170 -18204 -12539 -6393;
数据之间用空格隔开,最后一个数据用“;”结束(eg:
-6393;)