在VHDL中从数组中选择元素

时间:2016-07-04 15:07:32

标签: arrays indexing vhdl

我有一个接收数组的组件:

library ieee;
use ieee.std_logic_1164.all; 
use ieee.numeric_std.all;
use work.index_pkg.all;

entity update_reg is
    port (
    index         : in integer;
    number_data   : in array_integer(9 downto 0);
    output_number : out integer;
);
end update_reg;

architecture behavior of update_reg is
begin
process1 : process(index, number_data)
begin
    output_number <= number_data(index);
end process;    
end architecture;

目的是在组件的输出处具有由索引指定的数组元素。我构建了以下tb来测试它的行为:

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
use work.index_pkg.all;


entity tb_update_reg is
end tb_update_reg;

architecture rtl of tb_update_reg is

component update_reg is
    port (
    index         : in integer;
    number_data   : in array_integer(9 downto 0);
    output_number : out integer
);
end component;

signal tb_index         : integer;
signal tb_number_data   : array_integer(9 downto 0);
signal tb_output_number : integer; 
begin
fill_process : process(tb_number_data)
begin
    for n in 0 to 9 loop
        tb_number_data(n) <= 10 - n;
    end loop;
end process;
stim_process : process
begin
    tb_index <= 6;
    wait for 2.0 ns;
    tb_index <= 0;
    wait for 2.0 ns;
    tb_index <= 9;
    wait for 2.0 ns;
    tb_index <= 4;
    wait for 2.0 ns;
    tb_index <= 1;
    wait for 2.0 ns;
end process;
upd_reg : update_reg
port map(
    index         => tb_index,
    number_data   => tb_number_data,
    output_number => tb_output_number
);
end architecture;

我添加了一个包,其中包含了数组整数的声明:

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;


package index_pkg is     
type array_integer is array (natural range <>) of integer;
end;

我希望数字为4/10/1/6/9。相反,模拟被冻结。我缺少一些方面吗?

如果有人能提供帮助,我将不胜感激。

1 个答案:

答案 0 :(得分:1)

您有两个问题:

i)您需要将信号tb_index初始化为6:

signal tb_index         : integer := 6;

在VHDL中,所有过程都在模拟开始时的0时执行。没有这样的初始化,你的设计中的这一行:

output_number <= number_data(index);

index信号被此行赋值之前执行:

tb_index <= 6;

因此,在第一个 delta周期上,index的值是整数的默认值,最左边的值( - 2 ^ 31-1) ,当然超出范围

ii)您需要stim_process进程底部的等待声明:

    wait for 2.0 ns;
    wait;
end process;

在VHDL中,所有进程都在不断循环。因此,stim_process进程循环回到顶部,因此您的模拟将永远运行。 VHDL中的wait;表示永远等待,这就是您需要的。

此外,您设计中的这一行还有一个额外的分号:

output_number : out integer;

它应该是:

output_number : out integer

http://www.edaplayground.com/x/3JaN