在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'); 在某种

我有一个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');
在某种意义上,这就像一个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