如何在此循环中避免变量(在过程之外)?
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;
答案 0 :(得分:1)
有很多事情在你的实施上并不完全正确。完全不知道你想要完成什么,有一些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的寄存器值将有助于它非常耗时。