新闻  |   论坛  |   博客  |   在线研讨会
Inout的使用和仿真
shangwfa | 2013-08-31 14:16:35    阅读:2933   发布文章

 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传递到系统中。


3e762e78-2737-44b9-9923-94b7e34f88bc.jpg



二,inout的仿真


Inout类型的变量在仿真时同样需要分解,但仿真时对端口的使用刚好和建模时“相反”。图2是仿真和建模之间的关系,在建模中的输出口,仿真里面是要建立对应的输入口,反之亦然。建模设计的是一个SDRAM的控制器,那么仿真系统则模拟了一个SDRAM的工作特性。




b931b93a-1201-4212-8b8c-2b10a7877801.jpg




在编写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此时是当做输入口使用了,和这里刚好又是对应的。




c6b2199d-34a6-49e6-a790-d80998489e74.jpg



图4是Modelsim中的截图,从截图中可以看到,系统的输入和输出已经被正确仿真出来了。




d105fbc0-d6ae-4d6a-a133-bb10330b9ec1.jpg




图5是在QuartusII中的仿真。注意:在 data _in上有数据时,要将inout类型的sdram_data赋值为高阻“z”,这里的做法其实是和写testbench一样的,此时的bus_wr为1,sdram_data是作为输入口,输出口被置成“高阻”了。sdram_data作为输出口时,bus_wr为0,数据通过data_out传输。




73e9c11c-473e-482d-add8-b993d35fb924.jpg

*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
推荐文章
最近访客