前言

平日里写博文都是长文,或者稍长文,但是最近感觉这样既不利于看,也不利于写?

  1. 不利于写很好理解,就是大家都有自己的正式事业,上班或者上学,没有整体的时间去写文章,这会导致像我一样,一次断更,甚至达到数月之久,给钱也不写,生活已经很累了,还要花很久去写一篇文章,确实不容易。

  2. 不利于看呢? 大家看你的文章,很少有专门去一篇一篇浏览的,大多数是遇到一个疑问?谷歌或百度一下?搜到想看的内容看一眼,就有所收获,或者没有收获赶紧换下一篇,视频行业都是如此了,文章亦可以改变?

于是这样有利于作者以及读者的事情,是可以尝试改变的,那今天的文章就是如此,讲一个小知识点或者小话题,感兴趣就看,不感兴趣就翻过。

当时间久了,大脑记不住一些知识点时,还可以关键字搜索一下自己的文章,或者其他人,无意间搜索,或许可以得到帮助,内容不需要很高深,因为你认为高深,别人也许决定就是入门,你觉得入门别人会觉得晦涩难懂,各取所需而已。

问题讨论

今天我在Xilinx的example(wavegen example)中看到他们的顶层模块的输入输出管脚都手动例化原语IBUF以及OBUF,我顿时感觉很别扭,这真的有必要吗?

内容如下,省略了其他逻辑。


