访问 VHDL 进程内 for 循环中的一个变量



我想在 for 循环中增加一个变量,这表示条件语句在向量中为真的频率。知道 VHDL 中的 for 循环会创建 n 个并行实例,这些实例是否有可能"访问"一个变量?考虑到以下在模拟中运行良好的场景,我怀疑它在现实中是否也有效。有人可以澄清它在现实中是如何工作的吗?

variable_p : process(clk)
variable var : integer;
begin
if rising_edge(clk) then
var := 0;
for i in 0 to 7 loop
if some_vector(i) = '1' then
var := var + 1;
other_vector(var) <= '1';
end if;
end loop;
end if;

更新

我综合了以下设计:

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;
entity var_p is
Port (
clk : in std_logic;
some_vector : in std_logic_vector( 7 downto 0 );
other_vector : out std_logic_vector( 7 downto 0 )
);
end var_p;
architecture Behavioral of var_p is
begin
var_p : process( clk )
variable var : integer range 0 to 7;
begin
if rising_edge( clk ) then
var := 0;
for i in some_vector'range loop
if some_vector(i) = '1' then
var := var + 1;
other_vector(var) <= '1';
end if;
end loop;
end if;
end process;
end Behavioral;

这导致每个other_vector元素都有一个LUT,该LUT将几个some_vector元素[1]作为输入。由此我得出的结论是,对于some_vector中的每一个"1",var 确实会"递增"。我现在也更好地理解了变量只是用于确定 LUT 配置的辅助构造,而不是合成的任何内容。但是,如果我在这里错了,请纠正我,因为我仍然不能百分百确定。如果我手里拿着一块板子,我会尝试在现实中验证我的观察结果。

[1] https://i.stack.imgur.com/anrTb.jpg

当我终于找到我的 Basys3 板时,我可以尝试一下设计。事实上,综合和实现的设计可以按预期工作:

other_vector中的数字"1"与some_vector中的"1"数字完全相同。

在我的测试中,我将输入矢量连接到开关,将输出矢量连接到LED(见下文(。

这证实了在 for 循环的每个"迭代"中,对于每个元素 '1',var 都会递增。

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;
entity var_p is
Port (
CLK100MHZ : in std_logic;
sw : in std_logic_vector( 15 downto 0 );
LED : out std_logic_vector( 15 downto 0 )
);
end var_p;
architecture Behavioral of var_p is
begin
var_p : process( CLK100MHZ )
variable var : integer range 0 to 15;
begin
if rising_edge( CLK100MHZ ) then
var := 0;
LED <= ( others => '0' );
for i in SW'range loop
if sw( i ) = '1' then
var := var + 1;
LED( var ) <= '1';
end if;
end loop;
end if;
end process;
end Behavioral;

最新更新