Verilog HDL语言中关于赋值的一些概念

Verilog HDL语言中关于赋值的一些概念

赋值有四种方法:门基元,持续(连续)赋值,过程阻塞赋值(“=”)和非阻塞赋值(“<=“)。这四种方法分成两大类:门级时序模型和过程时序模型。

门级时序模型:

门基元:and(a,b,c);

又可写成:assign a = b&c;

这两个语句是等价的,两者都是执行b和c的按位与运算,并将结果赋给a。无论什么时候,只要任何一个输入(b或c)发生变化,都要重新计算输出a的值。此外,a是个线网。

过程时序模型:

过程时序模型使用initial和always块中的过程语句来产生新值。注意initial和always块中的语句是顺序执行的。

         always块:

         always@(posedge clock)

                   Q <= D;

         两个输入(clock和D)一个输出Q。与门级时序相对应,过程赋值对它的所有输入不敏感;只在特定的时刻对特定的输入敏感。这里,always只对时钟上升沿的变化敏感,当时钟上升沿出现的时候,Q被D的值更新。但是,如果always块的输入端另一个输入D改变了,Q的值并不更新。过程模型支队它们显示等待的输入敏感,此外,所有过程赋值语句的左侧都是寄存器。

         过程阻塞赋值(“=”)立即更新它左边的值,所以新值可以使用在下一条过程语句中。相反,过程非阻塞赋值(“<=”)只有当整个设计中等待同一边沿的所有”<=”语句都计算完毕后才更新它左边的值,可以形象地说新值别想在这次边沿有效时使用。比如:

         @(posedge clock)

         m = 3;

         n = 75;

n <= m;

r = n;

请问本次边沿有效后什么值赋给了r呢?答案是75,虽然第三条语句把n的值改为3,但是本次边沿别想用这个新值,但“=”的赋的新值立即可用。

本质(这个本质就是电路实现)上讲,这两种时序模型与Verilog语言的两种基本数据类型(线网和寄存器)有密切连续,持续赋值和基元们只能驱动线网,而过程赋值只能用于寄存器。

描述组合逻辑的always块里面用阻塞式赋值 “=”;
描述时序逻辑的always块里面用非阻塞赋值 “<=”

 

 

 

 

 

你可能感兴趣的:(FPGA)