`timescale 1ns/1psmodule wave_gen (input            clk_pin_p,      // Clock input (from pin)input            clk_pin_n,      //   - differential pairinput            rst_pin,        // Active HIGH reset (from pin)// RS232 signalsinput            rxd_pin,        // RS232 RXD pinoutput           txd_pin,        // RS232 RXD pin// Loopback selectorinput            lb_sel_pin,     // Loopback selector // DAC output signalsoutput           spi_clk_pin,    // Serial clockoutput           spi_mosi_pin,   // Serial dataoutput           ,   // DAC chip select (active low)output           dac_clr_n_pin,  // DAC clear (or reset - active low)// LED outputsoutput     [7:0] led_pins         // 8 LED outputs
);//......//***************************************************************************
// Code
//***************************************************************************// Instantiate input/output buffersIBUF IBUF_rst_i0      (.I (rst_pin),      .O (rst_i));IBUF IBUF_rxd_i0      (.I (rxd_pin),      .O (rxd_i));IBUF IBUF_lb_sel_i0   (.I (lb_sel_pin),   .O (lb_sel_i));OBUF OBUF_txd         (.I(txd_o),         .O(txd_pin));OBUF OBUF_spi_clk     (.I(spi_clk_o),     .O(spi_clk_pin));OBUF OBUF_spi_mosi    (.I(spi_mosi_o),    .O(spi_mosi_pin));OBUF OBUF_dac_cs_n    (.I(dac_cs_n_o),    .O(dac_cs_n_pin));OBUF OBUF_dac_clr_n   (.I(dac_clr_n_o),  .O(dac_clr_n_pin));OBUF OBUF_led_i0      (.I(led_o[0]),      .O(led_pins[0]));OBUF OBUF_led_i1      (.I(led_o[1]),      .O(led_pins[1]));OBUF OBUF_led_i2      (.I(led_o[2]),      .O(led_pins[2]));OBUF OBUF_led_i3      (.I(led_o[3]),      .O(led_pins[3]));OBUF OBUF_led_i4      (.I(led_o[4]),      .O(led_pins[4]));OBUF OBUF_led_i5      (.I(led_o[5]),      .O(led_pins[5]));OBUF OBUF_led_i6      (.I(led_o[6]),      .O(led_pins[6]));OBUF OBUF_led_i7      (.I(led_o[7]),      .O(led_pins[7]));//......
endmodule

如果不是机器人(刻板)写的逻辑,我还真没有在哪个人的代码中看到这样的操作?

当然,我并不是说这样是错误的,这样当然是正确的,我们也都浅显地知道这两个BUF是用于将输入管脚送入FPGA内部(IBUF)以及将输出信号送出FPGA输出管脚(OBUF),注意,我这里都在说管脚,对应的是外部管脚的意思,英文中叫PORT。

用这张图来看:


如果将黑色方框表示一个FPGA的话,那么它的管脚就是PORT;其内部走线叫NET,内部一些元素,例如LUT,DFF,DSP的引脚叫PIN,而这些元素可以称为CELL。
它们的名字都有默许的规定。

话说着,又扯远了,这就是文章一写就变长的根源,有的时候废话多。

话说回来,我们更常见的操作是将输入管脚直接使用,将内部信号需要输出即直接输出,或reg类型或wire类型,这无可置疑呀?

那今天需要讨论的问题是:有必要这么写吗?

我的观点是既然两种方式都出现过,一种是出现在官方example中,一种是出现在我们平时写的逻辑中,并且从来也没有什么问题,那么这两种方式都是可以的,这种差异出现的原因,我个人猜测应该是:

  1. 代码风格问题?我们大多数人习惯与能省就省,也就是没必要的内容就不用搬上来,反正工具也会自动给我们加上,这是没问题的。人人相互学习,自然我们见到的主流也是如此。

这可能会招致一些gj的反对呀,说我们不能讲命运交给编译器,诚然如此,例如我们要写通用性的逻辑时,不会在逻辑中手动添加一些综合属性,这可能不能在其他平台或者其他型号的FPGA上生效?

但这也不是绝对的,像本文这种在任何平台上对输入输出信号直接处理都不会出问题,这是标准的Verilog,不存在这样的问题,反而加上显式的IBUF以及OBUF原语可能会导致平台不兼容的问题。

  1. 机器与人的区别?机器并不会嫌麻烦呀,人为的给定一些规则,C语言以及Matlab语言都可以转化为Verilog,不敢奢求X家FPGA会派专门的逻辑工程师去手动去写Verilog逻辑?

说着说着,又废话说多了。

其实,对于Xilinx平台,我们按正常写法,工具会自动插入这样的BUF的,我们知道IBUF的作用就是对普通输入管脚(非时钟)驱动内部信号使用的,OBUF就是内部信号驱动普通输出的。
这里的普通是用于区别于时钟的。

对于,对于IBUFDS以及OBUFDS,和上述讨论一致,区别仅仅在于DS,即差分信号;

还有时钟使用的BUF,通常都是带有G的,例如IBUFG,BUFG,OBUFG,关于它们用于,我们下次讨论。

结尾

这是FPGA逻辑设计短文系列第一篇,内容很少,但是篇幅不仅又长了一些,一般这个问题,1000或者几百字搞定即可,下次尽量注意。

逻辑设计中需要显式地使用IBUF以及OBUF类似的原语吗?相关推荐

  1. 谈谈分布式多智能体中的显式协调机制

    本文csdn博客链接:http://blog.csdn.net/screscent/article/details/78742815 本文qq空间链接:http://user.qzone.qq.com ...

  2. spring三: 装配bean( 在xml中进行显式配置, 在java中进行显式配置)

    ApplicationContext ac = new AnnotationConfigApplicationContext(SpringConfiguration.class); SpringCon ...

  3. jQuery 中的显式遍历(explicitly iterate)与隐式遍历(implicit iteration)

    jQuery 中的显式遍历(explicitly iterate)与隐式遍历(implicit iteration) 在 jQuery 中,我们把 $() 叫做核心函数. 如果通过核心函数找到的元素不 ...

  4. FPGA的设计艺术(16)逻辑设计中无刻不在的判断之if/case语句

    前言 Verilog中的if或者case语句十分简单,但确实十分重要,我们的逻辑设计可以说一定离不开它,我们时时刻刻使用它,我们使用它进行建模,通常对应的是多路选择器这样的硬件单元或者变种. 我们通常 ...

  5. java 多态 显式隐式,Java 构造器中的显式参数和this隐式参数

    1.构造器 写一个Java类,首先要先从构造器开始,构造器与类同名,在构造类的对象时会先从构造器开始. 构造器总是伴随着new操作符的执行而被调用. 构造器主要是用来初始化类的实例域. 构造器的特点: ...

  6. andriod studio中的显式跳转和隐式跳转

    比如要从A----->B 1.显式跳转 在A的activity中的匿名内部类(这里用匿名内部类)中的写如下代码: Intent intent = new Intent(this, BActivi ...

  7. 逻辑设计中复位的稳妥处理方法?

    前言 看别人的好设计,能让自己从细节上提升,所谓好的设计,除了从各种指标上评判,我们都知道,设计的兼容性(参数化),可读性,可扩展性等等,可是既然是学习,我们本身就不知道什么样的才是好的,这些指标也分 ...

  8. 基础才是重中之重~.net中的显式事务与隐式事务

    回到目录 .net中的事务可以分为显式的和稳式的,显式的就是说需要我们手动去指定事务的提交和回滚,而稳式的是.net帮助我们进行管理的,当你的事务代码段没有发生异常时,它会帮助我们进行提交,反之,进行 ...

  9. html手机响应式布局,手机网页设计中的响应式布局

    随着各种特性和智能手机浏览器的发展,网页能够根据设备显示变得很重要.我们不用再根据桌面浏览器窗口尺寸建立网站,然后让它们在更小的移动浏览器上渲染.现在,我们可以让元素大小和布局针对设备作出改变. 在C ...

最新文章

  1. 庖丁解牛剖析国际学术论文写作的快速入门
  2. router OS (ROS)命令中文手册
  3. css 引用otf文件,CSS-如何将OTF / TTF文件转换为EOT格式?
  4. 开启mysql慢查询日志,不重启数据库的方法
  5. J2EE互联网产品打造
  6. vue中什么样的数据可以是在视图中显示
  7. 计算中英混合字符串的自己字节长度
  8. C#中类的override和virtual
  9. 体验AJAX Toolkit新控件:AutoCompleteExtender
  10. php 5.2.17 中文乱码,php5.2 Json中文乱码解决方法
  11. python复习题答案_python的复习题和答案合集
  12. coderforces 731c
  13. 共享软件加密的一些误区
  14. 正睿OI DAY14 (ks=null)
  15. aic准则和bic准则_用户故事准则
  16. obd协议 混动车_OBD完整协议
  17. 蚂蚁区块链BaaS平台应用开发指南(四):JavaSDK的接入
  18. 训练神经网络的详细步骤,如何训练一个神经网络
  19. java mybatis多层collection嵌套查询
  20. Windows命令-解压缩文件-tar

热门文章

  1. C# Email邮件发送,功能是密码找回或者重置功能。
  2. 打不开添加删除程序的故障
  3. DNN(DotNetNuke)研究资源
  4. java的for循环嵌套_优化Java的for循环嵌套的高效率方法
  5. html照片4张 9张布局,css实现朋友圈照片排列布局
  6. Android10剪贴板,剪纸堆 Clip Stack - 轻量级剪贴板管理程序(支持 Android 10)
  7. 计算机莫名其妙的游戏网页弹出,自动弹出游戏网页怎么办 自动弹出游戏网页解决方法【详解】...
  8. php 显示要上传的图片格式,php判断文件上传图片格式的实例详解
  9. 在layui中使用ajax传值给后台,解决layui批量传值到后台操作时出现传值为空的问题...
  10. 安装JAVA内部错误61003_JDK1.8 安装报内部错误:61003