请教DDS问题

[复制链接]
 楼主| hyg1984 发表于 2008-7-15 01:43 | 显示全部楼层 |阅读模式
首先,我是用VHDL编写的,用DDS方法产生波形。<br /><br />但是-----其中的道理不是很理解&nbsp;,特别是累加器,寄存器产生ROM地址那里,想不通!!<br /><br />比如我产生一个正弦波形,主要有累加器、寄存器和ROM数据3个模块组成,ROM数据那里容易理解,<br />只需时钟和地址接入就可产生数据输出。<br /><br />我是这样编写累加器和寄存器的-----:<br /><br />1,累加器:<br />library&nbsp;ieee;<br />use&nbsp;ieee.std_logic_1164.all;<br />use&nbsp;ieee.std_logic_unsigned.all;<br /><br />entity&nbsp;add32&nbsp;is<br />&nbsp;&nbsp;port(&nbsp;a,b:in&nbsp;std_logic_vector(31&nbsp;downto&nbsp;0);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s:out&nbsp;std_logic_vector(31&nbsp;downto&nbsp;0));-----送寄存器din端口<br />end&nbsp;add32;<br />architecture&nbsp;bhv2&nbsp;of&nbsp;add32&nbsp;is<br />&nbsp;&nbsp;begin<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s&lt=a+b;<br />end&nbsp;bhv2;<br /><br />2,寄存器<br />library&nbsp;ieee;<br />use&nbsp;ieee.std_logic_1164.all;<br />use&nbsp;ieee.std_logic_unsigned.all;<br />entity&nbsp;cnt1024&nbsp;is<br />&nbsp;&nbsp;port(&nbsp;&nbsp;clk:in&nbsp;std_logic;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;din:in&nbsp;std_logic_vector(31&nbsp;downto&nbsp;0);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;qa:out&nbsp;std_logic_vector(9&nbsp;downto&nbsp;0);--------送ROM地址<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bout:out&nbsp;std_logic_vector(31&nbsp;downto&nbsp;0));------反送到累加器b&nbsp;端口,方便累加<br />end&nbsp;cnt1024;<br />&nbsp;&nbsp;<br />architecture&nbsp;bhv1&nbsp;of&nbsp;cnt1024&nbsp;is<br />&nbsp;&nbsp;&nbsp;begin&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;process(clk)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;clk'event&nbsp;and&nbsp;clk='1'&nbsp;then<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bout&lt=din;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;q1&lt=din(31&nbsp;downto&nbsp;22);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end&nbsp;if;<br />&nbsp;&nbsp;&nbsp;&nbsp;end&nbsp;process;<br />&nbsp;&nbsp;qa&lt=q1;<br />end&nbsp;bhv1;<br /><br />输入有设clk=100MHZ,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a开始是a[31..8]=0,a[7..0]&lt=fb(fb是控制字)<br /><br /><br />按照我的理解是这样的,也不知道对不对,请指正:<br /><br />如果fb=00000001,那么累加到s[22]='1'时,数据地址才加1,则查ROM表,取一个数据。<br /><br />则最小分辨率是fclk/1024/2^22=0.0232HZ,也是最小频率,对吗?呵呵,是我自己的理解,不敢确定。<br /><br />若a[21..0]=11111111------;a[31..22]&lt=fb;<br /><br />假如每个周期只取32个数据,设fb=1024/32=32=00111111,则最高频率为fclk*32/1024=3.125MHZ<br /><br />上面是我的理解,对不对请大家指出,共同讨论。<br /><br />我的困惑是:怎么弄出个步进间隔为1HZ来,产生最小频率(最小分辨率)1HZ不难,只要减少累加器位数就行,<br /><br />但是,每次我&nbsp;fb加1的时候,输出频率就增大一倍而不是1HZ----<br /><br />怎么控制呢,我想疯了想不明白-----
 楼主| hyg1984 发表于 2008-7-15 18:21 | 显示全部楼层

啊??没有人回答~~~

呵呵,<br /><br />DDS不外呼注意,最大频率,最小频率,最小分辨率及步进间隔等,还有是如何调节控制字和<br /><br />调节相位,望高手解答一下,这些控制怎么做到呢?
wjj145 发表于 2008-7-17 19:27 | 显示全部楼层

可以用一下xilinx's dds

xilinx的system&nbsp;generator不用写vhdl也可以使用dds&nbsp;core.不用这样累吧!&nbsp;
 楼主| hyg1984 发表于 2008-7-18 21:01 | 显示全部楼层

re

呵呵,我想学VHDL(DDS)这方面的知识,学无止境嘛---
chm269 发表于 2008-7-19 21:00 | 显示全部楼层

一年前研究过这个

去年大赛的时候研究过这个,好久没用忘的差不多了,上网看一下以前电子大赛的作品,应该会有
 楼主| hyg1984 发表于 2008-7-21 14:21 | 显示全部楼层

re

  
 楼主| hyg1984 发表于 2008-7-21 14:24 | 显示全部楼层

re

其实,网上有很多方法,可是讲得不太清楚,特别是<br /><br />最大频率,最小频率,分辨率,步进&nbsp;这一块,而且讲多,并没有VHDL实现<br /><br />
您需要登录后才可以回帖 登录 | 注册

本版积分规则

14

主题

156

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部