最近刚学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 类似的,在写代码时脑袋里想他是一个三态输出门就可以了。
ilove314_323192455 2011-3-9 19:39