我用VHDL不太好,我真的不明白为什么我的代码不会工作。我需要一个NCO,找到一个工作程序并重新设计它以满足我的需求,但只是注意到一个但是 - 每个完整周期都有一个空白周期(http://i.imgur.com/gmYXHig.jpg)。该程序采用步骤进行参数(下一个样本之间的跳转)和时钟作为触发器。
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL; --try to use this library as much as possible.
entity sinwave_new_01 is
port (clk :in std_logic;
step :in integer range 0 to 1000;
dataout : out integer range 0 to 1024
);
end sinwave_new_01;
architecture Behavioral of sinwave_new_01 is
signal i : integer range 0 to 1999:=0;
type memory_type is array (0 to 999) of integer range 0 to 1024;
--ROM for storing the sine values generated by MATLAB.
signal sine : memory_type :=(long and boring array of 1000 samples here);
begin
process(clk)
begin
--to check the rising edge of the clock signal
if(rising_edge(clk)) then
dataout <= sine(i);
i <= i+ step;
if(i > 999) then
i <= i-1000;
end if;
end if;
end process;
end Behavioral;
我该怎么做才能摆脱那个零?它出现在每个完整周期 - 每个(1000 /步)脉冲。它不应该在那里它会弄乱我的PWM ...... 从我理解的整个块(数据输出改变,i增加,如果i> 999然后i&lt; = i-1000)执行时,在入口处应用了时钟的正边缘...但它看起来像是需要的一个额外的边缘,idk,重新加载我?代码是按顺序执行还是在时钟到达时测试所有条件? 我是否到达了桌子外面,这就是为什么我会在那个特定的脉冲中得到零?程序/不应该这样做,据我所知,if语句,或者它的VHDL是VHDL并再次做它奇怪的sh.t。
如何修复此错误?猜猜我可以每1k /步脉冲添加一个额外的时钟滴答,但这是一个解决方案而不是真正的解决方案......在此先感谢您的帮助。
答案 0 :(得分:0)
看起来您的问题是您的变量'i'在重置之前超过了999。请记住,您处于顺序过程中。 'i'在分配之后的下一个时钟滴答之前不会得到指定的值。
我想如果你改变这段代码
i <= i + step;
if (i > 999) then
i <= i-1000;
到
if ((i + step) > 999) then
i <= (i + step) - 1000;
else
i <= i + step;
你应该得到你正在寻找的行为。
答案 1 :(得分:0)
还有一件事...... sine (样本数组)的声明是否实际上创建了组合电路(坏)或将这些样本分配到ROM存储器中('good')?