问题描述
几乎没有使用 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 ...