微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

初始化 VHDL 数组元素

如何解决初始化 VHDL 数组元素

几乎没有使用 VHDL 和 Vivado 的经验,所以即使是最简单的东西也想学习。 我正在制作一个如下所示的 VHDL 数组:

type reg is array (0 to 15) of STD_LOGIC_VECTOR (15 downto 0);
signal reg_file : reg;

在我的 VHDL 代码中,我有一个执行以下操作的重置。 (不是整个身体,只是重置部分。

begin    
    process(Clock,Reset)
    begin
        if (Reset = '1') then -- Reset register values to default values
            reg_file(0) <= x"0000";
            -- reg_file(1) <= x"0001";
            reg_file(2) <= x"0000";
            reg_file(3) <= x"0000";
            reg_file(4) <= x"0000";
            reg_file(5) <= x"0000";
            reg_file(6) <= x"0000";
            reg_file(7) <= x"0000";
            reg_file(8) <= x"0000";
            reg_file(9) <= x"0000";
            reg_file(10) <= x"0000";
            reg_file(11) <= x"0000";
            -- reg_file(12) <= x"0000";
            reg_file(13) <= x"0000";
            reg_file(14) <= x"0000";
            reg_file(15) <= x"0000";

我已经注释掉了 reg_file(12) 因为我想将它初始化为某个值。我还想将 reg_file(1) 初始化为 1(然后将剩余的数组元素初始化为零)。上面的代码在有复位信号时工作,但我不确定如何只初始化某些数组元素。

有没有办法初始化某些 VHDL 数组元素?我见过的所有例子都是初始化整个数组。

解决方法

您可以像这样对作业进行分组:

if (reset = '1') then
  reg_file(0) <= (others => '0');
  -- skip 1
  reg_file(11 downto 2) <= (others => (others => '0'));
  -- skip 12
  reg_file(15 downto 13) <= (others => (others => '0'));
end if;

更好的解决方案是在数组或记录数组中描述寄存器文件的属性:

constant resetable : boolean_vector := (
  0 =>        true,1 =>        false,2 to 11 =>  true,12 =>       false,12 to 15 => true
);
if (reset = '1') then
  for i in reg_file'range loop
    if (resetable(i) = true) then
      reg_file <= (others => '0');
    end if;
  end loop;
end if;

那我为什么要提到配置的记录数组呢?也许您想定义重置值,它可能并不总是“000...000”。此外,您可能想要定义一个寄存器是否应该在读取或写入时自动清除,如果寄存器可以产生中断等...

,

除了 Paebbels 所说的之外,您必须意识到值是由序列中的最终赋值决定的

a <= '0';
a <= '1'; -- no error to overwrite,a = '1';

因此,您可以将所有内容都设置为 '0',然后以不同的方式更改您想要的索引

if (Reset = '1') then
  reg_file <= (others => (others => '0'));
  reg_file(1) <= x"DEAD";
  reg_file(12) <= x"BEEF";
else ...

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。