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