在可怕的_jeff 显示的生成循环方法中应谨慎使用。 generate 循环中的并发语句将导致一个单独的进程,每个生成的块中都有一个单独的驱动程序,这意味着您不能在不解析为元值的情况下从另一个进程为 cache_array(i) 分配 (33)。
如果不在单个进程中描述整个缓存操作,则生成循环方法通常没有用处。
还有第三种方法使用 AND 掩码,对于那些有编程背景的人来说很熟悉,用于将 cache_array(i)(33) 设置为 '0':
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;
因为它需要为类型 CacheArray 定义一个“与”运算符,所以它也导致为类型 CacheArray 生成一个 to_string 函数,它可以告诉我们缓存的内容:
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
第一个缓存值是初始值,第二个是“and”掩码的结果(注意我最初用'1'填充了cache_array以显示“and”有效)。
您可以为缓存字添加额外的字段分隔符,使其更易于阅读,并与特定基数使用等内容一起,注意您负责正确计算 retval 字符串长度并管理 retval 指针 (retptr) to_string 函数。您可以添加一个输出标题。您还可以在缓存行的基础上组织输出。 ...
除了报告语句之外,textio 还可以用于更好地控制输出和重定向到文本文件。两者都可以让您观察缓存状态,而无需借助读取波形显示。