精华内容
下载资源
问答
  • 赋值语句的运用

    2019-10-09 05:25:18
    开发过程中,我们用的最多的恐怕就是赋值语句了,我们常用的赋值方式有两种:阻塞赋值和非阻塞赋值。梦翼师兄刚开始学的时候就被这两种赋值方式搞晕了,当时脑子里面有几个问题总是一团乱麻-什么是阻塞赋值?什么...

    写在前面的话

    开发过程中,我们用的最多的恐怕就是赋值语句了,我们常用的赋值方式有两种:阻塞赋值和非阻塞赋值。梦翼师兄刚开始学的时候就被这两种赋值方式搞晕了,当时脑子里面有几个问题总是一团乱麻-什么是阻塞赋值?什么是非阻塞赋值?什么时候用阻塞赋值?什么时候用非阻塞赋值?这两种赋值方式到底有哪些不同?什么时候两种赋值方式结合起来用?当时由于好的教材比较少,因此梦翼师兄被这些简单的问题困扰了很久,今天通过本节课程的学习,梦翼师兄将通过一些实际的例子来说明这些问题。

    非阻塞赋值语句

    以赋值操作符“<=”来标识的赋值操作称为“非阻塞型过程赋值(Nonblocking Assignment)”。非阻塞型过程赋值语句的特点如下:

    (1) begin-end串行语句块中,一条非阻塞过程语句的执行不会阻塞下一条语句的执行,也就是说在本条非阻塞型过程赋值语句对应的赋值操作执行完之前,下一条语句也可以开始执行。

    (2) 仿真过程在遇到非阻塞型过程赋值语句后首先计算其右端赋值表达式的值,然后等到仿真时间结束时再将该计算结果赋值变量。也就是说,这种情况下的赋值操作是在同一仿真时刻上的其他普通操作结束后才得以执行。

    如以下语句的程序1:

    Initial

    begin

    A<=B;//语句S1

    B<=A; //语句S2

    end

    上述语句中包含了两条非阻塞型过程赋值语句S1和S2,当仿真进程遇到Initial过程块后(0时刻),语句S1首先开始执行,赋值表达式“B”的值得到计算(但是对被赋值变量A的赋值操作要等到当前时间步结束才执行),同时由于S1是一条非阻塞型赋值语句,所以S1的执行不会阻塞S2的执行;由于S2也随即开始执行,其对应的赋值表达式“A”的值得到计算,由于这时S1对A的赋值操作还没有执行,所以此时计算得到的赋值表达式取值是A的初值。由于S2也是一条非阻塞型赋值语句,它对应的为变量B进行赋值操作也要等到当前时间步结束时才会得到执行;所以在当前时间步结束时,S1、S2两条语句对应的赋值操作同时执行,分别将计算得到的A和B初值赋给变量B和A,这样就交换了A与B的取值。接下来,梦翼师兄和大家一起看一个实例,代码如下

    /****************************************************          

    *   Engineer        :   梦翼师兄

    *   QQ               :   761664056

    *   The module function:非阻塞赋值模块

    *****************************************************/

    01  module Assignment1(clk,rst_n);

    02  //系统输入

    03  input clk;//系统时钟输入

    04  input rst_n;//低电平复位信号

    05  //内部寄存器定义

    06  reg [1:0]a;//内部寄存器

    07  reg [1:0]b;//内部寄存器

    08  //赋值语句块

    09  always@(posedge clk or negedge rst_n)

    10      begin

    11          if(!rst_n)

    12              begin

    13                  a<=2;//寄存器赋初值

    14                  b<=1;//寄存器赋初值

    15              end

    16          else 

    17              begin

    18                  a<=b;//寄存器数据交换

    19                  b<=a;//寄存器数据交换

    20              end 

    21      end 

    22  endmodule 

    编写测试代码如下

     

    /****************************************************          

    *   Engineer        :   梦翼师兄

    *   QQ               :   761664056

    *   The module function:非阻塞赋值测试模块

    *****************************************************/

    01  `timescale 1ns/1ps 

    02  module tb;

    03

    04  reg clk;

    05  reg rst_n;

    06

    07  initial 

    08      begin

    09          clk=0;

    10          rst_n=0;

    11          # 1000.1 rst_n=1;

    12      end 

    13

    14  always #10 clk=~clk;    

    15      

    16  Assignment1 Assignment1(

    17      .clk(clk),

    18      .rst_n(rst_n)

    19   );

    20  endmodule 

     

    查看仿真波形如下:

    从仿真图我们可以看出,使用非阻塞型过程赋值语句,把a的初值给b,b的初值给a。因此可以证实我们前面的分析是正确的。非阻塞型过程赋值语句一般应用于时序逻辑。

    阻塞赋值语句

    以赋值操作符“=”来标识的赋值操作称为“阻塞型过程赋值(blocking Assignment)”。阻塞型过程赋值语句的特点是:

    1)串行块(begin-end)中的各条阻塞型过程赋值语句将以它们在顺序块中排列次序依次得到执行。

    2)阻塞型过程赋值语句的执行过程是:首先计算右端赋值表达式的值,然后立即将计算结果赋值给“=”左端的被赋值变量。

    阻塞型过程赋值语句的这两个特点表明:仿真进程在遇到阻塞型过程赋值语句时将计算表达式的值并立即将其结果赋给等式左边的被赋值变量;在串行语句块中,下一条语句的执行会被本条阻塞型过程赋值语句所阻塞,只有在当前这条阻塞型过程赋值语句所对应的赋值操作执行完后下一条语句才能开始执行。

    如以下语句程序2:

        initial

         begin

          a=0;//语句S1

          a=1;//语句s2

         end

    在这段语句中包含两条阻塞型过程赋值语句S1和S2,它们都是在仿真零时刻得到执行的,其对应的赋值操作也都是在0时刻进行的。但由于它们是阻塞型赋值语句,所以在执行S1语句是S2被阻塞而不能得到执行;只有在S1执行完,a被赋值0之后,S2才能开始执行。而S2的执行将使a被重新赋值1,所以上面这个过程块执行后变量a的值终取值为1。

    接下来,梦翼师兄和大家一起看一个实例,代码如下

    /****************************************************          

    *   Engineer        :   梦翼师兄

    *   QQ               :   761664056

    *   The module function:阻塞赋值模块

    *****************************************************/

    01  module Assignment2(clk,rst_n);

    02  //系统输入

    03  input clk;//系统时钟输入

    04  input rst_n;//低电平复位信号

    05  //内部寄存器定义

    06  reg [1:0]a;//内部寄存器

    07  reg [1:0]b;//内部寄存器

    08  //赋值语句块

    09  always@(posedge clk or negedge rst_n)

    10      begin

    11          if(!rst_n)

    12              begin

    13                  b=1;//寄存器赋初值

    14                  a=2;//寄存器赋初值

    15              end

    16          else 

    17              begin

    18                  b=a;//寄存器数据交换

    19                  a=b;//寄存器数据交换

    20              end 

    21      end 

    22  endmodule 

     

    查看仿真波形如下:

     

    可以看出,只是把赋值方式换成了阻塞型,结果就和非阻塞型的不同。阻塞型赋值语句一般用在组合逻辑中。

     

    转载于:https://www.cnblogs.com/mengyi1989/p/11502779.html

    展开全文
  • 在过程语句initial或者always,有阻塞于非阻塞两种赋值方式,对于初学者而言两种赋值语句的使用容易令人迷惑,下面我们就简单介绍一下这两种赋值语句的使用。 1、阻塞赋值语句 操作符为“=” 语法格式:变量=...

    在过程语句initial或者always中,有阻塞于非阻塞两种赋值方式,对于初学者而言两种赋值语句的使用容易令人迷惑,下面我们就简单介绍一下这两种赋值语句的使用。

    1、阻塞赋值语句

    操作符为“=”
    语法格式:变量=表达式;例:x=y
    在一个语句块中,阻塞赋值语句是按顺序执行的,即执行完前一条语句才能接下去执行下一条,因此被称为阻塞赋值。
    阻塞赋值语句的特点为:
    1)阻塞赋值语句的执行顺序为,先计算右边的表达式,然后立刻将结果赋值给左边的变量,与时间无关;
    2)在串行语句块中,阻塞赋值语句顺序执行,在并行语句块中,同时执行。

    2、非阻塞赋值语句

    操作符:“<="
    语法格式:变量<=表达式;例:x<=y
    非阻塞赋值顾名思义就是不会阻挡住后面赋值语句的进行,所以在一个语句块中,各条语句的执行是并发进行的不会对后面语句产生影响。
    特点如下:
    1)非阻塞赋值语句的执行特点为,先计算右边的表达式,然后等待延迟结束将其赋值给左边的变量;
    2)各条语句并发执行;

    3、区别与应用

    下面我们由一个例子来说明一下,阻塞与非阻塞赋值,对电路电路的逻辑功能以及电路结构的影响。
    exp1:

    module DFF_1(clk,q,in_1);
    	input clk,in_1;
    	output q;
    	reg q;
    	reg temp;
    	always@(posedge clk)
    	begin
    		temp=in_1;
    		q=temp;
    	end
    emdmodule 
    

    exp2:

    module DFF_2(clk,q,in_1);
    	input clk,in_1;
    	output q;
    	reg q;
    	always@(posedge clk) q=in;
    endmodule
    

    exp3:

    module DFF_3(clk,q,in_1);
    	input clk,in_1;
    	output q;
    	reg q;
    	reg temp;
    	always@(posedge clk)
    	begin
    		temp<=in_1;
    		q<=temp;
    	end
    endmodule 
    

    在epx1中in_1先赋值给temp,然后temp赋值给q,实际上与epx2是等价的。都是一个d触发器。
    而在epx3中两条语句是并发进行的,in_1赋值给temp的同时,temp也将上一个时钟的计算储存的值赋给q,实际上是两个D触发器。
    想要exp1也综合出两个触发器,需要将两个表达式调整顺序:

    q=temp;
    temp=in_1;
    
    展开全文
  • 有时,我们需要往一张表插入一条记录,同时返回主键ID值。 ...1)如果建表语句含有主键ID的触发器,通过触发器来实现主键ID的自增,实现方式如下: INSERT INTO GP_MONTH_BILL ( MONTH, ...

    有时,我们需要往一张表插入一条记录,同时返回主键ID值。

    假定主键ID的值都是通过对应表的SEQUENCE来获得,然后进行ID赋值

    这里有几种情况需要注意:

    1)如果建表语句含有主键ID的触发器,通过触发器来实现主键ID的自增,实现方式如下:

    INSERT INTO GP_MONTH_BILL (
                               MONTH,
                               BONUS_VALUE,
                               CUR_WAY,
                               CUR_TIME,
                               STATUS,
                               IS_USE,
                               CREATE_TIME)
         VALUES (
                 CUR_MONTH,
                 CUR_BONUS_VALUE,
                 '包函数固化',
                 SYSDATE,
                 '固化中',
                 1,
                 SYSDATE)
      RETURNING ID
           INTO CUR_MONTH_BILL_ID;   --CUR_MONTH_BILL_ID为变量,接收返回的ID值

    关键语法: INSERT INTO TABLE VALUES(,) RETURNING ID INTO  VAL

    补充:此种情况,触发器的语句可能如下

    CREATE OR REPLACE TRIGGER GPS.TR_EM_FILES 
    before insert on "GPS"."EM_FILES"
    for each row
    begin
      select "GPS"."SQ_EM_FILES".nextval into :new."ID" from dual;
    end;
    /

    oralce12c,主键是通过default设置SEQUENCE下一个值

    CREATE TABLE C##EM.GP_TARGET_TYPE
    (
      ID           NUMBER(19)                       DEFAULT "C##EM"."ISEQ$$_124895".nextval NOT NULL,  --DEFAULT默认值为seq的下个值
      NAME         NVARCHAR2(50)                    NOT NULL,
      REMARK       NVARCHAR2(200),
      CREATE_TIME  DATE                             NOT NULL,
      CREATE_UID   NUMBER(19),
      DELETE_UID   NUMBER(19),
      DELETE_TIME  DATE,
      IS_DELETE    NUMBER(1)                        NOT NULL,
      UPDATE_TIME  DATE,
      UPDATE_UID   NUMBER(19)
    )

     

    2)如果主键ID的值由用户自主获得SEQUENCE的值,然后赋值,实现方式可以如下:

    SELECT YOUR_SEQ.NEXTVAL  INTO MID_ID FROM DUAL; --MID_ID为变量
    
    INSERT INTO TABLE(ID) VALUES(MID_ID);

    补充:此种情况,可以有触发器,语句可能如下:

    CREATE OR REPLACE TRIGGER C##WL.TR_BULLETIN BEFORE INSERT
    ON C##WL.WL_BULLETIN 
    FOR EACH ROW
    WHEN (
    NEW.ID IS NULL OR NEW.ID = 0
          )
    BEGIN   
      SELECT   WL_BULLETIN_SEQ.NEXTVAL   INTO   :NEW.ID   FROM   DUAL;   
      END;
    /

    当前插入的主键ID为空值或0时,获取对应SEQUENCE 的NEXTVAL值来赋值主键ID

    转载于:https://www.cnblogs.com/senyier/p/7801575.html

    展开全文
  • 此讨论两种赋值方式的差异性。 首先根据表面含义深刻理解阻塞和非阻塞: 阻塞:进程语句(initial或者always或者其他),当前赋值语句的执行阻塞了后面语句的执行。即后面语句的赋值需要等到当前赋值...

    2017-12-01

    在Verilog语言中,赋值语句经常使用,阻塞赋值和非阻塞赋值经常带给我们很多困扰。在此讨论两种赋值方式的差异性。

           首先根据表面含义深刻理解阻塞和非阻塞:

           阻塞:在进程语句块中(initial或者always或者其他),当前赋值语句的执行阻塞了后面语句的执行。即后面语句的赋值需要等到当前赋值过程完成才能得以执行,即可认为执行过程是顺序执行(我们要明白Verilog中,大多数情况模块都是并发执行的)。

           非阻塞:当前赋值语句的执行不会阻塞后续语句的执行,即可以认为当前赋值语句的完成和后续的执行过程是并发执行的

           下面通过一个例子说明:

    initial                       initial
    begin                          begin
    b=a;                            b<=a;
    c=b;                            c<=b;
    end                             end             

        上述左侧为阻塞赋值,右侧为非阻塞赋值;

         左侧代码中,当b=a执行完之后,即b的值已经变成了a;此时,c的值被赋给b的值,实际上,c的值就是a的值了,即c=b=a;

         而右侧代码,b被赋给a的值,c被赋给b的值同时发生,即c得到得到的b的值,并非是改变后的b的值,而是b没有改变之前的原来的值。    

     

    转载于:https://www.cnblogs.com/shaonianpi/p/7944234.html

    展开全文
  • 赋值除了可以定义变量时,还可以程序的运行过程中,它可以使程序的运行更加灵活。Java程序的输入采用命令行方式。即编译了程序之后,命令行方式下输入:java [参数1] [参数2] …… [参数n]程序,即可...
  • Verilog HDL,有两种过程赋值方式,即阻塞式(blocking)和非阻塞式(non-blocking)。这两种赋值方式看似差不多,其实某些情况下却有着根本的区别,如果使用不当,综合出来的结果和你所想得到的结果会...
  • 阻塞赋值与非阻塞赋值 阻塞赋值的一般表达式为:目标变量名=驱动表达式 阻塞赋值是一种理想化的数据传输,...在过程启动,非阻塞赋值使三条语句同时运行,而阻塞赋值是按顺序方式完成更新的数据的。 新...
  • 函数有返回值,可以将结果直接赋值给变量,并且可以select语句中直接使用 4、函数的参数作用仅仅是将数据传入函数,存储过程的参数可以有传入和传出两种方式(即存储过程里,可以通过参数结果将所需要的结果返回...
  • 敲机房收费系统的过程中,遇到了这样一个问题那就是我需要的数据两个表,我就想实现如何同时查询两个表呢  对此问题经过查找和问同学得到了解决   解决一  : 也是我自己想的简单的解决方法,那...
  •  由于命令行无法直接使用declare这样使用变量,所以干脆用非常规的方式来解决吧,先建一个临时的存储过程存储过程中实现我要想的循环赋值,然后使用完后再删除这个存储过程就可以了。 具体的sql语句: /*...
  • 引用 Python程序会经常使用当前程序... 其他语句 除了赋值语句外,Python程序还包括一些其他的语句类型,例如,分支语句和循环语句等。更多的分支和循环内容将第4章介绍。这里仅简要介绍这两类语句的基本使用。 分...
  • 设计的行为功能使用下述过程语句结构描述: 1) initial语句:此语句只执行一次。 2) always语句:此语句总是循环执行, 或者说此语句重复执行。 只有寄存器类型数据能够这两种语句赋值。寄存器类型数据被...
  • Oracle 存储过程学习记录前言一、存储过程的创建1、无参存储过程2、带参存储过程3、带参数存储过程赋值方式4、存储过程中游标定义使用5、游标的定义二、Oracle对存储过程的调用 前言 存储过程(Stored ...
  • 存储过程语言

    2018-02-02 15:54:13
    变量四种赋值方式 存储过程表达式 IF - THEN - ELSE 循环语句WHILE 循环语句FOREACH 临时表 事务控制 异常处理 存储过程的权限 局部变量 仅本存储过程中有效的变量。局部变量不允许有缺省值 全局变量 ...
  • 概述因为最近做存储过程优化,碰到一个update语句的问题,有大佬建议用批量绑定的方式来做优化,所以研究了下这块,并简单做了个实验。批量绑定通常SQL语句中给PL/SQL变量赋值叫做绑定(Binding),一次绑定一个...
  • 大多数开发者应该都使用过Hibernate或者Mybatis的框架,或多或少都踩过一些坑!如MyBatis/Ibatis#和...如执行sql语句时你有时并不希望让变量进行处理,而是直接赋值执行,这时就要用到(${a})了,使用时还要...
  • MyBatis/Ibatis#和$的区别?#方式能够很大程度防止sql注入,$方式无法防止Sql注入。所以,老司机 对新手说,最好用#。...如执行sql语句时你有时并不希望让变量进行处理,而是直接赋值执...
  • 存储过程之二—变量

    2017-10-11 10:47:16
     局部变量一般定义sql语句,如存储过程的的begin/end。作用范围也只这个语句。执行完毕后,就会销毁。局部变量可以使用declare声明,default设置默认值。语法如下:  DECLARE 变量名称
  • Mysql存储过程参数列表

    千次阅读 2018-09-21 11:37:09
    如果某个复杂语句对性能要求较高,比较特殊,选择存储过程是明智之举,这里介绍一下存储过程的参数...out:会忽略实际参数值,传进来的值总是为null,在过程中对其赋值可以传出; inout:从存储过程传入和传出,...
  • mysql局部变量,只能用begin/end语句,比如存储过程中的begin/end语句块。 其作用域: 仅限于该语句块。 -- declare语句专门用于定义局部变量,可以使用default来说明默认值 declare age int default 0;...
  • java异常处理执行过程

    千次阅读 2007-07-26 20:04:00
    fianlly的代码一定会执行,除非执行前,先执行了exit,或者电脑断电。... fianlly语句虽然能return之前执行,但是finally语句不能通过重新给变量赋值方式改变return语句的返回值。 例如:
  • --创建用户自定义函数--根据函数主体的定义方式,下列语句在函数内有效--赋值语句--TRY....CATCH语句以外的流控制语句--定义局部数据变量和局部游标的DECLARE语句--SELECT语句,其中的选择列包含为局部变量分配值的...
  • 所以我们需要修改存储当前指令的IP寄存器,为其赋值过程中我们就需要赋值,道理同上。 例子,我们经常使用的是mov ax,……,这里要说明一下,寻址方式不一定非要是mov指令,而且mov指令这样的两个操作数都可以...
  • 数据流方式—使用连续赋值语句方式建模;结构化方式—使用门和模块实例语句描述建模。y Verilog HDL 有两类数据类型:线网数据类型和寄存器数据类型。线网类型表示构件间的物理连线,而寄存器类型表示抽象的数据...
  • 1、标识符不同。函数的标识符为FUNCTION,过程为:PROCEDURE。2、函数一般不用变量形参,用函数名直接返回函数值;而过程如有返回值,则...函数的调用出现表达式过程调用,由独立的过程调用语句来完成。6、过
  • 1.元胞数组(Cell)的创建方式可以通过以下两种方式创建Cell元胞数组:使用赋值语句使用 cell 函数预分配数组,然后将数据分配给单元此之前,有必要了解一下元胞数组的结构以及存储数据的方式。元胞数组是 MATLAB ...

空空如也

空空如也

1 2 3 4 5 ... 14
收藏数 276
精华内容 110
关键字:

在过程语句赋值方式中