浅谈verilog双向口仿真

      想起当初做ds18b20的控制时第一次遇到双向口,要用modelsim仿真的时候就烦恼了,这双向口仿真的时候怎么给激励?纠结了很久,其实说到底是当初对双向口的结构不了解,其实要是看一下综合出来的双向口电路图,要做仿真其实是很好做的,刚好这次做的类似I2C的sccb摄像头配置也要用到双向口,就简单说一下双向口的仿真问题。首先说明,以下是我综合网上方法的思考过程,不知道是否严谨。

      前面说了,之前不会仿真就是因为不了解双向口的结构,那双向口的结构是怎样的呢?可以综合出一个双向口看一下。

     请注意,这是一个纯粹的接口,din声明的是接口模块的输入,也就是要写到总线上的数据,dout声明的是接口模块的输出,也就是从总线上读到的数据。图如下

    下面来看一下Quartus ii 综合出来的双向口,

    

      图中红色箭头所示就是我们要写到总线上的数据流向,而绿色箭头则是读取总线上的数据流向,可以看到,在写数据到总线的流向上有一个三态门,注意两个缓冲区括号里的说明(tri:三态,drect:直通),就是由语句assign bus = (en==1)? din : 1’bz; 综合出来的,三态门起到掌控和释放总线的作用,当使能信号en为1时,主机即FPGA将掌握总线的控制权,此时把要发送的数据写到总线上,而当使能信号为0时,则输出高阻态,即此时主机放弃了总线的控制权,此时总线由从机控制,主机就可以直接在总线上读到从机写上的数据。而这就是FPGA通过三态门读写双向口的方式。

      既然知道了双向口的工作原理,那仿真起来就不再是问题,我们仿真时激励文件的作用就是就是给设计输入一定的激励,通过查看设计的输出是否符合预想来验证设计是否正确,那在双向口仿真中,激励文件就扮演了从机的角色,焦点自然而然就回到了对总线的控制权上,作为从机的激励文件自然是要在主机释放了总线期间,而又有数据要写到总线上的时候控制总线,换言之,在从机,也就是激励文件中也应该存在一个三态门控制的双向口,而它使能的时间应该在主机释放总线而且需要从总线上读数据的时候,那激励文件怎么知道何时是从机该接管总线呢?我的方法是在设计中输出一个辅助信号,此信号只在从机该接管总线也就是主机需要从总线上读取数据的时候拉高,那激励文件就可以利用此信号来作为从机三态口的使能信号,在此期间把数据写到bus上。

      回到本次例子中,sccb总线,不了解sccb总线的可以到我另一篇博文中看看,基本类似于常用的I2C总线,主机要发送数据给从机时,在时钟线低电平期间改变数据,高电平期间保持数据稳定,每发送一个字节数据后可以从总线上读取从机的低电平应答(从机把总线拉低,否则主机释放总线后总线将被上拉电阻拉为高电平),如下图中圈出的sclk高电平期间就是该由从机返回应答信号的期间,注意此时主机三态口的使能信号sdat_en拉低了,主机释放总线。

    下面就在原设计文件中添加一个测试信号,如下

 

 

    在激励文件中利用此信号来控制从机的三态门,

 

 

     sdat_t是从机要写到总线上的数据,在本例中一直为0,当test为1时,sdat_t将被写到总线上,如下

 

     注意红圈部分,此时test为1,sdat_t的值被写到总线sdat上,sdat不再为高阻状态。

     这里要提醒一下,激励文件中,总线sdat要定义为wire类型,还要注意主机的三态门使能信号和从机的三态门使能信号不能重叠,否则主机和从机都想往总线上写数据的话,控制权冲突,仿真时总线将是红色的不定态。

 

posted @ 2015-08-26 11:21  happybull  阅读(4207)  评论(0编辑  收藏  举报