一个dds的小问题

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

怎么没有复位?

  
 楼主| lovec51 发表于 2007-9-30 17:46 | 显示全部楼层

先吧这个最简单的搞出来再加复位,可是目前这个还有问题!

请大虾指点!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

21

主题

112

帖子

1

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