Verilog HDL模型的不同抽象级别

---恢复内容开始---

  对于电路模块而言:如果只从行为和功能的角度来描述某一个电路模块,则称为行为模块;如果从电路结构的角度来描述该模块,就称为结构模块。

  • 对数字电路系统的5种不同的描述方法:
    1. 系统级(system)
    2. 算法级(algorithmic)
    3. RTL级(Register-Transfer-Level)
    4. 门级(gate-level)
    5. 开关级(switch-level)

门级结构描述

  • Verilog HDL中有关门类型的关键字共有26个,下面是最基本的8个:

    1. and ——与门;
    2. nand——与非门;
    3. nor——或非门;
    4. or——或门;
    5. xor——异或门;
    6. xnor——异或非门/同或门;
    7. buf——缓冲器;
    8. not——非门。  
  • 门声明语句的格式如下:

              <门的类型>[<驱动能力><延时>] <门实例1> [,<门实例2>,...<门实例n>];

            eg:  nand #10 nd1(a,data,clock,clear);      例子声明了一个名为nd1的与非门(nand),输入为data、clock和clear,输出为a,输出与输入的延时为10个单位时间。

 一个边沿D触发器的例子:

 1 module D_flip_flop(clear,clock,data,q,qb);
 2 input clear,clock,data;
 3 output q,qb;
 4 initial
 5 $monitor($time,,"clock=%b,data=%b,ndata=%b,a=%b,b=%b,c=%b,d=%b,e=%b,f=%b,q=%b,qb=%b",clock,data,ndata,a,b,c,d,e,f,q,qb);
 6 nand #10 nd1(a,data,clear,clock),
 7          nd2(b,clock,ndata),
 8          nd4(d,clear,b,c),
 9          nd5(e,c,nclock),
10          nd6(f,d,nclock),
11          nd8(qb,f,clear,q);
12 nand #9  nd3(c,a,d),
13         nd7(q,e,qb);
14 not  #10 iv1(ndata,data),
15           iv2(nclock,clock);
16 endmodule

当按照书上给出的电路连线图写成上面的程序后。我对每部分的时序和状态感兴趣。于是分别就data=0和data=1写了两份测试模块。其中clear=1,使整个系统可以正常工作。

