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