---恢复内容开始---
对于电路模块而言:如果只从行为和功能的角度来描述某一个电路模块,则称为行为模块;如果从电路结构的角度来描述该模块,就称为结构模块。
- 对数字电路系统的5种不同的描述方法:
- 系统级(system)
- 算法级(algorithmic)
- RTL级(Register-Transfer-Level)
- 门级(gate-level)
- 开关级(switch-level)
门级结构描述
-
Verilog HDL中有关门类型的关键字共有26个,下面是最基本的8个:
-
- and ——与门;
- nand——与非门;
- nor——或非门;
- or——或门;
- xor——异或门;
- xnor——异或非门/同或门;
- buf——缓冲器;
- 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