VDHL循环与进程外部变量(如何是)



我如何避免变量在这个循环(进程外)?

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;

在你的实现上有很多不太正确的东西。完全不知道你想要完成什么,有一些事情与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将帮助它从非常耗时。

最新更新