0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

在Xilinx 7系列FPGA上两种实现方式的差别

FPGA之家 来源:FPGA之家 作者:FPGA之家 2022-10-19 09:31 次阅读

FPGA设计开发中,很多场合会遇到同一根信号既可以是输入信号,又可以是输出信号,即IO类型(Verilog定义成inout)。

对于inout型的信号,我们既可以使用FPGA原语来实现,也可以使用Verilog代码来实现。下面将介绍在Xilinx 7系列FPGA上两种实现方式的差别和注意点。

1.FPGA原语实现

首先,我们编写的代码如下:

`define PRIMITIVE 
 
 module io_buf(
     input    T    ,
     input    I    ,
     output    O    ,
     inout    IO
 );
 
 `ifdef PRIMITIVE
     IOBUF #(
         .DRIVE            (12            ),    // Specify the output drive strength
         .IBUF_LOW_PWR    ("TRUE"        ),    // Low Power - "TRUE", High Performance = "FALSE" 
         .IOSTANDARD        ("DEFAULT"    ),    // Specify the I/O standard
         .SLEW            ("SLOW"        )    // Specify the output slew rate
     ) IOBUF_INST (
         .O                (O            ),    // Buffer output
         .IO                (IO            ),    // Buffer inout port (connect directly to top-level port)
         .I                (I            ),    // Buffer input
         .T                (T            )    // 3-state enable input, high=input, low=output
     );
 `else
     assign IO = T? I:1'bz;
     assign O  = IO;
 `endif
     
 endmodule

该代码通过原语IOBUF实现IO功能,使用Vivado编译后的原理图如下图所示。可以看到IOBUF内部由OBUFT和IBUF原语构成。

8927cd10-4f3d-11ed-a3b6-dac502259ad0.png

2.使用Verilog实现

把`define PRIMITIVE注释掉,则为通过Verilog的实现方式,如下图:

//`define PRIMITIVE 

module io_iobuf(
    input    T    ,
    input    I    ,
    output    O    ,
    inout    IO
);

`ifdef PRIMITIVE
    IOBUF #(
        .DRIVE            (12            ),    // Specify the output drive strength
        .IBUF_LOW_PWR    ("TRUE"        ),    // Low Power - "TRUE", High Performance = "FALSE" 
        .IOSTANDARD        ("DEFAULT"    ),    // Specify the I/O standard
        .SLEW            ("SLOW"        )    // Specify the output slew rate
    ) IOBUF_INST (
        .O                (O            ),    // Buffer output
        .IO                (IO            ),    // Buffer inout port (connect directly to top-level port)
        .I                (I            ),    // Buffer input
        .T                (T            )    // 3-state enable input, high=input, low=output
    );
`else
    assign IO = T? I:1'bz;
    assign O  = IO;
