在VHDL中为数组部分赋值?
我有一个VHDL格式的数组在VHDL中为数组部分赋值?,vhdl,Vhdl,我有一个VHDL格式的数组 type CacheArray is array(0 to 15) of std_logic_vector(33 downto 0); signal cache_array: CacheArray := (others => (others => '0')); 我希望给这个数组赋值,这样每个索引只有一位被初始化。我怀疑这样的事情会起作用 cache_array(15 downto 0)(33) <= (others => '0'); 在某种
type CacheArray is array(0 to 15) of std_logic_vector(33 downto 0);
signal cache_array: CacheArray := (others => (others => '0'));
我希望给这个数组赋值,这样每个索引只有一位被初始化。我怀疑这样的事情会起作用
cache_array(15 downto 0)(33) <= (others => '0');
在某种意义上,这就像一个2D矩阵,我只想完全初始化一列。
除了一个接一个地分配位之外,还可以做什么呢?您收到第一个和第二个错误,因为您的类型声明为:
array(0 to 15)
但您对该类型实例使用的信号的分配:
cache_array(15 downto 0)
您应该为两者选择至
或至
最后一个错误是因为您正在将仅适用于位向量的(其他=>'0')
赋值给单个位。如果您想使特定位'0'
,只需将其分配给'0'
更一般地说,语法cache_数组(15到0)(33)
没有意义
根据您的评论和更新的问题,如果您希望在每个数组元素中分配一个特定位,则必须使用某种循环: 在流程内部:
for i in cache_array'range loop
cache_array(i)(33) <= '0';
end loop;
缓存中i的数组的范围循环
cache_array(i)(33)在generate loop方法中应谨慎使用。generate循环中的concurrent语句将导致一个单独的进程,在每个生成的块中都有一个单独的驱动程序,这意味着您不能从另一个进程为cache_数组(i)分配(33)而不解析为元值
如果不在单个进程中描述整个缓存操作,则生成循环方法通常不会有用
还有第三种方法,使用编程背景人员熟悉的方法和掩蔽,用于将cache_array(i)(33)设置为“0”:
第一个缓存值是初始值,第二个是“和”掩码的结果(注意我最初用“1”填充缓存_数组以显示“和”已工作)
您可以为缓存字添加额外的字段分隔符,以使其更易于读取,以及特定的基数用法,注意您负责正确计算retval字符串长度并在to_string函数中管理retval指针(retptr)。您甚至可以添加一个输出标题。您还可以基于缓存线组织输出
除了报表语句外,textio还可以用于更好地控制输出和重定向到文本文件。这两种方法都可以让您在不读取波形显示的情况下观察缓存状态。我想为数组的所有索引设置特定位'0'
。我尝试了这个比较(15到0)(32)@KalpeshKrishna好的,我只是想解释一下为什么你的代码会导致错误。请查看我的编辑。我不知道这些generate
语句。所有这些都会产生可合成的代码,对吗?这看起来真的很有用@KalpeshKrishna是的,循环和生成语句是可合成的。请注意,这两类循环都是展开的,因此在合成时必须知道循环边界。此外,这些循环在硬件中并行发生吗?或者它们是以顺序组合的方式工作的?
for i in cache_array'range loop
cache_array(i)(33) <= '0';
end loop;
GenerateLabel : for i in cache_array'range generate
cache_array(i)(33) <= '0';
end generate;
library ieee;
use ieee.std_logic_1164.all;
entity cache is
end entity;
architecture foo of cache is
type CacheArray is array(0 to 15) of std_logic_vector(33 downto 0);
signal cache_array: CacheArray := (others => (others => '1'));
constant MASK33: CacheArray := (others => (33 => '0', others => '1'));
function "and" (l,r: CacheArray) return CacheArray is
variable retval: CacheArray;
begin
for i in l'range loop
retval(i) := l(i) and r(i);
end loop;
return retval;
end function;
function to_string (arg: CacheArray) return string is
variable retval: string (1 to CacheArray'length * 36);
variable retptr: natural range 1 to CacheArray'length * 36;
begin
retptr := 1;
for i in arg'range loop
for j in arg(i)'range loop
if j = arg(i)'left then
retval(retptr) := LF;
retptr := retptr + 1;
retval(retptr) := HT;
retptr := retptr + 1;
end if;
retval(retptr) :=
character'VALUE(std_ulogic'IMAGE(arg(i)(j)));
if retptr < retval'length then
retptr := retptr + 1;
end if;
end loop;
end loop;
return retval;
end function;
begin
-- GenerateLabel:
-- for i in cache_array'range generate
-- cache_array(i)(33) <= '0';
-- end generate;
--
-- Clear_33:
-- process (cache_array)
-- begin
-- for i in cache_array'range loop
-- cache_array(i)(33) <= '0';
-- end loop;
-- end process;
MASK:
process (cache_array)
begin
cache_array <= cache_array and MASK33;
end process;
SHOW:
process (cache_array)
begin
report "cache_array = " & to_string(cache_array);
end process;
end architecture;
ghdl -r cache
cache.vhdl:67:9:@0ms:(report note): cache_array =
1111111111111111111111111111111111
1111111111111111111111111111111111
1111111111111111111111111111111111
1111111111111111111111111111111111
1111111111111111111111111111111111
1111111111111111111111111111111111
1111111111111111111111111111111111
1111111111111111111111111111111111
1111111111111111111111111111111111
1111111111111111111111111111111111
1111111111111111111111111111111111
1111111111111111111111111111111111
1111111111111111111111111111111111
1111111111111111111111111111111111
1111111111111111111111111111111111
1111111111111111111111111111111111
cache.vhdl:67:9:@0ms:(report note): cache_array =
0111111111111111111111111111111111
0111111111111111111111111111111111
0111111111111111111111111111111111
0111111111111111111111111111111111
0111111111111111111111111111111111
0111111111111111111111111111111111
0111111111111111111111111111111111
0111111111111111111111111111111111
0111111111111111111111111111111111
0111111111111111111111111111111111
0111111111111111111111111111111111
0111111111111111111111111111111111
0111111111111111111111111111111111
0111111111111111111111111111111111
0111111111111111111111111111111111
0111111111111111111111111111111111