发布时间 : 星期五 文章第8章 仿真更新完毕开始阅读89dde9240722192e4536f6cb
#DELY #DELY end
A= 8'd255; B= 8'd255; cin=1'b1; $finish;
initial $monitor($time,,,\; //输出格式定义 endmodule
module add8(SUM,cout,A,B,cin); //待测试的8位加法器模块 output[7:0] SUM; output cout; input[7:0] A,B; input cin;
assign {cout,SUM}=A+B+cin; endmodule
上面的例子用ModelSim编译仿真后的输出波形如图8.8(书中217页)所示。 文本输出如下所示:
3、2选1数据选择器的仿真
下面是一个2选1多路选择器仿真的例子。 例8-29 2选1多路选择器的仿真 'timescale 1ns/1ns module mux_tp; reg a,b,sel; wire out;
MUX2_1 m1(out,a,b,sel); //调用待测试模块 initial begin
a=1'b0; b=1'b0; sel=1'b0; #5 sel=1''b1; #5 a=1'b1; #5 sel=1'b1;
#5 a=1'b0; b=1'b1; sel=1'b0;
25
sel=1'b0;
#5 sel=1'b1;
#5 a=1'b1; b=1'b1; sel=1'b0; #5 sel=1'b1; end
initial $monitor($time,,,\; endmodule
module MUX2_1(out,a,b,sel); input a,b,sel; output out;
not #(0.4,0.3) (sel_,sel); and #(0.7,0.6) (a1,a,sel_); and #(0.7,0.6) (a2,b,sel); or #(0.7,0.6) (out,a1,a2); endmodule
2选1多路选择器的源代码如下所示,采用门级结构描述,图8.9(书中218页)是其门级原理图。 module MUX2_i(out, a,b,sel); //待测试的2选1MUX模块 input a,b,sel; output out;
not#(0.4,0.3)(sel_,sel); // #(0.4,0.3)为门延时 and#(0.7,0.6) (a1,a,sel_); and#(0.7,0.6) (a2,b,sel); or#(0.7,0.6) (out,al,a2 ); endmodule
上面的程序用ModelSim编译,仿真波形如图8.10(书中218页)所示。 主窗口中的文本显示如下所示:
从上面的输出结果可看出:由于在2选1 NEUX模块中对门元件的延时作了定义,因此当输入a、b、sel的值发生变化时,out并没有立即改变,而是经过相应的门延时后,out的值才改变。
8.5.4 时序电路的仿真
以一个带有同步复位的8位计数器的仿真为例,介绍时序电路的仿真。
26
例8-30 8位计数器的仿真 'timescale 10ns/1ns module count8_tp;
reg clk,reset; //输入激励信号定义为reg型 wire[7:0] qout; //输出信号定义为wire型 parameter DELY=100;
counter C1(qout,reset,clk); //调用测试对象 always #(DELY/2) clk = ~clk; //产生时钟波形 initial //激励波形定义 begin
clk =0; reset=0;
#DELY reset=1; #DELY
reset=0;
#(DELY*300) $finish; end //结果显示
initial $monitor($time,,,\; endmodule
module counter(qout,reset,clk); //待测试的8位计数器模块 output[7:0] qout; input clk,reset; reg[7:0] qout; always @(posedge clk) begin
if (reset) qout<=0; else
qout<=qout+1; end endmodule
上面的程序用ModelSim编译仿真后的波形如图8.11(书中220页)所示。 主窗口中的文本显示如下所示:.
27