【问题标题】:VHDL - loop failure/'empty' cycle issueVHDL - 循环失败/“空”循环问题
【发布时间】:2014-04-30 20:51:21
【问题描述】:

我对 VHDL 不是很好,我真的不明白为什么我的代码不能工作。我需要一个 NCO,找到一个可以工作的程序并重新设计它以满足我的需要,但我发现了一个错误:每个完整的周期都有一个空白周期。

程序将参数步骤(在下一个样本之间跳转)和时钟作为触发器。

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 ...... 据我了解,当入口处应用时钟的正沿时,整个块(dataout 发生变化,增加,if i&gt;999 then i&lt;=i-1000)执行......

但它看起来需要一个额外的优势,我不知道,重新加载它?代码是按顺序执行的,还是在时钟到达时测试所有条件?我是否伸到桌子外面,这就是为什么我在那个特定的脉冲中得到零?程序/不应该/这样做,据我了解 if 语句,还是 VHDL 是 VHDL 并再次做奇怪的事情。

如何修复此错误?我想我可以每 1k/步脉冲添加一个额外的时钟滴答,但这是一种解决方法,而不是真正的解决方案。提前感谢您的帮助。

【问题讨论】:

    标签: loops if-statement process vhdl


    【解决方案1】:

    您的问题似乎是您的变量“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;
    

    你应该得到你正在寻找的行为。

    【讨论】:

    • 谢谢,刚刚对其进行了测试,现在它工作正常:3 使用 C 和 uCs 这么久了,我很难注意到这样的东西......作为 VHDL 中的菜鸟也无济于事。但现在它工作正常,我终于可以睡觉了:D 再次感谢
    • 具有讽刺意味的是,如果 i 是一个变量,这将按预期工作。出现“问题”是因为i 不是变量...
    • 它...不是变量?毕竟(变量和信号)在 FPGA 上实现时都是某种物理信号,对吧?我认为它们的工作方式相同......有时 VHDL 就在我头上
    • 我不想在解决方案中提出 VHDL 变量。我考虑过创建一个变量 next_i 来保存 'i + step' 的值,但认为它只会混淆问题。一般来说,在顺序进程中坚持非阻塞分配是个好主意。 Benji,搜索“VHDL 信号变量”以了解差异。始终尝试了解您的代码所暗示的硬件。在模拟中起作用的东西并不总是在硬件上起作用。
    • 这个怎么样?它会在硬件上工作吗?我周一去了实验室,这个街区占了很大一部分……
    【解决方案2】:

    还有一件事... sine(样本数组)的声明实际上是创建组合电路(坏)还是在ROM内存中分配这些样本('好')?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-07-30
      • 1970-01-01
      • 1970-01-01
      • 2018-11-05
      • 2018-03-13
      • 2014-04-23
      • 1970-01-01
      相关资源
      最近更新 更多