代码之家  ›  专栏  ›  技术社区  ›  Nikolay Josh Konovalenko

分配记录VHDL

  •  0
  • Nikolay Josh Konovalenko  · 技术社区  · 6 年前

    祝大家玩得愉快。

    最近,我试图改进新项目中的代码,并发现了一些有趣的解码器。 它有两个过程:第一个过程中形成的所有数据,第二个过程中由控制信号触发的所有总线输入输出寄存器。但有些导线需要在一段时间内重置(在第二个过程中)。

    因此,我决定编写此代码以正确重置某些信号([cm\u regA/cm\u regB]是具有不同类型数据的记录):

    ----------------------------------------
    LOAD_DATA_PROCESS: process(clk_i)
    begin
      if rising_edge(clk_i) then
        if (reset_reg) then
          cm_regB.reg_1 <= '0';
          cm_regB.reg_2 <= '0';
          cm_regB.reg_3 <= '0';
          cm_regB.reg_4 <= '0';
        else
          if (load_reg) then
            cm_regB <= cm_regA;
          else null;
          end if;
        end if;
      end if;
    end process;
    ----------------------------------------
    

    ----------------------------------------
    LOAD_DATA_PROCESS: process(clk_i)
    begin
      if rising_edge(clk_i) then
        if (reset_reg) then
          cm_regB.reg_1 <= '0';
          cm_regB.reg_2 <= '0';
          cm_regB.reg_3 <= '0';
          cm_regB.reg_4 <= '0';
        else
          if (load_reg) then
            cm_regB.reg_1 <= cm_regA.reg_1;
            cm_regB.reg_2 <= cm_regA.reg_2;
            cm_regB.reg_3 <= cm_regA.reg_3;
            cm_regB.reg_4 <= cm_regA.reg_4;
          else null;
          end if;
        end if;
    
        if (load_reg) then
          cm_regB.reg_5  <= cm_regA.reg_5;
          cm_regB.reg_6  <= cm_regA.reg_6;
          cm_regB.reg_7  <= cm_regA.reg_7;
          cm_regB.reg_8  <= cm_regA.reg_8;
          cm_regB.reg_9  <= cm_regA.reg_9;
          cm_regB.reg_10  <= cm_regA.reg_10;
        else null;
        end if;
    
      end if;
    end process;
    ----------------------------------------
    

    接下来的问题是:

    1. 如何使此结构更紧凑(如第一个示例)?
    2. 或者如何使总线[cm\u regA/cm\u regB]中的任何更改可见,例如(在更改第一个进程并忘记将此更改添加到LOAD\u DATA\u进程的情况下)?

    P、 美国。cm\U regA和cm\U regB的类型在包中声明。这是:

    ----------------------------------------
    type cm_t is record
        reg_1   : STD_LOGIC;
        reg_2   : STD_LOGIC;
        reg_3   : STD_LOGIC;   
        reg_4   : STD_LOGIC;
        reg_5   : STD_LOGIC;
        reg_6   : BOOLEAN;
        reg_7   : STD_LOGIC;
        reg_8   : STD_LOGIC;
        reg_9   : STD_LOGIC_VECTOR(CONST_1-1 downto 0);
        reg_10  : STD_LOGIC_VECTOR(CONST_2-1 downto 0);
    end record cm_t;
    ----------------------------------------
    
    1 回复  |  直到 6 年前
        1
  •  0
  •   JHBonarius    6 年前

    在您的第一个代码中,您确实在向 reset 对于 reg_5 reg_10

    if not(reset_reg) and load_reg then
        cm_regB.reg_5 <= cm_regA.reg_5;
        [...]
        cm_regB.reg_10 <= cm_regA.reg_10;
    end if;
    

    因此,您应该将重置块与其他赋值分开。您可以通过使用以下事实来实现这一点:对于信号 只有最后一个作业

    LOAD_DATA_PROCESS: process(clk_i)
    begin
        if rising_edge(clk_i) then
            if load_reg then
                cm_regB <= cm_regA;
            end if;
            if reset_reg then
                cm_regB.reg_1 <= '0';
                cm_regB.reg_2 <= '0';
                cm_regB.reg_3 <= '0';
                cm_regB.reg_4 <= '0';
            end if;
        end if;
    end process;