`endif
    
endmodule

该代码使用Vivado编译后的原理图如下图所示。该实现方式也会调用IOBUF原语,但多消耗了一个LUT资源。

894d860e-4f3d-11ed-a3b6-dac502259ad0.png

通过Verilog实现时,我们在把IO信号当成输入时给赋值高阻态(1‘bz)。假如我们把此时的IO信号赋值1‘b0或者1‘b1,会出现什么情况呢?我们把1‘bz写成1‘b1,如下所示:

 //`define PRIMITIVE 
 
 module io_iobuf(
     input    T    ,
     input    I    ,
     output    O    ,
     inout    IO
 );
 
 `ifdef PRIMITIVE
     IOBUF #(
         .DRIVE            (12            ),    // Specify the output drive strength
         .IBUF_LOW_PWR    ("TRUE"        ),    // Low Power - "TRUE", High Performance = "FALSE" 
         .IOSTANDARD        ("DEFAULT"    ),    // Specify the I/O standard
         .SLEW            ("SLOW"        )    // Specify the output slew rate
     ) IOBUF_INST (
         .O                (O            ),    // Buffer output
         .IO                (IO            ),    // Buffer inout port (connect directly to top-level port)
         .I                (I            ),    // Buffer input
         .T                (T            )    // 3-state enable input, high=input, low=output
     );
 `else
     assign IO = T? I:1'b1;
     assign O  = IO;
 `endif
     
 endmodule

编译后的原理图如下,可以看到并不会调用IOBUF原语,IO的不能实现输入功能,这就是解释了为什么在使用Verilog实现一根信号的IO功能时需要赋值1‘bz。

8958dd56-4f3d-11ed-a3b6-dac502259ad0.png

审核编辑:彭静

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • FPGA
    +关注

    关注

    1603

    文章

    21328

    浏览量

    593267
  • Xilinx
    +关注

    关注

    70

    文章

    2121

    浏览量

    119388
  • 代码
    +关注

    关注

    30

    文章

    4556

    浏览量

    66814

原文标题:FPGA之IO信号类型深入理解

文章出处:【微信号:zhuyandz,微信公众号:FPGA之家】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    xilinx公司的7系列FPGA应用指南

    xilinx公司的7系列FPGA应用指南
    发表于 08-14 12:17

    两种采样方式

    两种采样方式.....................................
    发表于 08-08 15:04

    XILINX V7系列FPGA的的BPI FLASH程序下载问题咨询

    各路大神你们好!我想向各位咨询下:当采用BPI模式配置Xilinx V7系列FPGA时,程序是如何下载到BPI FLASH中去的?我看了V7
    发表于 08-26 15:34

    Xilinx程序下载方式

    到开发板FPGA芯片中,也就是说JTAG是我们最熟悉的通常说的嵌入式下载模式(当前流行的STM32系列单片机的烧写也是这种主要模式),但是稍微熟悉点的人都知道JTAG只是一在线调
    发表于 09-20 21:29

    请问小车转向两种方式有什么优缺点?

    我知道的小车转向常见的有两种方式,一是通过舵机控制转向,另一是通过控制个轮子的转速,通过转速差实现
    发表于 05-21 02:37

    SQL语句的两种嵌套方式

    一般情况下,SQL语句是嵌套在宿主语言(如C语言)中的。有两种嵌套方式:1.调用层接口(CLI):提供一些库,库中的函数和方法实现SQL的调用2.直接嵌套SQL:代码中嵌套SQL语句
    发表于 05-23 08:51

    Linux实现输入参数求和的两种方式

    Linux实现输入参数求和(两种方式
    发表于 03-26 11:44

    怎么选择Xilinx FPGA芯片?

      1.工艺节点  首先不管选择什么厂家的产品,都建议在其主流产品中选择合适的芯片。    以上是目前 Xilinx 主流的也是常用的几个 FPGA 产品系列,这里不谈传说中的后
    发表于 12-23 17:21

    Xilinx-7系列FPGA主要包括哪些

    Xilinx 7系列FPGA简介--选型参考
    发表于 02-01 06:10

    求大神分享基于FPGA的DDFS与DDWS的两种实现方式

    DDS的基本原理是什么,有什么性能指标?基于FPGA的DDFS与DDWS两种实现方式
    发表于 04-30 06:13

    Xilinx 7系列FPGA管脚是如何定义的?

    FPGAs Package Files的ASCII Pinout Files子节中,按照FPGA器件家族和器件封装分类,给出了7系列所有器件Pinout定义链接地址。官网给出CSV和
    发表于 05-28 09:23

    Xilinx 7系列FPGA芯片管脚定义与封装

    FPGAs Package Files的ASCII Pinout Files子节中,按照FPGA器件家族和器件封装分类,给出了7系列所有器件Pinout定义链接地址。官网给出CSV和
    发表于 07-08 08:00

    串口通信的两种方式

    串口通信由两种方式,第一就是用微机原理课上学过的TX和RX个接口进行通信。不过根据去年的经验,这个板子直接用TX和RX个接口进行通信容
    发表于 08-24 06:59

    SQL语言的两种使用方式

    SQL语言的两种使用方式终端交互方式下使用,称为交互式SQL嵌入高级语言的程序中使用,称为嵌入式SQL―高级语言如C、Java等,称为宿
    发表于 12-20 06:51

    Xilinx 7系列与Ultrascale系列FPGA的区别

    Xilinx是一家专业的可编程逻辑器件(PLD)厂商,其产品包括FPGA、CPLD、SOC等。XilinxFPGA产品线有多个系列,其中7
    发表于 09-15 14:44 2222次阅读
    <b class='flag-5'>Xilinx</b> 7<b class='flag-5'>系列</b>与Ultrascale<b class='flag-5'>系列</b><b class='flag-5'>FPGA</b>的区别