Vhdl VDHL循环,过程外有变量(如何处理)

Vhdl VDHL循环,过程外有变量(如何处理),vhdl,fpga,hdl,Vhdl,Fpga,Hdl,如何避免此循环中的变量(在流程之外) 变量var1:std_logic_vector(地址宽度-1到0):=(其他=>'0'); 对于0中的i到地址_WIDTH-2循环 var1:=var1+'1'; 使用r_addr select fifo_data_out在您的实现中有很多不太正确的地方。完全不知道您想要实现什么VHDL有一些东西应该记住: 每个开场白都必须有一个结尾 每个嵌套级别都必须有一个结束语句来“取消嵌套” 您不能将一个语句集(case内部)的一部分放在另一个语句(for循环)中,

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

变量var1:std_logic_vector(地址宽度-1到0):=(其他=>'0');
对于0中的i到地址_WIDTH-2循环
var1:=var1+'1';
使用r_addr select

fifo_data_out在您的实现中有很多不太正确的地方。完全不知道您想要实现什么VHDL有一些东西应该记住:

  • 每个开场白都必须有一个结尾
  • 每个嵌套级别都必须有一个结束语句来“取消嵌套”
  • 您不能将一个语句集(case内部)的一部分放在另一个语句(for循环)中,这似乎很奇怪,但想想看,它要将自身附加到哪个case
  • 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;
async\u进程:进程(r\u addr、fifo\u data\u out、array\u reg)
开始
案例r_addr为

当“0000000000”=>fifo_数据_out fifo_数据_out fifo_数据_out fifo_数据_out时,在您的实现中有许多事情不太正确。完全不知道您想要实现什么VHDL有一些东西应该记住:

  • 每个开场白都必须有一个结尾
  • 每个嵌套级别都必须有一个结束语句来“取消嵌套”
  • 您不能将一个语句集(case内部)的一部分放在另一个语句(for循环)中,这似乎很奇怪,但想想看,它要将自身附加到哪个case
  • 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;
async\u进程:进程(r\u addr、fifo\u data\u out、array\u reg)
开始
案例r_addr为

当“0000000000”=>fifo\u数据输出fifo\u数据输出fifo\u数据输出fifo\u数据输出fifo\u数据输出如果我错了,请纠正我。“var1”不是一直都是吗!='0000…“在第行”fifo_data_out我认为你是正确的-这是一个草案-但我不知道如何正确地实现它:)这里面有很多东西让我有点畏缩,你的过程应该只在敏感度列表中有它依赖的东西,因此,如果您不希望每次更改数组时都对其进行调整,而不是将其放入其中,那么r_data1是什么,它甚至不在您的流程中的任何地方。另外,你想实现什么,它看起来像一个多路复用寄存器块,但我不是100%确定。您的案例可能应该是更具体的(即,每个案例项都是静态的,没有var1)s.t。您不会在演示中创建不必要的硬件。这正是我到目前为止注意到的。另外,如果你只是浏览数组中的寄存器列表,只需增加r_地址,当它达到“其他”状态时,将r_地址重置为0x000,如果这是一个真正基本的环形缓冲区,那将是你最好的方法。如果你证实我对你试图实施的东西的怀疑,我可能会把这变成一个答案。另外,我刚刚注意到,var1的for/embedded when语句确实有问题,每个嵌套步骤都必须关闭,所以语法有问题。为什么没有时钟呢?在大多数情况下,只有一个时钟会使一大堆事情变得更容易。如果我错了,请纠正我。“var1”不是一直都是吗!='0000…“在第行”fifo_data_out我认为你是正确的-这是一个草案-但我不知道如何正确地实现它:)这里面有很多东西让我有点畏缩,你的过程应该只在敏感度列表中有它依赖的东西,因此,如果您不希望每次更改数组时都对其进行调整,而不是将其放入其中,那么r_data1是什么,它甚至不在您的流程中的任何地方。另外,你想实现什么,它看起来像一个多路复用寄存器块,但我不是100%确定。您的案例可能应该是更具体的(即,每个案例项都是静态的,没有var1)s.t。您不会在演示中创建不必要的硬件。这正是我到目前为止注意到的。另外,如果你只是浏览数组中的寄存器列表,只需增加r_地址,当它达到“其他”状态时,将r_地址重置为0x000,如果这是一个真正基本的环形缓冲区,那将是你最好的方法。如果你证实我对你试图实施的东西的怀疑,我可能会把这变成一个答案。另外,我刚刚注意到,var1的for/embedded when语句确实有问题,每个嵌套步骤都必须关闭,所以语法有问题。为什么没有时钟呢?在大多数情况下,只有一个时钟会产生一堆
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;