信号在VHDL中转换成寄存器和锁存器

问题描述 投票:0回答:0

我在我的 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;
signals vhdl quartus countdownlatch
© www.soinside.com 2019 - 2024. All rights reserved.