用门级结构描述D触发器,实例如下:
由已经设计好的模块构成更高一级的模块,用触发器组成代清零端的4位寄存器代码和实验结果如下:
module flop(data,clock,clear,q,qb);
input data,clock,clear;
output q,qb;
nand #10 nd1(a,data,clock,clear),
nd2(b,ndata,clock),
nd4(d,c,b,clear),
nd5(e,c,nclock),
nd6(f,d,nclock),
nd8(qb,q,f,clear);
nand #9 nd3(c,a,d),
nd7(q,e,qb);
not #10 iv1(ndata,data),
iv2(nclock,clock);
endmodule
上面的模块可以用行为描述块来实现,如下:
`include "flop.v"
module hardreg(d,clk,clrb,q);
input clk,clrb;
input[3:0] d;
output[3:0] q;
flop f1(d[0],clk,clrb,q[0],),
f2(d[1],clk,clrb,q[1],),
f3(d[2],clk,clrb,q[2],),
f4(d[3],clk,clrb,q[3],);
endmodule
门级描述表示电路的结构,是布线的依据,门级电路结构相当复杂,然而行为级描述比较直观,所以Verilog语言设计复杂逻辑电路的基本思路如下:
1.第一步设计工作:用直观的行为级描述语言描述电路,通过Verilog语言仿真测试验证正确性。
2.前端的逻辑设计:用一种工具(综合器synthesis tool)把行为描述转换为门级结构,仿真正确。
3.后端的制造准备工作
测试文件(test—bench或者text.-fix ture)的编写,代码如下:
`include "flop.v"
`include "hardreg.v"
module hardreg_top;
reg clock,clearb;
reg[3:0] data;
wire[3:0] qout;
`define stim #100 data=4‘b
event end_first_pass; //定义事件
hardreg reg_4bit(.d(data),.clk(clock),.clrb(clearb),.q(qout));
initial
begin
clock=0;
clearb=1;
end
always #50 clock=~clock; //产生时钟的方法
always @(end_first_pass)
clearb=~clearb; //事件触发的结果
always @(posedge clock)
$display("at time %0d clearb=%b data=%d qout=%d",$time,clearb,data,qout);
initial
begin
repeat(4)
begin
data=4‘b0000;
`stim 0001;
`stim 0010;
`stim 0011;
`stim 0100;
`stim 0101;
`stim 0110;
`stim 0111;
`stim 1000;
`stim 1001;
`stim 1010;
`stim 1011;
`stim 1100;
`stim 1011;
`stim 1100;
`stim 1101;
`stim 1110;
`stim 1111;
#200 ->end_first_pass; //此处触发该事件
end
$finish;
end
endmodule
阻塞赋值与非阻塞赋值初级:
[email protected](posedge clk)
begin
b<=a;//b=a;
d<=b;//d=b;
end
非阻塞赋值得到的是两个触发器的情况,然而阻塞赋值得到的却是一个触发器,具体见书44页。