芯片外部引脚很多都使用inout类型的,为的是节省管腿。一般信号线用做总线等双向数据传输的时候就要用到INOUT类型了。就是一个端口同时做输入和输出。Inout类型在使用和仿真时需要将其理解为2个端口,每个时刻有且只有一个在使用状态。我们在处理时可以将其手动分为2个端口,一个输入,另一个是输出。当用作输入端口时,输出端口处于“高阻”状态,用作输出口时保证时输入处于无效状态。
以sdram读写为例说明,双向数据线inout型的16位sdram_data,数据输入16位data_in,数据输出data_out,读写使能信号,en,(暂且定义en为1时是写,为零时是读)此时可在内部自定义数据暂存器,sdram_data_in,
sdram_data_out,也有说法把他们叫做sdram_data的映象数据暂存器。
如何实现具体如下:
assign sdram_data_in = data_in;
assign sdram_data = (en)? sdram_data_in :16'hz;
assign sdram_data_out = sdram_data;
assign data_out = (en)? sdram_data_out :16'd0;
1):当写有效时时,意味着要向SDRAM中写入数据,此时的inout要当做输出口使用,把需要输出的数据赋值给sdram_data_in,然后通过总线来传递。
(2)当读信号有效时时,需要从SDRAM中读取数据,inout作为输入口使用此时,输出口已经成为“高阻”,数据通过sdram_data_out传递到系统中。
testbench模块中也要相应的把inout类型的双向数据线定义为wire类型即可,在我自己的sdram读写中没有添加别的语句就能正常实现功能,网上也有人说得在tesebench中也需要定义双向端口,需要和代码中相对应的操作,目前为止,本人只定义一个wire就能实现功能,也可能是我还未完全理解其中深奥吧,以上只是自己的心得,全是自己一字字敲打键盘所写,希望对初学者有用,也为了能自己整理一下思路。大侠切莫见笑。
昨天发博文说sdram读写时只能完成最近一次的读写,不能把之前调入的地址和相关数据读出来,本人一直寻求解答,最终发现问题所在,在sdram读写时需要注意数据掩码的问题,也就是DQM,它是高电平屏蔽,低电平顺利输出,由于本人设置问题,低电平没能顺利读出,结果导致,DQM没有数据输出,导致不能正常读写。16中设置输为00就能轻松搞定,因为16位分高低两个8位,所以设置为00,而不是0.
好了,先写到这吧,作为一个总结,只是希望于己于人有点帮助而已。
文章评论(0条评论)
登录后参与讨论