自学内容网 自学内容网

Xilinx FPGA :开发使用及 Tips 总结

Xilinx FPGA(Field Programmable Gate Array,现场可编程门阵列)是一种非常灵活且强大的硬件平台,广泛应用于数字信号处理、嵌入式系统、软件定义无线电等领域。以下是一些关于Xilinx FPGA开发使用的要点和技巧总结:

开发环境

  • Vivado Design Suite:这是Xilinx提供的主要开发工具,支持从设计输入到实现的完整流程。

设计流程

  1. 设计输入:可以通过原理图输入或HDL(如Verilog或VHDL)进行逻辑描述。
  2. 综合:将高层次的设计转换为低层次的网表文件。
  3. 实现:包括翻译、映射、布局布线等步骤,最终生成位流文件。
  4. 验证:使用仿真工具(如Vivado自带的仿真器)对设计进行功能验证。

使用技巧

  • 模块化设计:尽量保持设计的模块化,以便于复用和维护。
  • 时序约束:正确设置时序约束对于确保设计性能至关重要。可以使用XDC(Xilinx Design Constraints)文件来定义这些约束。
  • IP核利用:充分利用Xilinx提供的IP核(Intellectual Property cores),可以大大减少开发时间和复杂度。
  • 资源优化:注意LUTs、FFs、BRAM等资源的使用情况,合理分配以避免过度消耗。

开发使用及 Tips 总结

BUFG

Xilinx FPGA中全局时钟资源的使用方法

https://zhuanlan.zhihu.com/p/405879256
  • BUFG是全局时钟缓冲器,其输入是IBUFG的输出,BUFG的输出到达FPGA内部的IOB、CLB、选择性块RAM的时钟延迟和抖动最小。BUFG是具有高扇出的全局时钟缓冲器,一般由综合器自动推断并使用。BUFG可以通过综合器自动推断并使用,也可以通过原语例化完成
BUFG bufg_inst (
 .O (bufg_out), // 输出
  .I (bufg_in)   // 输入
);

BUFGCE

  • BUFGCE是带有时钟使能端的全局缓冲。它有一个输入I、一个使能端CE和一个输出端O。只有当BUFGCE的使能端CE有效(高电平)时,BUFGCE才有输出。 (带有时钟使能端的BUFG)
   BUFGCE_1 BUFGCE_1_inst (
      .O(O),   // 1-bit output: Clock output
      .CE(CE), // 1-bit input: Clock enable input for I0
      .I(I)    // 1-bit input: Primary clock
   );

BUFGCE和BUFGMUX的区别如下:
1.BUFGCE是时钟缓冲器,BUFGMUX是时钟选择器。
2.BUFGCE只有一个时钟输入,BUFGMUX有多个时钟输入。
3.BUFGCE的输出只有一个,BUFGMUX的输出也有多个。

BUFH / BUFHCE

  • The horizontal clock buffer 水平时钟缓冲器 在单个时钟区域中可以access到global clock lines,通过horizontal clock row(水平时钟缓冲器)
   BUFH BUFH_inst (
      .O(O), // 1-bit output: Clock output
      .I(I)  // 1-bit input: Clock input
   );
   
   BUFHCE #(
      .CE_TYPE("SYNC"), // "SYNC" (glitchless switching) or "ASYNC" (immediate switch)
      .INIT_OUT(0)      // Initial output value (0-1)
   )
   BUFHCE_inst (
      .O(O),   // 1-bit output: Clock output
      .CE(CE), // 1-bit input: Active high enable
      .I(I)    // 1-bit input: Clock input
   );

