分配记录VHDL

时间:2017-10-24 09:40:09

标签: arrays vhdl record xilinx intel-fpga

大家的好时光。

我心不在焉地尝试改进新项目中的代码,并找到了一些有趣的解码器。 它有2个过程:首先形成所有数据,第二个所有总线由控制信号在输出寄存器中触发。但有些电线需要在一段时间内复位(在第二个过程中)。

所以我希望为正确的resettind编写这段代码一些信号([cm_regA / cm_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;
----------------------------------------

但是这个结构在reg_5 ... reg_10之间合成了很多多路复用器,所以下一个代码给了我很好的综合结构和很快的速度:

----------------------------------------
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_regA / cm_regB]进行任何更改(如果更改了第一个进程并忘记将此更改添加到LOAD_DATA_PROCESS)?
  3. P.S。 cm_regA和cm_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 个答案:

答案 0 :(得分:0)

对于您的第一个代码,您的确为reset reg_5添加了对reg_10的依赖关系。这是因为if-else语句。这是您为这些寄存器编写的有效代码。

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;