1

如何避免此循环中的变量(过程之外)?

variable var1 : std_logic_vector (ADRESS_WIDTH-1 downto 0) := (others => '0');

        for i in 0 to ADRESS_WIDTH-2 loop
            var1 := var1 + '1';
            with r_addr select
             fifo_data_out <= array_reg(i) when var1,
        end loop;
        array_reg(ADRESS_WIDTH-1) when others;

此版本(正在进行中)也不正确 - 语法错误

process (r_addr, r_addr1, fifo_data_out, array_reg, r_data1)
variable var1 : std_logic_vector (ADRESS_WIDTH-1 downto 0) := (others => '0');

begin

case r_addr is
    when "0000000000" => fifo_data_out <= array_reg(0);
        for i in 1 to ADRESS_WIDTH-2 loop
            when var1 => fifo_data_out <= array_reg(i);
            var1 := var1 + '1';
        end loop;
     when others => fifo_data_out <= array_reg(ADRESS_WIDTH-1);
end case;
4

1 回答 1

1

在您的实施中,有很多事情并不完全正确。完全不知道您要完成的工作有一些关于 VHDL 的事情应该记住:

  • 每一个开场白都必须有一个闭幕词。
  • 每个嵌套级别都必须有一个结束语句来“取消嵌套”它
  • 您不能将一个语句集的部分(案例内部)放在另一条语句(for 循环)中,这看起来很奇怪,但请考虑一下,它将自己附加到什么案例。
  • VHDL 和硬件编程通常是可笑的并行,从一个迭代到下一个迭代过程完全独立于所有其他过程。

现在,查看您的代码,我知道您想要完成什么,这是一个完美的例子,说明为什么您应该了解一点另一种语言的脚本来帮助进行硬件级编程。在创建流程时,您应该尽可能具体,知道您想要完成什么以及在什么范围内完成,我知道这就像所有其他语言一样,但是硬件编程为您提供了所有工具来非常非常彻底地吊死自己。这是我可以从您的代码中得出的最好的清理方法。

async_process : process (r_addr, fifo_data_out, array_reg)

begin
    case r_addr is
        when "0000000000" => fifo_data_out <= array_reg(0);
        when "0000000001" => fifo_data_out <= array_reg(1);
        when "0000000002" => fifo_data_out <= array_reg(2);
        when others => fifo_data_out <= array_reg(ADRESS_WIDTH-1);
    end case;
end process;

r_addr_inc_process : process (clock <or other trigger>, reset)
    <This is where you would deal with the bounds of the register address.  
     If you still want to deal with that variable, do it here.>
end process;

因此,正如您从这里所看到的,您希望在处理流程时尽可能少地更新内容,这样您的敏感度列表就非常具体,并且您可以强制大多数更新同步发生而不是异步发生。您的异步进程可能是这样的原因是,每次更新 r_addr 时它都会更新,并且每次读取时钟或某个标志时都会发生这种情况,它会为您提供一致的重置状态。

通过该过程的迭代性,您可以看到使用脚本语言填充 100 个寄存器值将如何帮助它避免非常耗时。

于 2013-06-17T17:01:15.450 回答