5.8举例仿真

对5.8及5章题目的仿真

1.四选一多路选择器

四选一多路选择器的执行模块:

/* 
    下面是一个四选一多路选择器的单元模块。
 */
 module mux4_to_1(out,i0,i1,i2,i3,s1,s0);

output out;
input i0,i1,i2,i3;
input s1,s0;
reg out;
always @(s1 or s0 or i0 or i1 or i2 or i3)
begin
    case({s1,s0})
    2'b00:out=i0;
    2'b01:out=i1;
    2'b10:out=i2;
    2'b11:out=i3;
    default:out=1'bx;
    endcase
end
endmodule

四选一多路选择器的测试单元模块:

/* 
对study_1.v的测试模块 */

`include "study_1.v"
module study_1_tb;
reg ts1,ts0,ti0,ti1,ti2,ti3;
reg clock;
wire tout;
initial

begin
    ts1=0;
    ts0=0;
    ti0=0;
    ti1=0;
    ti2=0;
    ti3=0;
    clock=0;
end
always #25 clock=~clock;

always @(posedge clock)
begin    
    #1 ti0=($random)%2;
    #1 ti1=($random)%2;
    #1 ti2=($random)%2;
    #1 ti3=($random)%2;
end
always # 50 begin
    {ts1,ts0}=2'b00;
    #50 {ts1,ts0}=2'b01;
    #100 {ts1,ts0}=2'b10;
    #150 {ts1,ts0}=2'b11;
    end
mux4_to_1 m (.out(tout),.i0(ti0),.i1(ti1),.i2(ti2),.i3(ti3),.s1(ts1),.s0(ts0));
endmodule

注意:1)在初始化的时候,不能写成 ts0=1'b0;只能写成ts0=0;(?)  2)不能写成ts0=ts1=ti0=0;只能写成ts0=0;ts1=0;ti0=0;

仿真结果:

不过但我想按照书上P60页说的“forever与always语句不同之处在于不能独立写在程序中,而必须写在initial块中。”的意思,将控制信号{ts1,ts0}用forever写在initial块中,而不是用always生成;代码如下:

/* 
对study_1.v的测试模块 */

`include "study_1.v"
module study_1_tb;
reg ts1,ts0,ti0,ti1,ti2,ti3;
reg clock;
wire tout;
initial
begin
forever
    begin
     {ts1,ts0}=2'b00;
    #25 {ts1,ts0}=2'b01;
    #25 {ts1,ts0}=2'b10;
    #25 {ts1,ts0}=2'b11;
    end
// begin
    // ts1=0;
    // ts0=0;
    // ti0=0;
    // ti1=0;
    // ti2=0;
    // ti3=0;
    clock=0;
end
always #25 clock=~clock;

always @(posedge clock)
begin    
    // #1 ts1=($random)%2;
    // #1 ts0=($random)%2;
    #1 ti0=($random)%2;
    #1 ti1=($random)%2;
    #1 ti2=($random)%2;
    #1 ti3=($random)%2;
end
// always # 50 begin
    // {ts1,ts0}=2'b00;
    // #50 {ts1,ts0}=2'b01;
    // #100 {ts1,ts0}=2'b10;
    // #150 {ts1,ts0}=2'b11;
    // end
mux4_to_1 m (.out(tout),.i0(ti0),.i1(ti1),.i2(ti2),.i3(ti3),.s1(ts1),.s0(ts0));
endmodule

当用上面的代码进行仿真时;

 

原因:在initial中,forever下面的clock初始化一直没有完成。那么clock一直是x,那么后面对clock的反转,上升沿的判断都因为clock是不定值而无法正确实现。

解决方法:initial下的第一个大的begin-end换成fork-join就行了。

最后的输出时序貌似有问题。不过现在不考虑这些问题。。。。。。

四位计数器

 

 1 // 四位二进制计数器  功能模块
 2 module counter(Q,clock,clear);
 3 output [3:0] Q;
 4 input clock,clear;
 5 reg [3:0] Q;
 6 
 7 always @(posedge clear or negedge clock)
 8 begin 
 9     if (clear)
10         Q<=4'b0;
11     else
12         Q<=Q+1;
13 end
14 endmodule
15 
16 
17 // 四位二进制计数器  测试模块
18 module countertb;
19 reg clock_tb,clear_tb;
20 wire [3:0] Q_tb;
21 
22 initial
23 begin
24 clock_tb=0;
25 clear_tb=1;
26 end
27 always #25 clock_tb=~clock_tb;
28 always #1000 clear_tb=~clear_tb;
29 counter c (Q_tb,clock_tb,clear_tb);
30 endmodule

第25行要初始化clear_tb=1;不然前面会产生输出的不定态。

 课后答案:http://download.csdn.net/download/m0_38073085/10270506

posted on 2018-03-06 11:22  我是人间惆怅客1  阅读(270)  评论(0)    收藏  举报

导航