VHDL循环与变量外的过程(如何)

时间:2013-06-17 13:29:14

标签: vhdl fpga hdl

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

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;

1 个答案:

答案 0 :(得分:1)

有很多事情在你的实施上并不完全正确。完全不知道你想要完成什么,有一些VHDL的东西应该被记住:

  • 每个开场白都必须有一个结束语。
  • 每个嵌套级别都必须有一个关闭语句来“取消嵌套”
  • 你不能将一个语句集(case internals)的部分放在另一个语句(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的寄存器值将有助于它非常耗时。