Xilinx原语的使用

这篇具有很好参考价值的文章主要介绍了Xilinx原语的使用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、什么是原语?

原语,英文名称primitive,是FPGA软件集成开发环境所提供的一系列底层逻辑功能单元。由于是底层逻辑功能单元,所以它们往往跟目标FPGA芯片以及芯片厂商紧密相关,因此不同厂商、不同器件的原语往往不能通用。当编译器对我们的HDL代码进行编译时,其中间环节的一些输出往往就是由原语组成的逻辑网表。因此,原语往往是不参与综合过程的,而使用原语描述的逻辑往往也不会被综合工具所优化。例如,Xilinx公司的ISE软件集成开发环境中的unisims库中定义了所有用于综合的原语,而simprims库中则定义了所有用于实现的原语。需要注意的是,在ISE安装目录下的verilog\src\unisims或verilog\src\simprims文件夹下去看这些原语的代码,可以发现其实这些并不是真正的原语,而是在原语的基础上又封装了一层,不过人们常常将它们也泛称为原语。

二、原语的使用

时钟相关原语

如果时钟信号不是由FPGA芯片的专用时钟pin(或pad)引入FPGA的,那么它通常就需要在FPGA内部被显式的连接到时钟树资源上,否则,直接使用这种不经过时钟树的时钟信号,会给FPGA设计的时序带来非常麻烦的问题,进而导致逻辑行为失败。

可是HDL代码仅仅描述功能,无法向编译器表达“希望将某一时钟信号连接到时钟树资源”这样的一层意思,那么此时,就需要使用类似BUFG这样的库里提供的底层模块来进行指示。例如:

// Verilog example
wire innerclk, gclk;

BUFG onToGlobalClockTree(
		.I (innerclk),
    .O (gclk)
);

always@(posedge gclk)
begin
    ……
end

通过显式调用BUFG这样一个库中的底层模块,就可以告诉编译器,我们希望将innerclk信号引入全局时钟树,而其经过全局时钟树后的名字就改为gclk。后续HDL代码便可以放心的基于gclk编写逻辑。需要说明的是,直接从全局时钟pin(或pad)引入的时钟信号,对于xilinx的FPGA芯片来说,实际上是通过IBUFG+BUFG这样的组合直接连接到全局时钟树上的,只不过此时我们不需要显式例化这两个原语。

类似的时钟相关原语还有BUFR、BUFIO等,它们分别对应区域时钟树和IO时钟树资源,暂没看。。。

差分输入、输出原语

FPGA的接口具有单端和差分两种形式,同样,HDL代码只能描述功能,无法表达“某两个pin(或pad)脚互为一个差分对”这样的一层意思。那么此时,就需要使用类似IBUFDS、IBUFGDS、OBUFDS这样的库里提供的底层模块或原语来进行指示。

其中IBUFDS、和OBUFDS都是差分信号缓冲器,用于不同电平接口之间的缓冲和转换。IBUFDS 用于差分输入,OBUFDS用于差分输出。

  • IBUFDS是差分输入缓冲器,支持低压差分信号(如LVCMOS、LVDS等)。在IBUFDS中,一个电平接口用两个独特的电平接口(I和IB)表示。一个可以认为是主信号,另一个可以认为是从信号。
  • OBUFDS 是一个差分输出缓冲器,用于将来自 FPGA 内部逻辑的信号转换成差分信号输出,支持 TMDS、LVDS等电平标准。它的输出用O和OB两个独立接口表示。一个可以认为是主信号,另一个可以认为是从信号。

用法:

//------------------------------------------------------------------------
//--IBUFDS测试模块
//------------------------------------------------------------------------
//------------<模块及端口声明>----------------------------------------
module IBUFDS_test(
	input	clk		,		        //时钟,50M
	input	rst_n	,		        //复位,低电平有效
	input	data_p	,		        //输入数据,差分+
	input	data_n	,		        //输入数据,差分-
	
	output	out	
);
//------------<例化原语>----------------------------------------		
IBUFDS #(
	.DIFF_TERM		("FALSE")	,   // Differential Termination
	.IBUF_LOW_PWR	("TRUE")	,   // Low power="TRUE", Highest performance="FALSE" 
	.IOSTANDARD		("DEFAULT")	 	// 选择I/O电平标准,这里选择默认
) 
IBUFDS_inst (
	.O				(out)		,   // 输出
	.I				(data_p)	,   // 差分输入+(需要直接连接到顶层端口)
	.IB				(data_n)      	// 差分输入-(需要直接连接到顶层端口)
);
 
