闩锁
Vivado日志文件报告已识别闩锁的类型和大小。
推断锁存通常是HDL编码错误的结果,例如不完整的if或case声明。
Vivado synthesis针对以下报告示例中显示的实例发出警告。此警告允许您验证推断的Latch功能是否为预期功能。
 Latches Reporting Example  
 
 =========================================================================  
 
 * Vivado.log *  
 
 =========================================================================  
 
 WARNING: [Synth 8-327] inferring latch for variable 'Q_reg'  
 
 =========================================================================  
 
 Report Cell Usage:  
 
 -----+----+-----  
 
 |Cell|Count  
 
 -----+----+-----  
 
 2 |LD | 1  
 
 -----+----+-----  
 
 ===================================================================  
 
 Latch With Positive Gate and Asynchronous Reset  
 
 Coding Verilog Example  
 
 Filename: latches.v  
 
 // Latch with Positive Gate and Asynchronous Reset  
 
 // File: latches.v  
 
 module latches (  
 
 input G,  
 
 input D,  
 
 input CLR,  
 
 output reg Q  
 
 );  
 
 always @ *  
 
 begin  
 
 if(CLR)  
 
 Q = 0;  
 
 else if(G)  
 
 Q = D;  
 
 end  
 
 endmodule  
 
 Latch With Positive Gate and Asynchronous Reset  
 
 Coding VHDL Example  
 
 Filename: latches.vhd  
 
 -- Latch with Positive Gate and Asynchronous Reset  
 
 -- File: latches.vhd  
 
 library ieee;  
 
 use ieee.std_logic_1164.all;  
 
 entity latches is  
 
 port(  
 
 G, D, CLR : in std_logic;  
 
 Q : out std_logic  
 
 );  
  end latches;  
  architecture archi of latches is  
  begin  
  process(CLR, D, G)  
  begin  
  if (CLR = '1') then  
  Q <= '0';  
  elsif (G = '1') then  
  Q <= D;  
  end if;  
  end process;  
  end archi;  
 •三态缓冲器通常由信号或if-else结构建模。
•这适用于缓冲器驱动板上的内部总线还是外部总线设备所在的位置。
•在if-else的一个分支中,信号被分配了一个高阻抗值。下载编码示例中的编码示例文件。
三态实现
当驱动下列的
•电路的外部引脚(OBUFT)
•内部总线(BUFT):
○ 推断出的BUFT通过Vivado合成自动转换为LUT中实现的逻辑。
○ 当推断BUFT的内部总线驱动顶部模块的输出时,Vivado合成推断出OBUF。
三态报告示例
在合成过程中推断并报告三态缓冲液。
 =========================================================================  
  * Vivado log file *  
  =========================================================================  
  Report Cell Usage:  
  -----+-----+-----  
  |Cell |Count  
  -----+-----+-----  
  1 |OBUFT| 1  
  -----+-----+-----  
  =========================================================================  
  Tristate Description Using Concurrent Assignment Coding Verilog  
  Example  
  Filename: tristates_2.v  
  // Tristate Description Using Concurrent Assignment  
  // File: tristates_2.v  
  //  
  module tristates_2 (T, I, O);  
  input T, I;  
  output O;  
  assign O = (~T) ? I: 1'bZ;  
  endmodule  
  Tristate Description Using Combinatorial Process Implemented  
  with OBUFT Coding VHDL Example  
  Filename: tristates_1.vhd  
  -- Tristate Description Using Combinatorial Process  
  -- Implemented with an OBUFT (IO buffer)  
  -- File: tristates_1.vhd  
  --  
  library ieee;  
  use ieee.std_logic_1164.all;  
  entity tristates_1 is  
  port(  
  T : in std_logic;  
  I : in std_logic;  
  O : out std_logic  
  );  
  end tristates_1;  
  architecture archi of tristates_1 is  
  begin  
  process(I, T)  
  begin  
  if (T = '0') then  
  O <= I;  
  else  
  O <= 'Z';  
  end if;  
  end process;  
  end archi;  
  Tristate Description Using Combinatorial Always Block Coding  
  Verilog Example  
  Filename: tristates_1.v  
  // Tristate Description Using Combinatorial Always Block  
  // File: tristates_1.v  
  //  
  module tristates_1 (T, I, O);  
  input T, I;  
  output O;  
  reg O;  
  always @(T or I)  
  begin  
  if (~T)  
  O = I;  
  else  
  O = 1'bZ;  
  end  
  endmodule