Menu Close

Verilog仿真中检测上升沿和下降沿

在Verilog 语言仿真中, 有时会需要使用posedge negedge 作为敏感列表信息。正确检测,判断边沿在仿真中是十分重要的。其中:

posedge:是指一个信号的变化方向是趋向于 1

negedge:是指一个信号的变化方向是趋向于0

1  信号变化时产生边沿列表

如表1 所示:

当1 到 x,z ,0 或者 x,z 到0 发生时,一个negedge 被检测到。

当0到 x,z, 1 或者 x,z 到 1 发生时,一个posedge 被检测到。

 

表1

From To
0 1 x z
0 No edge posedge posedge posedge
1 negedge No edge negedge negedge
x negedge posedge No edge No edge
z negedge posedge No edge No edge

 

2 仿真程序:

`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company: 
// Engineer: 
// 
// Create Date: 07/06/2022 10:52:42 AM
// Design Name: 
// Module Name: edge_sim
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//////////////////////////////////////////////////////////////////////////////////


module edge_sim(
    );
    
    
reg a = 0;
reg rst = 1;
initial
begin
    $timeformat(-9,5," ns",12);
    #200;
    rst = 1;
    #10;
    rst = 0;
    $display("==== init a = 0, time = %0t  ====", $time);
    
    a = 0;
    #10;
    a = 0;
    
    #20;
    a = 0;
    #10;
    a = 1;
    
    #20;
    a = 0;
    #10;
    a = 1'bx;
    
    #20;
    a = 0;
    #10;
    a = 1'bz;

    #100;     
    rst = 1;
    #10;
    rst = 0;
    $display("==== init a = 1, time = %0t  ====", $time);
    
    a = 1;
    #10;
    a = 0;
    
    #20;
    a = 1;
    #10;
    a = 1;
    
    #20;
    a = 1;
    #10;
    a = 1'bx;
    
    #20;
    a = 1;
    #10;
    a = 1'bz;

    #100;     
    rst = 1;
    #10;
    rst = 0;
    $display("==== init a = x, time = %0t  ====", $time);
    
    a = 1'bx;
    #10;
    a = 0;
    
    #20;
    a = 1'bx;
    #10;
    a = 1;
    
    #20;
    a = 1'bx;
    #10;
    a = 1'bx;
    
    #20;
    a = 1'bx;
    #10;
    a = 1'bz;

    #100;     
    rst = 1;
    #10;
    rst = 0;
    $display("==== init a = z, time = %0t ====", $time);
    
    a = 1'bz;
    #10;
    a = 0;
    
    #20;
    a = 1'bz;
    #10;
    a = 1;
    
    #20;
    a = 1'bz;
    #10;
    a = 1'bx;
    
    #20;
    a = 1'bz;
    #10;
    a = 1'bz;
    
    #400
    $stop;
end    

initial
begin
    $monitor("a = %d, time = %t ",a, $time);
end

reg [3:0] pcnt = 0;
always @ (posedge a or posedge rst)
if(rst) pcnt <= 0;
else pcnt <= pcnt + 1;

reg [3:0] ncnt = 0;
always @ (negedge a or posedge rst)
if(rst) ncnt <= 0;
else ncnt <= ncnt + 1;

endmodule

 

3 仿真结果:

图1    a从0 到 1,x,z

如图1所示,当 a 从 0 -> 1;  0 -> x; 0-> z 时, 会产生posedge, 同时pcnt 计数器会被加1。只有 a 从 0 -> 0 时, 没有上升沿产生(posedge),其他情况,都是可以产生上升沿的。

图2   a从1 到 0,x,z

如图2所示, 当a 从1 -> 0; 1 -> x; 1 -> z 时, 有negedge 发生, 同时发现ncnt 计数器被加1。这里可以看出,当a 从 1 转到其他状态, 都会产生下降沿(negedge)只有 1 -> 1 不会产生下降沿。

图3  a从x,z 到 0,1,x,z

从图3 中也可以看出当a = x,z 时, 从 a  x -> 0; x -> 1;  x -> x; x -> z  以及 a 从 z -> 0; z -> 1; z -> x; z -> z 的情况, 同时,可以观察到相关的pcnt 和ncnt 的变化。当a 从 x -> x; x -> z 或者 z -> z;  z -> x 时,由于a 都是不确定状态, 所以在这些情况下,不会产生任何边沿。

Posted in FPGA, Verilog, Verilog, 教材与教案, 文章

2 Comments

发表回复

相关链接