endmodule
//------------------------------------------------------------------------
//--OBUFDS测试模块
//------------------------------------------------------------------------
//------------<模块及端口声明>----------------------------------------
module OBUFDS_test(
	input	clk		,		//时钟,50M
	input	rst_n	,		//复位,低电平有效
	input	data	,		//输入数据
	
	output	out_p	,		//输出数据,差分+
	output	out_n			//输出数据,差分-
);
//------------<例化原语>----------------------------------------		
OBUFDS #(
	.IOSTANDARD		("DEFAULT")	, 	// 选择I/O电平标准,这里选择默认
	.SLEW			("SLOW")     	// 选择输出速率,这里选择SLOW
) 
OBUFDS_inst (
	.O				(out_p)		,   // 差分输出+(需要直接连接到顶层端口)
	.OB				(out_n)		,   // 差分输出-(需要直接连接到顶层端口)
	.I				(data)      	// 输入
);
 
endmodule

接口相关原语

当需要使用接口资源中的寄存器来实现高速数据采集时,如果直接调用相关的原语,编译器便会利用接口资源中的寄存器来做事情。例如,使用ODDR、IDDR、IDDR2CLK、ISERDES、OSERDES等原语后,编译器便会利用接口资源的寄存器来实现相关接口功能,这样便能达到比较高的性能。例如:

