inout口浅析--2

  首先感谢  backkom大哥的点拨。。。

   以下的例子是在做SDRAM读写时的一个仿真实例。

       由于操作SDRAM读写时需要 双向数据端口 因此在代码中涉及到了Inout口的使用。

      代码如下:

      

     RTL视图 如下所示:

     

      信号说明:

                  sdram_wr是写数据信号,sdram_wr = 1时,将wr_data_r数据 输出到 数据总线上去.

                  data_to_sys作为接受读入数据的信号端口。

                  wr_data_test信号作为测试信号,观测 输出的数据的值。

Q2中自动生成的testbench对 Inout口的描述如下

以上画线的语句都是Q2针对Inout口,自动生成的TB文件中包含的语句。

其中 treg_sdram_data信号可以看作是 , 用treg_sdram_data模拟外部数据,经data_bus送入inout口sdram_data,再送入sys这样一个过程。

在tb中它是 reg型,因此我们需要给他赋值一个 初值。

initial

   begin

     treg_sdram_data = 16'h0000;

 //  treg_sdram_data = 16'hzzzz;

   end 

注意如果是赋值16'h0000,仿真结果如下:

  可以发现,在写数据信号有效时,sdram_data上的数据 是不定值,为什么会这样呢?

  解释如下:

  因为一开始给treg_sdram_data赋了初值16‘h0000,相当于是,外设占据数据总线使用权,输出数据到sys中,而当sdram_wr_Test信号来时,

CPU想对外写数据到数据总线,此时便出现。。总线冲突,相当于此时  又写又读,所以会造成 数据为不定状态.

修改如下

initial

   begin

   //treg_sdram_data = 16'h0000;

   treg_sdram_data = 16'hzzzz;

   end 

此时相当于,外设处于 输出高阻状态,不占据总线使用权,不输出数据。因此再进行CPU对外输出数据时,就不会出现总线冲突的情况。即只进行CPU对外写数据

  仿真结果如下所示:

  可以看到 inout口 sdram_data上输出了 正确的数据。

  更加完善的写法如下所示(TB中)

 initial

  begin

  treg_sdram_data = 16'h0000;

  // treg_sdram_data = 16'hzzzz;

end

  assign sdram_data = (!sdram_wr_test)?treg_sdram_data : 16'hzzzz; 

  即一开始 sdram_wr(sdram_wr_test)=0, 外设占据 总线使用权,输出 数据到data_bus再经inout口到sys.

  当sdram_wr(即sdram_wr_test)为1时, 外设输出高阻,即释放总线,此时sys占据总线。。对外经Inout口,输出数据。

  仿真结果如下所示:

就说到这吧,以后再补充。

如果有论述不当得地方还请大家帮忙 指出。谢谢啦。

QQ:117242951

一起交流,一起进步。

posted on 2011-05-07 11:33  o my god  阅读(1617)  评论(4编辑  收藏  举报

导航