这是一个DDS的代码,我想实现如下时序:<br />1个时钟周期允许其他器件对RAM读写操作<br />1空闲一个时钟周期<br />1个时钟周期建立DDS查表地址<br />空闲一个时钟周期<br />1个时钟周期给DA一个开始转换的信号<br />空闲一个时钟周期<br />代码如下:<br /><br />library ieee;<br />use ieee.std_logic_1164.all;<br />use ieee.std_logic_unsigned.all;<br />use ieee.std_logic_arith.all;<br />entity ddsc is<br />generic(<br /> freq_width: integer := 10;--其实就是分频系数,也就是跳点<br /> phase_width: integer := 10;--相位字宽,1024个点<br /> addr_width: integer := 10;--累加器位宽<br /> ram_a_width: integer := 10;--表地址位宽<br /> ram_d_width: integer := 16--ad数据位宽<br /> );<br />port(<br /> clk: in std_logic;--dds clk<br /> freqin: in std_logic_vector (freq_width-1 downto 0);--其实就是分频系数,也就是跳点<br /> phasein: in std_logic_vector(phase_width-1 downto 0);--相位输入,相位只有第一次有效,这一点由外围电路保证<br /> ram_busy: out std_logic;--存储器忙标志,当DDS读数据的时候置位此标志,防止写操作扰乱数据。<br /> loadda: out std_logic;--DA使能<br /> dds_data_out: out std_logic_vector(ram_d_width-1 downto 0);--DDS输出<br /> ram_addr: out std_logic_vector(ram_a_width-1 downto 0);--dds地址输出<br /> test: out std_logic_vector(4 downto 0)<br /> );<br />end entity ddsc;<br />architecture behave of ddsc is<br />signal acc : std_logic_vector(addr_width-1 downto 0);<br />signal phasew : std_logic_vector(phase_width-1 downto 0);<br />signal freqw: std_logic_vector(freq_width-1 downto 0);<br />signal clk_count: std_logic_vector(4 downto 0);<br />begin<br />process(clk)<br /> begin<br /> if(clk 'event and clk ='1') then<br /> clk_count <= clk_count +1;--在clk的上升沿计数器加1<br /> end if;<br /> if(clk_count(1) = '1') then--在clk的第一位上升沿触发查表<br /> freqw <= freqin;--频率字输入<br /> phasew <= phasein;--相位同步输入<br /> end if;<br /> acc <= acc + freqw;--相位累加,指针移动,指针移动到最后会自动到开始的地方读取数据 <br />end process;<br /> loadda <= clk_count(1) and clk_count(0) and not clk;<br /> ram_addr <= acc;--?????????????????????????????????????????????????<br />end architecture behave;<br /><br />问题是仿真发现ram_addr 始终是X状态,也就是ram_addr <= acc;--?????????????????????????????????????????????????这一句没有起作用.<br />其他l信号如oadda都正常<br />哭想很久没有答案,所以来BBS希望高手指点! |
|