Inout类型在使用和仿真时需要将其理解为2个端口,每个时刻有且只有一个在使用状态。我们在处理时可以将其手动分为2个端口,一个输入,另一个是输出。当用作输入端口时,输出端口处于“高阻”状态,用作输出口时保证时输入处于无效状态。如下图中,将inout类型的sdram_data分解成了输入端口DataFromSDR和输出端口DataToSDR(图1中的绿色方框部分).。分解完成后,就可以正常使用输入和输出端口了(图1中的红色方框部分)。以下题材选自于我的SDR_SDRAM控制器设计。
一,Inout的定义和使用
具体的做法是先定义两个wire型的量DataFromSDR和DataToSDR,然后使用assign语句进行分解。在下图中,可以这样理解:
(1):当bus_wr为1时,意味着要向SDRAM中写入数据,此时的inout要当做输出口使用,把需要输出的数据赋值给DataToSDR,然后通过总线来传递。
(2)当bus_wr为0时,需要从SDRAM中读取数据,inout作为输入口使用此时,输出口已经成为“高阻”,数据通过DataFromSDR传递到系统中。
二,inout的仿真
Inout类型的变量在仿真时同样需要分解,但仿真时对端口的使用刚好和建模时“相反”。图2是仿真和建模之间的关系,在建模中的输出口,仿真里面是要建立对应的输入口,反之亦然。建模设计的是一个SDRAM的控制器,那么仿真系统则模拟了一个SDRAM的工作特性。
在编写testbench时,inout的变量要定义成wire型,这点很重要。定义一个reg型的变量,用来充当“输出口”,由于有reg型的变量data_in已经充当了“输入口”,所以不需要再分解出新的“输入口”了。
在testbench中:
out_con=0;
bus_wr=1;
这样描述, inout已经作为输入口了,输出口此时处于“高阻”状态,数据通过data_in来传递。这也和建模中对应,在建模中,当bus_wr=1时,需要向SDRAM中写入数据,测试系统正是模拟的SDRAM,所以此时就是输入口(在建模中此时inout是输出口)。
在接着的描述中:
DataOut=16'h1401;
out_con=1;
bus_rd=1;
inout作为输出口来使用了,此时需要输出的数据通过DataOut来传递。out_con=1说明在建模中,inout此时是当做输入口使用了,和这里刚好又是对应的。
图4是Modelsim中的截图,从截图中可以看到,系统的输入和输出已经被正确仿真出来了。
图5是在QuartusII中的仿真。注意:在 data _in上有数据时,要将inout类型的sdram_data赋值为高阻“z”,这里的做法其实是和写testbench一样的,此时的bus_wr为1,sdram_data是作为输入口,输出口被置成“高阻”了。sdram_data作为输出口时,bus_wr为0,数据通过data_out传输。
用户1660434 2011-5-16 15:37