我在我的 vhdl 文件中使用一个名为 A_reg_in 的信号,它正在转换为寄存器和锁存器。它的类型是 a_vector,这是一个 2×N 位数组的全局类型,其中 N 是 256。在我的过程语句中,我将信号 a0 分配给 A_reg_in 和 A_set_0,然后我需要将 A_reg_in 存储到 reg_nbit_a,这是一个自定义寄存器可以存储 a_vector 类型。当我在 Quartus Prime Lite Edition 中运行 Analysis and Synthesis 测试时,我收到以下警告消息:
警告(13004):可预置和可清除寄存器转换为带锁存器的等效电路。寄存器上电到未定义状态,DEVCLRn 将寄存器置于未定义状态。 警告 (13310):使用寄存器“load_a:LOAD_A|A_reg_in[0][0]~synth”和锁存器“load_a:LOAD_A|A_reg_in”将寄存器“load_a:LOAD_A|A_reg_in[0][0]”转换为等效电路[0][0]~合成器” 警告 (13310):使用寄存器“load_a:LOAD_A|A_reg_in[1][0]~synth”和锁存器“load_a:LOAD_A|A_reg_in”将寄存器“load_a:LOAD_A|A_reg_in[1][0]”转换为等效电路[1][0]~合成"
这些错误消息一直打印到 A_reg_in[N-1][0]。
当我将reg_nbit_a 的输入值指定为a0 时,我没有收到警告信息。因此,这让我相信将寄存器的输入分配为在过程语句中设置的信号是一个问题。
load_a.vhdl
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use work.globals_pkg.all;
entity load_a is
port(
clk : in std_logic;
rst : in std_logic;
load_a_ena : in std_logic;
enc_dec : in std_logic;
A_in : in std_logic_vector(N_SIZE-1 downto 0);
A_out : out a_vector
);
end entity;
architecture rtl of load_a is
signal a0 : a_vector;
signal A_reg_in : a_vector := (others=>(others=>'0'));
signal A_set_0 : a_vector := (others=>(others=>'0'));
begin
seq_logic: process(clk)
begin
if (rst = '1') then
A_set_0 <= a0;
A_reg_in <= a0;
else
if (rising_edge(clk)) then
A_set_0 <= a0;
A_reg_in <= a0;
end if;
end if;
end process seq_logic;
-- Sign A_in to create A0
SIGNED : for i in 0 to N_SIZE-1 generate
a0(i) <= '0' & A_in(N_SIZE-1-i);
end generate SIGNED;
REG_A : entity work.reg_nbit_a(rtl)
port map(
clk,
rst,
load_a_ena,
A_reg_in,
A_out
);
end rtl;
reg_nbit_a.vhdl
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use work.globals_pkg.all;
entity reg_nbit_a is
port (
clk : in std_logic;
rst : in std_logic;
ena : in std_logic;
d : in a_vector;
q : out a_vector
);
end entity;
architecture rtl of reg_nbit_a is
begin
process(clk)
begin
if (rst = '1') then
q <= (others=>(others=>'0'));
else
if (rising_edge(clk)) then
if (ena = '1') then
q <= d;
end if;
end if;
end if;
end process;
end rtl;