原创 “残忍”的inout

2011-3-8 16:31 3284 11 13 分类: FPGA/CPLD

    最近刚学verilog编程,语法不是很熟,在连续sram驱动时,其数据端口用了inout类型,但是在语法编译时老是出现错误: Error: BIDIR pin "SramData[0]" feeds BIDIR pin " renamed_port_9"。

     分析原因,可知inout在默认情况下也是wire类型,而我在程序中用的是给其赋值了reg型,SramData<=r_SramData;其中r_SramData是reg型,SramData是inout reg型。

      后面去altera官网上查找了下inout类型的用法,上面给了个例子:

 

bidir.v

module bidirec (oe, clk, inp, outp, bidir);

 

// Port Declaration

 

input   oe;

input   clk;

input   [7:0] inp;

output  [7:0] outp;

inout   [7:0] bidir;

 

reg     [7:0] a;

reg     [7:0] b;

 

assign bidir = oe ? a : 8'bZ ;

assign outp  = b;

 

// Always Construct

 

always @ (posedge clk)

begin

    b <= bidir;

    a <= inp;

end

 

endmodule

其RTL视图如下:

 

       也就是说,每一个inout类型就是一个三态输出门,所以在代码中必须利用一个控制断来控制,如上例中的oe。

       后来我仔细检查了我的代码,我确实是按照这样写的,可是还是报那个错,我右键错误处help了一下:

CAUSE:

The specified two BIDIR pins are feeding each other. However, two BIDIR pins must be separated from each other by logic. This error may occur in VHDL if an OUTPUT primitive or INPUT primitive is declared as INOUT. The Quartus II software does not automatically convert these pins to OUTPUT or INPUT pins.

ACTION:

Modify the design so that the two BIDIR pins do not feed each other. Alternatively, modify the design so that one of the BIDIR pins feeds an input pin and the other BIDIR pin feeds an output pin.

       言外之意,就是我的inout脚输入和输出必须分开,跟我开始理解的都一样,输出时直接复制,输入时复制高阻态。那到底错哪里了呢?难道一个inout就这么复杂么,后来经过一天的代码调试,慢慢删减代码到最简,机会和上面例子那么简单依旧出现同样的问题,RP真的这么差么!

       再仔细看一下提示,原来有个renamed_port_9,有renamed提示,才发现我在module中定义了两个一模一样的端口,只是端口总共有10多个,一下混乱了,悲剧!早应该想到的,不应该那么快查看help的,以后要吸取教训了,应该多思考问题。

       说了这么多,其实inout操作很简单,一般代码中要出现assign bidir = oe ? a : 8'bZ 类似的,在写代码时脑袋里想他是一个三态输出门就可以了。

 

 

 

PARTNER CONTENT

文章评论2条评论)

登录后参与讨论

ilove314_323192455 2011-3-9 19:39

是个好标题,也是个典型错误,呵呵

朱玉龙 2011-3-9 18:51

标题党啊……
相关推荐阅读
用户253961 2012-03-03 11:54
Matlab DIP(瓦)ch3小笔记
         对应上篇文章Matlab DIP(瓦) ch3中用到的一些小知识点,自己联系时写下的小笔记。 matlab版本2009a,matlab7.8的。 f = imr...
用户253961 2012-03-03 11:51
Matlab DIP(瓦) ch3练习
      Matlab是一种图像视频处理实现的好工具,因为matlab是基于数组操作的,而一副图像就是一个数组。因此搞DIP或者CV的是一种必需掌握的工具。     为了学会使用matlab...
用户253961 2012-03-01 18:46
opencv源码解析之滤波前言
     对图像的滤波和平滑是出来数字图像处理和计算机视觉非常重要的一个步骤,那么什么是滤波呢?滤波用编程语言到底是怎么实现的呢?效果怎么样?本人打算学习opencv有关滤波的源码,进一步加强图像...
用户253961 2011-09-24 23:14
怎样在MFC中捕获摄像头并显示出来
Visual_C++编程实现摄像头视频捕捉.pdf 说实话,要用MFC显示摄像头视频,对于入门者来说真是件难事情。网上这方面的文档简直就是太少了。倒是有很多源代码,但是对于MFC不熟悉的同学有源代码...
用户253961 2011-05-31 16:53
Hdb3之FPGA实现
  (转载请写明出处,谢谢!) 一:前言     这2天在帮一同学弄用cpld实现hdb3的编码和解码,要用vhdl,可惜我只是会一点verilog,所以我开始就用verilog来写,写出来后看点v...
用户253961 2011-05-30 21:53
基于FPGA的bmp图片显示
好久没有更新博客了,最近去了趟厦门参加考研复试,在深圳实习了1个月,然后赶回来弄毕设,一时间没更新博客。下面把我毕业设计的论文放上来,毕设题目是《基于大规模fpga的bmp图库管理》,这个题目名字...
我要评论
2
11
×
广告
关闭 站长推荐上一条 /3 下一条