Verilog中中inout的使用的使用
这两天在做verilog的ds1302,ds1302中有一个端口是输入/输出管教。即这个管教即是输出,同时也可以当输
入。在verilog中有一个特殊的端口与之对应,就是inout。
Inout这个端口,之前用得不多,所以用法也不怎么记得。但是这个地方要用,所以就要学习下。
在端口申明中,可以申明一个端口为inout,申明后,这个端口就是输入/输出端口。那么怎么用这个端口了,什么时候让他输
出,什么时候让他输入。这个时候,就有一个固定的用法。就是assign
如:申明一个 inout端口 a, inout a,
那么在用的时候,就要这样用: assign a = read == 1 ? 1'bz : data;
可以看出,这里多了一个read信号,这个read信号就说明此端口a,在什么时候作为输入,什么时候作为输出。当read为1的
时候,a为输入,否则作为输出。
以下是一个inout使用的一个实例代码:
+ 查看代码
module inout_1(
input clk,
input rst_n,
input read,
input data,
inout a,
output reg b
);
assign a = read == 1 ? 1'bz : data;
always@( posedge clk ) begin
if( !rst_n )
b <= 0;
else
begin
if(read)
b <= a;
end
end
endmodule
以上代码,功能是,当a端口作为输入的时候,把输入a的值给输出b。当a端口作为输出的时候,将输入data的值输出给a。
Inout使用时很简单的,其实就是控制使能信号。使能信号有效的话,就将端口当做输入用。使能信号无效的时候,就把端口
当做输出,此时改变输出的值,就改变assing语句中的输出信号值(上例中就是data信号)。、
接下来就是仿真了,对于inout的端口,仿真和其他两种端口是不一样的,input端口在仿真中,就是定义为reg型,然后直接在
测试文件中改变值。而输出就是定义为wire型,直接在仿真结果中查看信号结果即可。
那对于inout又该怎么定义信号了。其实inout信号,在测试文件中,要定义为wire型。另外还要加一个assign语句。
如上例中,a为inout信号,那么在测试文件中,要有这样一个语句
assign a = read == 1 ? in_a : 1'bz;