Intel® Quartus® Prime Standard Edition用户指南: 部分重配置

ID 683499
日期 9/24/2018
Public
文档目录

1.5. PR区域的冻结逻辑(Freeze Logic)

使用部分重配置时,必须冻结PR区域的所有非全局输入,全局时钟除外。 本地路由的信号不被视为全局信号,也必须在部分重配置期间冻结。冻结(Freezing)是指在那些PR区域输入上驱动一个'1'。当开始一个部分重配置进程时,芯片处于用户模式,器件仍在运行。

在设计中例化Altera PR IP core时,IP包括一个冻结端口,您可以使用此端口冻结PR区域的非全局输入。如果您的设计中有多个PR区域,那么必须创建解码逻辑,只冻结正在进行部分重配置的PR区域的输入。

如果没有使用Altera PR IP,那么必须包含逻辑,以便按照正确操作的要求冻结设计中PR区域的输入。

冻结PR区域的所有非全局输入可确保当前值之间不会存在争用,争用的存在可能会导致部分重配置完成后设计的意外行为。进入PR区域的全局信号不应冻结成高电平。 Intel® Quartus® Prime软件冻结PR区域的输出;因此PR区域之外的逻辑不受影响。

图 9. PR区域边界上的冻结

在部分重配置期间,静态区域逻辑不应该依赖于PR区域的输出处于特定逻辑电平,以实现静态区域的继续操作。

控制PR区域的输入的最简单方法是在RTL中创建PR区域的wrapper。除了将所有输入冻结为高电平外,如果设计需要,那么也可以将PR模块的输出驱动到一个特定值。例如,如果输出驱动一个高电平有效(active high)的信号,那么wrapper可能将输出冻结到GND。当PR区域通过PR获得新的角色时,确保静态区域不会停滞或进入不确定状态。

以下示例在Verilog HDL中实现一个freeze wrapper (在名为pr_module的模块上)。

module freeze_wrapper 
(
 input reset,      // global reset signal 
 input freeze,     // PR process active, generated by user logic 
 input clk1,       // global clock signal
 input clk2,       // non-global clock signal 
 input [3:0] control_mode, 
 input [3:0] framer_ctl, 
 output [15:0] data_out 
);
wire [3:0]control_mode_wr, framer_ctl_wr;
wire clk2_to_wr;
//instantiate pr_module
pr_module pr_module
(
 .reset (reset),                   //input
 .clk1 (clk1),                     //input, global clock
 .clk2 (clk2_to_wr),               // input, non-global clock
 .control_mode (control_mode_wr),  //input
 .framer_ctl (framer_ctl_wr),      //input
 .pr_module_out (data_out)         // collection of outputs from pr_module
);

// Freeze all inputs

assign control_mode_wr = freeze ? 4'hF: control_mode;
assign framer_ctl_wr = freeze ? 4'hF: framer_ctl;
assign clk2_to_wr = freeze ? 1'b1 : clk2;

endmodule

以下示例在VHDL中实现一个freeze wrapper (在名为pr_module的模块上)。

entity freeze_wrapper is
port( 
     reset:in STD_LOGIC;      -- global reset signal
     freeze:in STD_LOGIC;
     clk1: in STD_LOGIC;      -- global signal
     clk2: in STD_LOGIC;      -- non-global signal
     control_mode: in STD_LOGIC_VECTOR (3 downto 0);
     framer_ctl: in STD_LOGIC_VECTOR (3 downto 0);
     data_out: out STD_LOGIC_VECTOR (15 downto 0)
    );
end freeze_wrapper;

architecture behv of freeze_wrapper is
  
  component pr_module
  port(
       reset:in STD_LOGIC;
       clk1:in STD_LOGIC;
       clk2:in STD_LOGIC;
       control_mode:in STD_LOGIC_VECTOR (3 downto 0);
       framer_ctl:in STD_LOGIC_VECTOR (3 downto 0);
       pr_module_out:out STD_LOGIC_VECTOR (15 downto 0)
      );
  end component
 
  signal control_mode_wr: in STD_LOGIC_VECTOR (3 downto 0);
  signal framer_ctl_wr : in STD_LOGIC_VECTOR (3 downto 0);
  signal clk2_to_wr : STD_LOGIC;
  signal data_out_temp : STD_LOGIC_VECTOR (15 downto 0);
  signal logic_high : STD_LOGIC_VECTOR (3 downto 0):="1111";

  begin 
    data_out(15 downto 0) <= data_out_temp(15 downto 0);
 
  m_pr_module: pr_module 
     port map (
               reset => reset, 
               clk1 => clk1, 
               clk2 => clk2_to_wr, 
               control_mode =>control_mode_wr,
               framer_ctl => framer_ctl_wr,
               pr_module_out => data_out_temp);
               -- freeze all inputs

  control_mode_wr <= logic_high when (freeze ='1') else control_mode;
  framer_ctl_wr <= logic_high when (freeze ='1') else framer_ctl;
  clk2_to_wr <= logic_high(0) when (freeze ='1') else clk2;

end architecture;