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
一起交流,一起进步。