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