新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > 深入分析verilog阻塞和非阻塞赋值

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

作者:时间:2017-10-13来源:网络收藏

原文链接:学 一个月了,在开发板上面写了很多代码,但是始终对一些问题理解的不够透彻,这里我们来写几个例子仿真出和非的区别,我们先上代码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 = 1b1; F2 = 1b1; end elsebeginF1 = scan;F2 = F1; end/*******************信号传递之间的阻塞赋值****************************************/ always @ ( posedge CLK or negedge RSTn ) // if( !RSTn ) begin a = 1b1; b = 1b1; end elsebegina = scan;b = a; end/******************数据加 赋值 先判断后计数*****************************************/always @ ( posedge CLK or negedge RSTn ) //one =if( !RSTn )beginone=0;endelsebeginif(one==14)one=0;else one=one+1;end/***************数据加 赋值 先计数后判断********************************************/ always @ ( posedge CLK or negedge RSTn ) // two=if( !RSTn )begintwo=0;endelsebegintwo=two+1;if(two==14)two=0;end/**************数据加 阻塞赋值 先判断后计数*********************************************/always @ ( posedge CLK or negedge RSTn ) //three =if( !RSTn )beginthree=0;endelsebeginif(three==14)three=0;elsethree=three+1;end/*************数据加 阻塞赋值 先计数后判断**********************************************/always @ ( posedge CLK or negedge RSTn ) //four =if( !RSTn )beginfour=0;endelsebeginfour=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;// wireswire 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));/*iniTIalbegin// code that executes only once// insert code here --> begin// --> end$display(Running testbench);endalways// opTIonal sensitivity list// @(event1 or event2 or .... eventn)begin// code executes for every event on sensitivity list// insert code here --> begin@eachvec;// --> endendendmodule*/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 = 1b1; F2 = 1b1; end elsebeginF1 = scan;F2 = F1; end/***********************************************************/ always @ ( posedge CLK or negedge RSTn ) // if( !RSTn ) begin a = 1b1; b = 1b1; end elsebegina = scan;b = a; end/***********************************************************/assign flag = F2 !F1;assign c = b !a;/***************************************/endmodule 代码涵义就不讲解了2、test bench 代码,与上面相同,这里不重复了3、上图 看波形

本文引用地址:http://www.eepw.com.cn/article/201710/365699.htm


关键词: verilog 阻塞 非阻塞

评论

技术专区

关闭