BUFR

  • BUFR是区域时钟缓冲器,要进入区域时钟网络,必须例化BUFR
   BUFR #(
      .BUFR_DIVIDE("BYPASS"),   // Values: "BYPASS, 1, 2, 3, 4, 5, 6, 7, 8" 
      .SIM_DEVICE("7SERIES")  // Must be set to "7SERIES" 
   )
   BUFR_inst (
      .O(O),     // 1-bit output: Clock output port
      .CE(CE),   // 1-bit input: Active high, clock enable (Divided modes only)
      .CLR(CLR), // 1-bit input: Active high, asynchronous clear (Divided modes only)
      .I(I)      // 1-bit input: Clock buffer input driven by an IBUF, MMCM or local interconnect
   );

IBUF/OBUF

  • 这两个BUF是用于将输入管脚送入FPGA内部(IBUF)以及将输出信号送出FPGA输出管脚(OBUF),注意,这里都在说管脚,对应的是外部管脚的意思,英文中叫PORT。
IBUF IBUF_rst_i0      (.I (rst_pin),      .O (rst_i));
OBUF OBUF_txd         (.I(txd_o),         .O(txd_pin));

IBUFDS/OBUFDS

   IBUFDS #(
      .DIFF_TERM("FALSE"),       // Differential Termination
      .IBUF_LOW_PWR("TRUE"),     // Low power="TRUE", Highest performance="FALSE" 
      .IOSTANDARD("DEFAULT")     // Specify the input I/O standard
   ) IBUFDS_inst (
      .O(O),  // Buffer output
      .I(I),  // Diff_p buffer input (connect directly to top-level port)
      .IB(IB) // Diff_n buffer input (connect directly to top-level port)
   );
   
      OBUFDS #(
      .IOSTANDARD("DEFAULT"), // Specify the output I/O standard
      .SLEW("SLOW")           // Specify the output slew rate
   ) OBUFDS_inst (
      .O(O),     // Diff_p output (connect directly to top-level port)
      .OB(OB),   // Diff_n output (connect directly to top-level port)
      .I(I)      // Buffer input
   );

IBUFG / IFBUFGDS

  • IBUFG
    即输入全局缓冲,是与专用全局时钟输入管脚相连接的首级全局缓冲。所有从全局时钟管脚输入的信号必须经过IBUF元,否则在布局布线时会报错。
  • IBUFG支持AGP、CTT、GTL、GTLP、HSTL、LVCMOS、LVDCI、LVDS、LVPECL、LVTTL、PCI、PCIX和SSTL等多种格式的IO标准 IBUFGDS 是IBUFG的差分形式,当信号从一对差分全局时钟管脚输入时,必须使用IBUFGDS作为全局时钟输入缓冲。IBUFG支持BLVDS、LDT、LVDSEXT、LVDS、LVPECL和ULVDS等多种格式的IO标准。
  • IBUFG + BUFG的使用方法: IBUFG后面连接BUFG的方法是最基本的全局时钟资源使用方法,由于IBUFG组合BUFG相当于BUFGP,所以在这种使用方法也称为BUFGP方法。
  • IBUFGDS + BUFG的使用方法: 当输入时钟信号为差分信号时,需要使用IBUFGDS代替
IBUFGDS #(
        .DIFF_TERM    ("TRUE" ),
        .IBUF_LOW_PWR ("FALSE")
    ) u_ibufg_clk_100 (
        .I  (FP_CLK_100M_P),
        .IB (FP_CLK_100M_N),
        .O  (clk_100m     )
);

IDDR

  • 参考链接

https://blog.csdn.net/weixin_39789553/article/details/114385676

  • IDDR是将1 bit的双沿采样输入转换为2bit的单沿采样输出,IDDR框图如下图所示,其中D为双沿采样输入端,C为时钟输入,CE为时钟使能,S为置位信号,R为复位信号,Q1和Q2单沿采样输出端。