// Verilog example
ISERDES_NODELAY #(
    .BITSLIP_ENABLE("FALSE"),  // "TRUE"/"FALSE" to enable bitslip controller 
                           // Must be "FALSE" if INTERFACE_TYPE set to "MEMORY" 
        .DATA_RATE("DDR"),  // Specify data rate of "DDR" or "SDR" 
        .DATA_WIDTH(4),     // Specify data width - 
                            // NETWORKING SDR: 2, 3, 4, 5, 6, 7, 8 : DDR 4, 6, 8, 10
                            // MEMORY SDR N/A : DDR 4
        .INTERFACE_TYPE("MEMORY"), // Use model - "MEMORY" or "NETWORKING" 
        .NUM_CE(2),             // Number of clock enables used, 1 or 2
        .SERDES_MODE("MASTER") // Set SERDES mode to "MASTER" or "SLAVE" 
) is0 (
        .Q1(data0Line[0]),      // 1-bit registered SERDES output
        .Q2(data0Line[1]),      // 1-bit registered SERDES output
        .Q3(data0Line[2]),      // 1-bit registered SERDES output
        .Q4(data0Line[3]),      // 1-bit registered SERDES output
        .Q5(data0Line[4]),      // 1-bit registered SERDES output
        .Q6(data0Line[5]),      // 1-bit registered SERDES output
        .SHIFTOUT1(open),   // 1-bit cascade Master/Slave output
        .SHIFTOUT2(open),   // 1-bit cascade Master/Slave output
        .BITSLIP(1'b0),         // 1-bit Bitslip enable input
        .CE1(1'b1),             // 1-bit clock enable input
        .CE2(1'b1),             // 1-bit clock enable input
        .CLK(clkFast),          // 1-bit master clock input
        .CLKB(clkFastInvert),   // 1-bit secondary clock input for DATA_RATE=DDR
        .CLKDIV(clkSlow),       // 1-bit divided clock input
        .D(din),                // 1-bit data input, connects to IODELAY or input buffer
        .OCLK('0'),             // 1-bit fast output clock input
        .RST(rst),             // 1-bit asynchronous reset input
        .SHIFTIN1(1'b0),    // 1-bit cascade Master/Slave input
        .SHIFTIN2(1'b0)     // 1-bit cascade Master/Slave input
);

使用上述原语后,编译器便会利用接口资源中的寄存器实现一个针对输入接口的高性能1:6串并转换器。当然了,为了保证串并处理的成功,仅仅使用ISERDES原语还远远不够,时钟信号也必须按照要求来处理,具体的要求大家可以去查阅Xilinx公司相应器件的用户手册。

三、用原语标识IP核的好处

其实,FPGA软件集成开发环境中提供的IP核基本上都具有原语的表示形式。相比于调用IP核智能生成器对IP核进行配置、生成、例化等一系列过程,直接通过原语调用显得要简便得多,当然了,前提是你要对IP核的各个属性和参数配置比较熟悉。尤其是碰到版本升级或者整体细微修改这样的情况,如果采用在HDL中调用原语的方式,将会使修改的工作量大大降低。

// Verilog example
BUFG BUFG_COut0(.I (pllClkOut0), .O (clkOut0));
BUFG BUFG_FB(.I (feedBack), .O (feedBackG));
PLL_ADV #(
    .BANDWIDTH("OPTIMIZED"),        // "HIGH", "LOW" or "OPTIMIZED" 
    .CLKFBOUT_MULT(7),          // Multiplication factor for all output clocks
    .CLKFBOUT_PHASE(0.0),       // Phase shift (degrees) of all output clocks
    .CLKIN1_PERIOD(16.67),          // Clock period (ns) of input clock on CLKIN1
    .CLKIN2_PERIOD(10.00),          // Clock period (ns) of input clock on CLKIN2
    .CLKOUT0_DIVIDE(1),         // Division factor for CLKOUT0 (1 to 128)
    .CLKOUT0_DUTY_CYCLE(0.5),   // Duty cycle for CLKOUT0 (0.01 to 0.99)
    .CLKOUT0_PHASE(45.0),       // Phase shift (degrees) for CLKOUT0 (0.0 to 360.0)
    .CLKOUT1_DIVIDE(1),         // Division factor for CLKOUT1 (1 to 128)
    .CLKOUT1_DUTY_CYCLE(0.5),   // Duty cycle for CLKOUT1 (0.01 to 0.99)
    .CLKOUT1_PHASE(0.0),        // Phase shift (degrees) for CLKOUT1 (0.0 to 360.0)
    .CLKOUT2_DIVIDE(1),         // Division factor for CLKOUT2 (1 to 128)
    .CLKOUT2_DUTY_CYCLE(0.5),   // Duty cycle for CLKOUT2 (0.01 to 0.99)
    .CLKOUT2_PHASE(0.0),        // Phase shift (degrees) for CLKOUT2 (0.0 to 360.0)
    .CLKOUT3_DIVIDE(1),         // Division factor for CLKOUT3 (1 to 128)
    .CLKOUT3_DUTY_CYCLE(0.5),   // Duty cycle for CLKOUT3 (0.01 to 0.99)
    .CLKOUT3_PHASE(0.0),        // Phase shift (degrees) for CLKOUT3 (0.0 to 360.0)
    .CLKOUT4_DIVIDE(1),         // Division factor for CLKOUT4 (1 to 128)
    .CLKOUT4_DUTY_CYCLE(0.5),   // Duty cycle for CLKOUT4 (0.01 to 0.99)
    .CLKOUT4_PHASE(0.0),        // Phase shift (degrees) for CLKOUT4 (0.0 to 360.0)
    .CLKOUT5_DIVIDE(1),         // Division factor for CLKOUT5 (1 to 128)
    .CLKOUT5_DUTY_CYCLE(0.5),   // Duty cycle for CLKOUT5 (0.01 to 0.99)
    .CLKOUT5_PHASE(0.0),        // Phase shift (degrees) for CLKOUT5 (0.0 to 360.0)
    .COMPENSATION("SYSTEM_SYNCHRONOUS"), 
                                // "SYSTEM_SYNCHRONOUS", 
                                // "SOURCE_SYNCHRONOUS", "INTERNAL", 
                                // "EXTERNAL", "DCM2PLL", "PLL2DCM" 
    .DIVCLK_DIVIDE(1),              // Division factor for all clocks (1 to 52)
    .EN_REL("FALSE"),               // Enable release (PMCD mode only)
    .PLL_PMCD_MODE("FALSE"),    // PMCD Mode, TRUE/FASLE
    .REF_JITTER(0.100),             // Input reference jitter (0.000 to 0.999 UI%)
    .RST_DEASSERT_CLK("CLKIN1")     // In PMCD mode, clock to synchronize RST release
) PLL_ADV_inst (
    .CLKFBDCM(open),            // Output feedback signal used when PLL feeds a DCM
    .CLKFBOUT(feedBack),      // General output feedback signal
    .CLKOUT0(pllClkOut0),       // One of six general clock output signals
    .CLKOUT1(open),         // One of six general clock output signals
    .CLKOUT2(open),         // One of six general clock output signals
    .CLKOUT3(open),         // One of six general clock output signals
    .CLKOUT4(open),         // One of six general clock output signals
    .CLKOUT5(open),         // One of six general clock output signals
    .CLKOUTDCM0(open),          // One of six clock outputs to connect to the DCM
    .CLKOUTDCM1(open),          // One of six clock outputs to connect to the DCM
    .CLKOUTDCM2(open),          // One of six clock outputs to connect to the DCM
    .CLKOUTDCM3(open),          // One of six clock outputs to connect to the DCM
    .CLKOUTDCM4(open),          // One of six clock outputs to connect to the DCM
    .CLKOUTDCM5(open),          // One of six clock outputs to connect to the DCM
    .DO(open),                  // Dynamic reconfig data output (16-bits)
    .DRDY(open),                // Dynamic reconfig ready output
    .LOCKED(locked),          // Active high PLL lock signal
    .CLKFBIN(feedBackG),        // Clock feedback input
    .CLKIN1(clkIn),             // Primary clock input
    .CLKIN2(1'b0),              // Secondary clock input
    .CLKINSEL(1'b1),            // Selects '1' = CLKIN1, '0' = CLKIN2
    .DADDR(5'b0),               // Dynamic reconfig address input (5-bits)
    .DCLK(1'b0),              // Dynamic reconfig clock input
    .DEN(1'b0),                 // Dynamic reconfig enable input
    .DI(16'b0),                 // Dynamic reconfig data input (16-bits)
    .DWE(1'b0),             // Dynamic reconfig write enable input
    .REL(1'b0),                 // Clock release input (PMCD mode only)
    .RST(rst)                   // Asynchronous PLL reset
);

如果需要将锁相环的倍频系数改为5的话,直接修改CLKFBOUT_MULT属性的值即可。

UDP 简介

英文全称为User Defined Primitive,是用户自定义原语的意思。

语法:

primitive <primitive_name>(<output_port_name>, <input_port_name_list>);
    <输出端口类型说明>;
		<输入端口类型说明>;
		<输出端寄存器变量说明>;
		<原语初始状态说明>;
table
    <table element 1>;
    <table element 2>;
    ……
    <table element n>;
endtable
    endprimitive

table的内容其实就是该原语的真值表。每个UDP只能有一个输出最多有10个输入,但尽量控制在5个以内,否则table将会巨大无比;端口只能是标量,不能是向量,即均为1bit宽的;不支持高阻(z)逻辑;不能被综合等等。文章来源地址https://www.toymoban.com/news/detail-692912.html

到了这里,关于Xilinx原语的使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【XINLIX 原语】XILINX 原语的使用之 IBUFDS 差分转单端、OBUFDS 单端转差分

    目录 IBUFGDS IBUFDS 介绍 IBUFDS 示意图 例化方式 OBUFDS OBUFDS 介绍 OBUFDS 示意图 例化方式   在 XILINX 中有许多原语,常见的差分转单端 IBUFDS、单端转差分 OBUFDS。 IBUFDS 即专用差分输入时钟缓冲器(Dedicated Differential Signaling Input Buffer with Selectable I/O Interface) IBUFDS :在实验工程中如

    2024年02月16日
    浏览(47)
  • Xilinx原语——IDDR与ODDR的使用(Ultrascale系列)

      对于各个系列的器件,IDDR与ODDR都存在一定的差别,在使用前需要根据自己的器件型号选择相应的IDDR与ODDR,下面以kintex ultrascale系列器件为例。   IDDR的输入输出引脚包括时钟输入C、时钟取反输入CB、数据输入D(在时钟信号C的上升沿与下降沿都发生变化)、异步复位

    2024年02月08日
    浏览(81)
  • XILINX FPGA K7配置启动流程(官方手册整理)

         1.在配置过程中,7系芯片需要的电压有,Vcco0,Vccaux,Vccbram和Vccint。       所有的Jtag配置引脚在一个独立的专用bank上,使用的电源也是专用电源Vcco0。多功能pin在14和15bank。bank0,14和15上的专用输入输出引脚使用Vcco0,Vcco14,Vcco15的LVCMOS电平,电平需要匹配,输出引脚

    2023年04月22日
    浏览(42)
  • 易灵思FPGA-钛金的Hyperram Controller设置使用

    就是一个多路高速大号掉电易失 Spi Flash ,主要特点就是一个小封装和低功耗,具体的芯片的接口协议没研究,基本上每家FPGA或者MCU公司建议用hyperram的,都会有对应的控制器 ,直接搞控制器就行。 原理图设计没啥说的 ,正常链接管脚就行,400M的线速度 ,做好等长就行;

    2024年01月20日
    浏览(41)
  • 小梅哥Xilinx FPGA学习笔记19——IP 核使用之 ROM

    目录 一:章节导读 二:ROM IP 核配置 2.1 创建 ROM 初始化文件 2.3 ROM IP 核配置步骤 三: ROM核的仿真与调用 3.1 三角波的产生 3.2 仿真验证结果 3.3 正弦波的产生 3.4 仿真验证结果        ROM 是只读存储器( Read-Only Memory )的简称,是一种只能读出事先所存数据的固态半导体存

    2024年02月03日
    浏览(45)
  • xilinx原语详解及仿真——ODDR

       ODDR位于OLOGIC中,可以把单沿传输的数据转换为双沿传输的数据, 在讲解ODDR功能之前,需要先了解OLOGIC的结构及功能。   OLOGIC块位于IOB的内侧,FPGA内部信号想要输出到管脚,都必须经过OLOGIC。OLOGIC资源的类型为OLOGICE2(HP I/O Bank)和OLOGICE3(HR I/O Bank),两者在功能和

    2024年03月10日
    浏览(59)
  • Xilinx原语详解——IBUFDS & OBUFDS

      在使用FPGA时,往往会用到一些差分信号,比如HDMI接口,LVDS接口的ADC、显示器等等设备,而FPGA内部往往只会使用单端信号,就需要完成单端信号和差分信号的相互转换,xilinx提供了两个原语对所有IO信号实现差分和单端的转换, IBUFDS将FPGA输入的差分信号转换为单端信号

    2024年01月21日
    浏览(62)
  • xilinx原语介绍及仿真——ODELAYE2

      7系列IO模块相关的结构如图1所示,前文对IOB、IDELAYE2、ILOGIC、OLOGIC进行了讲解,还剩下ISERDESE2、OSERDESE2、ODELAYE2原语,本文对ODELAYE2进行讲解,该原语只有HP bank才有,即7系列FPGA的A7系列没有ODELAYE2结构,不能使用ODELAYE2原语。 图1 7系列IO模块(左侧HP bank,右侧HR bank)   图

    2024年02月20日
    浏览(42)
  • 机器视觉----易灵思FPGA

    机器视觉无处不在,产品上如果有了机器视觉,那么这个产品在很大的意义上已经赋予了机器智能。例如机器人、无人机、工业检测,这些都需要机器视觉,但是他们的传感器和算法都不同。我们今天重点讨论工业相机行业的应用。 机器视觉系统也有硬件和软件,硬件部分通

    2024年02月05日
    浏览(32)
  • 【risc-v】易灵思efinix FPGA riscv嵌入式软件源码分享

    分享一些fpga内使用riscv软核的经验,共大家参考。后续内容比较多,会做成一个系列。 本系列会覆盖以下FPGA厂商  易灵思 efinix  赛灵思 xilinx  阿尔特拉 Altera 本文内容隶属于【易灵思efinix】系列。 【risc-v】易灵思efinix FPGA sapphire_soc IP配置参数分享-CSDN博客 【risc-v】易灵思

    2024年01月19日
    浏览(54)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包