深入分析verilog阻塞和非阻塞赋值

FPGA/ASIC技术

205人已加入

描述

原文链接:学verilog 一个月了,在开发板上面写了很多代码,但是始终对一些问题理解的不够透彻,这里我们来写几个例子仿真出阻塞和非阻塞的区别,我们先上代码module LED  (    CLK, RSTn,    scan,    flag ,    c,    ,one,two,three,four);     input CLK;     input RSTn;     input scan;     output flag,c;     output [3:0] one,two,three,four;/***********************************************************/        reg F1,F2;    reg a,b;    reg [3:0] one,two,three,four; /********************信号传递之间的非阻塞赋值***************************************/    always @ ( posedge CLK or negedge RSTn )   //      if( !RSTn )         begin           F1 <= 1'b1;           F2 <= 1'b1;      end      else  begin   F1 <= scan;   F2 <= F1;      end /*******************信号传递之间的阻塞赋值****************************************/    always @ ( posedge CLK or negedge RSTn )   //      if( !RSTn )         begin           a = 1'b1;           b = 1'b1;      end      else  begin   a = scan;   b = a;      end /******************数据加  非阻塞赋值  先判断后计数*****************************************/      always @ ( posedge CLK or negedge RSTn )   //one <=  if( !RSTn )   begin    one<=0;   end  else  begin   if(one==14)       one<=0;   else          one<=one+1;  end/***************数据加  非阻塞赋值  先计数后判断********************************************/    always @ ( posedge CLK or negedge RSTn )    //  two<=  if( !RSTn )   begin    two<=0;   end  else  begin   two<=two+1;   if(two==14)    two<=0;  end /**************数据加  阻塞赋值  先判断后计数*********************************************/ always @ ( posedge CLK or negedge RSTn )  //three =  if( !RSTn )   begin    three=0;   end  else  begin   if(three==14)    three=0;   else    three=three+1;  end/*************数据加  阻塞赋值  先计数后判断**********************************************/ always @ ( posedge CLK or negedge RSTn )  //four =  if( !RSTn )   begin    four=0;   end  else  begin   four=four+1;   if(four==14)    four=0;  end            /****************信号之间传递***********************/ assign flag = F2 & !F1;assign c  = b  & !a;/***************************************/ endmodule      2、我使用modesim 仿真,下面为我的  test bench `timescale 1 ps/ 1 psmodule LED_vlg_tst();// constants                                          // general purpose registersreg eachvec;// test vector input registersreg CLK;reg RSTn;reg scan;// wires                                              wire c;wire flag;wire [3:0]  four;wire [3:0]  one;wire [3:0]  three;wire [3:0]  two;// assign statements (if any)                         LED i1 (// port map - connection between master ports and signals/registers   .CLK(CLK), .RSTn(RSTn), .c(c), .flag(flag), .four(four), .one(one), .scan(scan), .three(three), .two(two));/*initial                                               begin                                                 // code that executes only once                       // insert code here --> begin                                                                               // --> end                                            $display("Running testbench");                      end                                                   always                                                // optional sensitivity list                          // @(event1 or event2 or .... eventn)                 begin                                                 // code executes for every event on sensitivity list  // insert code here --> begin                                                                               @eachvec;                                             // --> end                                            end                                                   endmodule*/initial beginCLK = 0;forever#10 CLK = ~CLK; endinitial beginscan = 0;forever#100 scan = ~scan; endinitial beginRSTn = 0;#1000 RSTn =  1;#1000;#1000;#1000;#1000;#1000;#1000;#1000;#1000;$stop;endendmodule 主要就是初始化一个CLK 和scan的信号,然后就是初始化一下复位,最后就是设置仿真时间,这样modesim 就不会一直处于仿真状态,消耗资源,也可以方便仿真。 其中quartus  与modesim  互相调用调试,可以关注我的博客,这里我就不具体讲解了! 3、modesim 波形图  大家注意到红线框内的数据变化,就能很清楚的理解 阻塞与非阻塞了!  微观分析 阻塞与非阻塞1、上代码,具体观察,a,b,c与F1,F2,flage 的变化 module LED  (    CLK, RSTn,    scan,    flag ,    a,b,c,F1,F2,);     input CLK;     input RSTn;     input scan;     output flag,a,b,c;     output F1,F2;/***********************************************************/        reg F1,F2;    reg a,b; /***********************************************************/    always @ ( posedge CLK or negedge RSTn )   //      if( !RSTn )         begin           F1 <= 1'b1;           F2 <= 1'b1;      end      else  begin   F1 <= scan;   F2 <= F1;      end /***********************************************************/    always @ ( posedge CLK or negedge RSTn )   //      if( !RSTn )         begin           a = 1'b1;           b = 1'b1;      end      else  begin   a = scan;   b = a;      end /***********************************************************/      assign flag = F2 & !F1;assign c  = b  & !a;/***************************************/ endmodule     代码涵义就不讲解了 2、test bench 代码,与上面相同,这里不重复了 3、上图   看波形

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分