首先是data=0的情况:

 1 `include "D_flip_flop.v"
 2 module D_flip_flop_tb;
 3 reg clear,clock,data;
 4 wire q,qb;
 5 initial
 6 begin
 7     clear=1;
 8     clock=1;
 9     data=0;
10     #100 clock=0;
11 end
12 D_flip_flop D(clear,clock,data,q,qb);
13 endmodule

下面是最后的输出情况:

#                    0 clock=1,data=0,ndata=x,a=x,b=x,c=x,d=x,e=x,f=x,q=x,qb=x
#                   10 clock=1,data=0,ndata=1,a=1,b=x,c=x,d=x,e=x,f=x,q=x,qb=x
#                   20 clock=1,data=0,ndata=1,a=1,b=0,c=x,d=x,e=1,f=1,q=x,qb=x
#                   30 clock=1,data=0,ndata=1,a=1,b=0,c=x,d=1,e=1,f=1,q=x,qb=x
#                   39 clock=1,data=0,ndata=1,a=1,b=0,c=0,d=1,e=1,f=1,q=x,qb=x
#                  100 clock=0,data=0,ndata=1,a=1,b=0,c=0,d=1,e=1,f=1,q=x,qb=x
#                  110 clock=0,data=0,ndata=1,a=1,b=1,c=0,d=1,e=1,f=1,q=x,qb=x
#                  120 clock=0,data=0,ndata=1,a=1,b=1,c=0,d=1,e=1,f=0,q=x,qb=x
#                  130 clock=0,data=0,ndata=1,a=1,b=1,c=0,d=1,e=1,f=0,q=x,qb=1
#                  139 clock=0,data=0,ndata=1,a=1,b=1,c=0,d=1,e=1,f=0,q=0,qb=1

在第100个单位前,时钟信号一直为1,又因为这个D边沿触发器为下降沿触发,所以在前100个时间单位,D端口信号(data)只能传递到c口。只有当第100个时间单位到来,下降沿产生后,data的数据才能再从c传递到q。

首先:当程序执行时间为0时,数值为预先设定好的值。由于最开始只有clock,data。所以别的都是非定态x。

#10 时,iv1、iv2完成转换,输出ndata=1(data=0),nclock=0(clock=1)。(nclock没写到监测变量里面)    。  同时nd1完成转换,输出a=1(clear=1,clock=1,data=0)。

  #10  新得到  ndata=1,a=1 

#20时,由于nclock=0,而且nd5和nd6均为与非门,所以nd5和nd6的输出状态其实已经可以得出。于是此时nd5、nd6完成转换。输出e=1(nclock=0,c=?);f=1(nclock=0,f=?);此外,可以得到b=0(clock=1,ndata=1)。

  #20 新得到  e=1,f=1,b=0

#30时,b已知且为0,所以d在此时可以直接确定为1,d=1(clear=1,b=0,c=?),但是由于a=1,所以c的结果还要依赖于d。同时,由于e,f为1。所以此时q和qb的输出需要分别靠qb和q来确定。但由于此时q和qb均为x。所以,结果仍为x。

  #30 新得到d=1

#39时,由于在#30时,d已经得到,又由于nd3的运行单位为9,所以在#39可以得到c=0(a=1,d=1)。

  #39 新得到c=0

此时,data的状态已经成功传递到c。所以在下一次clock变化时,数据一直保持现状。

(clear=1,clock=1,data=0,a=1,b=0,c=0,d=1,f=1,e=1,nclock=0,ndata=1)

#100时,clock=0,clock发生变化。

  #100 新得到 clock=0

#110时,nclock=1(clock=0)。b=1(clock=0,ndata=1)。

  #110 新得到nclock=1,b=1

#120时,虽然b变为1,且clear=1,但a未受影响,所以c仍为0,所以d仍为1。c,d都不变。但由于#110时,nclock=1,所以f=0(nclock=1,d=1)。

  #120新得到 f=0

#130时,由于在#120时f=0,所以此时nd8一定为输出1,所以qb=1(f=0,clear=1,q=?)

  #130新得到 qb=1

#139时,由于qb=1已知,所以此时q=0(e=1,qb=1)

最后成功将data端的数据传到q端。

 

然后再就是data=1的时候,其实就是让tb模块的data=1;。

最后的结果如下:

#                    0 clock=1,data=1,ndata=x,a=x,b=x,c=x,d=x,e=x,f=x,q=x,qb=x
#                   10 clock=1,data=1,ndata=0,a=0,b=x,c=x,d=x,e=x,f=x,q=x,qb=x
#                   19 clock=1,data=1,ndata=0,a=0,b=x,c=1,d=x,e=x,f=x,q=x,qb=x
#                   20 clock=1,data=1,ndata=0,a=0,b=1,c=1,d=x,e=1,f=1,q=x,qb=x
#                   30 clock=1,data=1,ndata=0,a=0,b=1,c=1,d=0,e=1,f=1,q=x,qb=x
#                  100 clock=0,data=1,ndata=0,a=0,b=1,c=1,d=0,e=1,f=1,q=x,qb=x
#                  110 clock=0,data=1,ndata=0,a=1,b=1,c=1,d=0,e=1,f=1,q=x,qb=x
#                  120 clock=0,data=1,ndata=0,a=1,b=1,c=1,d=0,e=0,f=1,q=x,qb=x
#                  129 clock=0,data=1,ndata=0,a=1,b=1,c=1,d=0,e=0,f=1,q=1,qb=x
#                  139 clock=0,data=1,ndata=0,a=1,b=1,c=1,d=0,e=0,f=1,q=1,qb=0

最后我将nd3和nd7的运行时间由#9代改为#10。然后结果为:

#                    0 clock=1,data=1,ndata=x,a=x,b=x,c=x,d=x,e=x,f=x,q=x,qb=x
#                   10 clock=1,data=1,ndata=0,a=0,b=x,c=x,d=x,e=x,f=x,q=x,qb=x
#                   20 clock=1,data=1,ndata=0,a=0,b=1,c=1,d=x,e=1,f=1,q=x,qb=x
#                   30 clock=1,data=1,ndata=0,a=0,b=1,c=1,d=0,e=1,f=1,q=x,qb=x
#                  100 clock=0,data=1,ndata=0,a=0,b=1,c=1,d=0,e=1,f=1,q=x,qb=x
#                  110 clock=0,data=1,ndata=0,a=1,b=1,c=1,d=0,e=1,f=1,q=x,qb=x
#                  120 clock=0,data=1,ndata=0,a=1,b=1,c=1,d=0,e=0,f=1,q=x,qb=x
#                  130 clock=0,data=1,ndata=0,a=1,b=1,c=1,d=0,e=0,f=1,q=1,qb=x
#                  140 clock=0,data=1,ndata=0,a=1,b=1,c=1,d=0,e=0,f=1,q=1,qb=0

貌似没啥影响。。。。。。。

Verilog HDL的行为描述建模

 1 module hardreg(d,clk,clrb,q);
 2 input clk,clrb;
 3 input [3:0] d;
 4 output [3:0] q;
 5 reg [3:0] q;
 6 
 7 always @(posedge clk or posedge clrb)
 8 begin
 9     if(clrb)
10         q<=0;
11     else
12         q<=d;
13 end
14 endmodule

 

posted on 2018-03-13 02:06  我是人间惆怅客1  阅读(987)  评论(0编辑  收藏  举报

导航