IDDR #(
.DDR_CLK_EDGE("OPPOSITE_EDGE"), // "OPPOSITE_EDGE", "SAME_EDGE"
//    or "SAME_EDGE_PIPELINED"
.INIT_Q1(1'b0), // Initial value of Q1: 1'b0 or 1'b1
.INIT_Q2(1'b0), // Initial value of Q2: 1'b0 or 1'b1
.SRTYPE("SYNC") // Set/Reset type: "SYNC" or "ASYNC"
) IDDR_inst (
.Q1(Q1), // 1-bit output for positive edge of clock
.Q2(Q2), // 1-bit output for negative edge of clock
.C(C),   // 1-bit cloc

在这里插入图片描述

ODDR

  • ODDR是将2bit单沿采样输入转换为1bit的双沿采样输出,ODDR框图如下图所示,其中D1和D1为单沿采样输入端,C为时钟输入,CE为时钟使能,S为置位信号,R为复位信号,Q为双沿采样输出端。
   ODDR #(
      .DDR_CLK_EDGE("OPPOSITE_EDGE"), // "OPPOSITE_EDGE" or "SAME_EDGE" 
      .INIT(1'b0),    // Initial value of Q: 1'b0 or 1'b1  
      .SRTYPE("SYNC") // Set/Reset type: "SYNC" or "ASYNC" 
   ) ODDR_inst (
      .Q(Q),   // 1-bit DDR output
      .C(C),   // 1-bit clock input
      .CE(CE), // 1-bit clock enable input
      .D1(D1), // 1-bit data input (positive edge)
      .D2(D2), // 1-bit data input (negative edge)
      .R(R),   // 1-bit reset
      .S(S)    // 1-bit set
   );

在这里插入图片描述

IDELAY

  • 每个I/O都包含一个IDELAYE2的可编程的原语。IDELAY可以连接到后续的模块。
    IDLEAYE2可以根据抽头系数来调整延时。这个抽头系数对应的最小分辨率可以根据7系列的手册上来看。
  • 从参考手册上来看,还需要有个参考时钟。其实在实际使用中IDELAY这个原语的时候,还需要一个IDELAYCTRL这个原语配合使用。
    IDELAYCTRL 原语
  • 这个原语比较简单,一般都是配合着I/ODELAY原语来使用的。手册上写着,如果使用了IDELAYE2或者ODELAYE2原语,那么IDELAYCTRL原语必须被例化。IDLAYCTRL使用用户提供的REFCLK来校准IDELAY和ODELAY。也就是前面说的,具体的延时的值,是根据输入到IDELAYCTRL的参考时钟来确定的。
   IDELAYCTRL IDELAYCTRL_inst (
      .RDY(RDY),       // 1-bit output: Ready output
      .REFCLK(REFCLK), // 1-bit input: Reference clock input
      .RST(RST)        // 1-bit input: Active high reset input
   );
   IDELAYE2 #(
      .CINVCTRL_SEL("FALSE"),          // Enable dynamic clock inversion (FALSE, TRUE)
      .DELAY_SRC("IDATAIN"),           // Delay input (IDATAIN, DATAIN)
      .HIGH_PERFORMANCE_MODE("FALSE"), // Reduced jitter ("TRUE"), Reduced power ("FALSE")
      .IDELAY_TYPE("FIXED"),           // FIXED, VARIABLE, VAR_LOAD, VAR_LOAD_PIPE
      .IDELAY_VALUE(0),                // Input delay tap setting (0-31)
      .PIPE_SEL("FALSE"),              // Select pipelined mode, FALSE, TRUE
      .REFCLK_FREQUENCY(200.0),        // IDELAYCTRL clock input frequency in MHz (190.0-210.0, 290.0-310.0).
      .SIGNAL_PATTERN("DATA")          // DATA, CLOCK input signal
   )
   IDELAYE2_inst (
      .CNTVALUEOUT(CNTVALUEOUT), // 5-bit output: Counter value output
      .DATAOUT(DATAOUT),         // 1-bit output: Delayed data output
      .C(C),                     // 1-bit input: Clock input
      .CE(CE),                   // 1-bit input: Active high enable increment/decrement input
      .CINVCTRL(CINVCTRL),       // 1-bit input: Dynamic clock inversion input
      .CNTVALUEIN(CNTVALUEIN),   // 5-bit input: Counter value input
      .DATAIN(DATAIN),           // 1-bit input: Internal delay data input
      .IDATAIN(IDATAIN),         // 1-bit input: Data input from the I/O
      .INC(INC),                 // 1-bit input: Increment / Decrement tap delay input
      .LD(LD),                   // 1-bit input: Load IDELAY_VALUE input
      .LDPIPEEN(LDPIPEEN),       // 1-bit input: Enable PIPELINE register to load data input
      .REGRST(REGRST)            // 1-bit input: Active-high reset tap-delay input
   );

ODELAY

ODELAY级联中间必须穿插IDELAY,而且使用的参考时钟频率必须为200M,300M和400M需要和片子的速度等级匹配。

   ODELAYE2 #(
      .CINVCTRL_SEL("FALSE"),          // Enable dynamic clock inversion (FALSE, TRUE)
      .DELAY_SRC("ODATAIN"),           // Delay input (ODATAIN, CLKIN)
      .HIGH_PERFORMANCE_MODE("FALSE"), // Reduced jitter ("TRUE"), Reduced power ("FALSE")
      .ODELAY_TYPE("FIXED"),           // FIXED, VARIABLE, VAR_LOAD, VAR_LOAD_PIPE
      .ODELAY_VALUE(0),                // Output delay tap setting (0-31)
      .PIPE_SEL("FALSE"),              // Select pipelined mode, FALSE, TRUE
      .REFCLK_FREQUENCY(200.0),        // IDELAYCTRL clock input frequency in MHz (190.0-210.0, 290.0-310.0).
      .SIGNAL_PATTERN("DATA")          // DATA, CLOCK input signal
   )
   ODELAYE2_inst (
      .CNTVALUEOUT(CNTVALUEOUT), // 5-bit output: Counter value output
      .DATAOUT(DATAOUT),         // 1-bit output: Delayed data/clock output
      .C(C),                     // 1-bit input: Clock input
      .CE(CE),                   // 1-bit input: Active high enable increment/decrement input
      .CINVCTRL(CINVCTRL),       // 1-bit input: Dynamic clock inversion input
      .CLKIN(CLKIN),             // 1-bit input: Clock delay input
      .CNTVALUEIN(CNTVALUEIN),   // 5-bit input: Counter value input
      .INC(INC),                 // 1-bit input: Increment / Decrement tap delay input
      .LD(LD),                   // 1-bit input: Loads ODELAY_VALUE tap delay in VARIABLE mode, in VAR_LOAD or
                                 // VAR_LOAD_PIPE mode, loads the value of CNTVALUEIN

      .LDPIPEEN(LDPIPEEN),       // 1-bit input: Enables the pipeline register to load data
      .ODATAIN(ODATAIN),         // 1-bit input: Output delay data input
      .REGRST(REGRST)            // 1-bit input: Active-high reset tap-delay input
   );

ISERDES/OSERDES

  • ISERDES模块的作用在于实现高速源同步输入数据的串并转换。
  • OSERDES模块的作用在于实现高速源同步输出数据的并串转换。

https://blog.csdn.net/Shawind_Wang/article/details/103892500

RAM

  • DRAM并不是动态存储器,而是分布式存储器,与BRAM区别在于,DRAM通过FPGA中的查找表拼凑形成,而BRAM是FPGA中整块双口RAM资源
  • ECC Options:只有Simple Dual-port RAM时,该选项才可用,IP核支持内置的汉明纠错功能(Built-in Hamming Error Correction Capability(BuiltIn ECC)),且支持数据位宽小于64位的软汉明纠错(soft ECC)

https://blog.csdn.net/qushuo123/article/details/107817062


原文地址:https://blog.csdn.net/weixin_43817186/article/details/145241278

免责声明:本站文章内容转载自网络资源,如侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!