精华内容
下载资源
问答
  • 文章简介本系列文章主要针对FPGA初学者编写,包括FPGA的模块书写、基础语法、状态机、RAM、UART、SPI、VGA、以及功能验证等。...伍第五章:赋值语句在 Verilog HDL 中常用的几种赋值语句,在前面的章节中已经了...

    文章

    简介

    本系列文章主要针对FPGA初学者编写,包括FPGA的模块书写、基础语法、状态机、RAM、UART、SPI、VGA、以及功能验证等。将每一个知识点作为一个章节进行讲解,旨在更快速的提升初学者在FPGA开发方面的能力,每一个章节中都有针对性的代码书写以及代码的讲解,可作为读者参考。

    371a64ef5b48c5ab01061ddd763b09ef.gif

    第五章:赋值语句

    371a64ef5b48c5ab01061ddd763b09ef.gif

            在 Verilog HDL 中常用的几种赋值语句,在前面的章节中已经了解到两种,一种是 assign,一种是 always,还有一种常用的叫做 initial(初始化),本章中将会讲解这三种常用的赋值语句的用法。

            在学习数字电路时,应该了解了组合逻辑和时序逻辑的概念,通俗说组合逻辑是完全由线与运算符组成的电路,它的运行不受时钟沿控制,而时序逻辑其实是在组合逻辑上加上寄存器,最终的结果受到时钟沿的控制。

            知道了组合逻辑和时序逻辑,就能很好的区分 assign 和 always 的用法了。assign 语句只能实现组合逻辑,也就是说在 assign 赋值的语句中无法加入时钟沿,只能由线和运算符组成,所以用 assign 赋值的变量必须为 wire 型,如下所示为 assign 赋值的例子。

    代码示例 1:

    wire a;
    wire b;
    wire c;
    assign c = a & b;

    代码分析 1:
            ①第 1、 2 行定义两个 wire 型变量, 此处也可以定义为 reg 型, a、b 的变量类型需要根据是由什么方式被赋值决定, 若是 a、 b 为 input,则其必须为 wire型,若是 a、 b 是在本模块中使用, 使用assign 语句得到则为 wire 型, always 语句得到则为 reg 型;
            ②第 3 行的 c 变量由于在 assign 中被赋值,所以必须定义成 wire 型;
          ③第4 行是使用 assign 语句的格式。每一个 assign 语句后面只能跟随一条语句,若是有多条语句都要在 assign 中赋值,则可以写多个 assign 语句。使用assign 进行赋值时,完成的是组合逻辑,所以赋值号必须用阻塞赋值(=)。当 a或者 b 变化时, a 与 b 运算的结果会重新赋值给 c。always 语句不仅能实现时序逻辑,而且能实现组合逻辑, 实现时序逻辑如下
    所示。

    代码示例 2:

                             wire a;

                             wire b;

                             reg c;

    always@(posedge clk)

                                    c <= a&b;

    代码解析 2:

            ①第 1、 2 行定义2个 wire 型变量;
            ②第 3 行定义一个 reg 型变量,由于 c 需要在 always 中被赋值,所以 c 必须定义为 reg 型;
            ③第 4 行中的 clk,一般是由开发板晶振提供,所以此处 clk 应该被定义 input,但是在此处被省略定义。此行中 always 后面跟随的@(posedge clk) 是该条语句的敏感信号,它表述的意思是总在遇到 clk 的上升沿时,执行该 always 中的语句,posedge 为上升沿,下降沿为 negedge。在使用 always 语句时必须要有对应的敏感信号,可以为@()形式,也可以为#延时形式,但是#延时形式写在功能文件中是无意义的, 所以尽量只写到测试文件中, @()既可以出现在功能文件也可以出现在测试文件中。always 后面没有敏感信息是不允许的;
            ④第 5 行中使用了非阻塞赋值号(<=), 在实现时序逻辑时,赋值号需要用非阻塞赋值号。当遇到时钟上升沿时, a 与 b 运算的结果会赋值给 c。

    always 实现组合逻辑代码示例如下所示。

    代码示例 3:

                                  wire a;

                                  wire b;

                                  reg c;

    always@(a or b)

                                        c = a & b;

    代码解析 3:
            ①第 1、 2 行定义wire型变量;
            ②第 3 行定义一个 reg 型变量,由于 c 需要在 always 中被赋值,所以 c 必须定义为 reg 型。虽然在此将 c 定义成 reg 型,但是由于该代码是针对组合逻辑进行描述, 所以在综合器(ISE)综合的时候会自动将 reg 综合成 wire, 但是需要知道无论描述组合逻辑还是时序逻辑,只要在 always 中被赋值,该变量必须要定义成 reg;
            ③第 4 行为 always 后面是有@()形式的另外一种写法,此处括号内没有写posedge 或negedge,表明此语句不是由沿触发,而是由电平触发,所以该电路实现的是跟沿无关的组合逻辑。此处括号内的 or 可改为  , ;
            ④为了符合语法要求,此处第 7 行的赋值号为阻塞赋值号(=)。Always 实现组合逻辑综合后的电路和 assign 实现组合逻辑综合后的电路是一样的。当 a 或者b 有变化时,则会执行该 always 内的语句。initial 语句是初始化语句, 会在上电(电路刚刚运行时) 执行一次,不会循环执行。在电路中只有可以存储数据的寄存器才有初始化的必要,所以 initial 语句中被赋值的变量也必须为 reg。某些第三方综合软件认为 initial 是不可以被综合的,也就是说不可以被写到功能文件中的,所以为了代码的兼容性,我们尽量只在测试文件中写 initial 语句。当 initial 和 always 同用时可以很好的描述出时钟。

    代码示例 4:

                                reg clk;

                                initial

                                    begin
                                        clk = 1'b1;

                                        always #5 clk = ~clk;

                                    end

    代码解析 4:
    ①第 1 行定义 reg 型的 clk;
    ②第 2、 4 行对 clk 进行初始化,初始化的值为 1bit 的二进制数据 1;
    ③第 5 行中~是取反号,此处的意思 clk 在每延时 5 个时间单位,则会取反一次,如此就会产生图 1 所示的方波。

    3a2b44d2807e40617ccbef62bf160770.png

    图1 时钟波形

            在第六章中将对Verilog HDL 中的运算符号进行讲解。

    FPGA入门系列1--模块书写&电路综合

    FPGA入门系列2--仿真验证

    FPGA入门系列3--wire与reg

    未完待续c2e2b1440a42f7e493b2e72d8a1cee3a.gif

    371a64ef5b48c5ab01061ddd763b09ef.gif

    322b5007bf773a91511725f954da9d37.gif 关注我们了解更多资讯

    6680e0e768f2a7a76929103395c74fa2.png31d91d64492b6c5b8ff51333ff3b2414.png
    展开全文
  • 最基本的语句——赋值语句

    千次阅读 2019-06-27 14:46:47
    在C程序中最常用的语句是:赋值语句和输入输出语句。 一、赋值运算符 赋值符号=就是赋值运算符,它的作用是将一个数据赋给一个变量。执行过程称为:赋值操作或赋值运算。 将一个常量赋给一个变量 例如:int a = ...

    最基本的语句——赋值语句

    【知识点】

    1. 赋值运算符;
    2. 复合的赋值运算符;
    3. 赋值表达式;
    4. *赋值过程中的类型转换;
    5. 赋值表达式和赋值语句;
    6. 变量赋初值;

    【内容】

    在C程序中最常用的语句是:赋值语句和输入输出语句。

    一、赋值运算符

    赋值符号=就是赋值运算符,它的作用是将一个数据赋给一个变量。执行过程称为:赋值操作或赋值运算。

    1. 将一个常量赋给一个变量
      1. 例如:int a = 23;//将常量23赋给变量a
    2. 将一个表达式的值赋给一个变量

    二、复合的赋值运算符

    在赋值符=前加上其他运算符,可以构成复合的运算符。有以下复合运算符:

    • +=
    • -=
    • *=
    • /=
    • %=

    a += b;// a = a + b;

    注意:若b是包含若干项的表达式,则相当于它有括号。(推荐:在b包含若干项表达式时,使用括号将b括起来)例如:

    三、赋值表达式

    定义:由赋值运算符将一个变量和一个表达式连接起来的式子称为“赋值表达式”。

    形式:变量 赋值运算符(=) 表达式

    作用:将一个表达式的值赋给一个变量。(计算、赋值功能)

    概念:左值(left value,lvalue)、右值(right value,rvalue)

    左值:

    1. 出现在赋值运算符的左侧;
    2. 其值可以改变;

    注意:变量可以作为左值,算术表达式a+b不能作为左值,常量的值不能改变也不能作为左值。

    右值:出现在赋值运算符的右侧。左值也可以出现在赋值运算符右侧,因此左值也可以作为右值。

    *四、赋值过程中的类型转换

    如果赋值运算符两侧的类型一致,则直接进行赋值。

    如果赋值运算符两侧的类型不一致,但都是算术类型时,在赋值时要进行类型转换。类型转换是由系统自动进行的,转换的规则是:

    1. 将浮点型数据(包括单、双精度)赋给整型变量时,先对浮点数取整,即舍弃小数部分,然后赋予整型变量。
    2. 将整型数据赋给单、双精度变量时,数值不变,但以浮点数形式存储到变量中。
    3. 将一个double型数据赋给float变量时,先将双精度数转换为单精度,即只取6-7位有效数字,存储到float变量的4个字节中。注意:双精度数值的大小不能超出float型变量的数值范围。
    4. 将一个float型数据赋给double变量时,数值不变,在内存中以8个字节存储,有效位数扩展到15位。
    5. 字符型数据赋给整型变量时,将字符的ASCII码值赋给整型变量。
    6. *将一个占字节多的整型数据赋给一个占字节少的整型变量或字符变量时,只将其低字节原封不动地送到被赋值的变量。例如:

    本质:

    1. 整型数据之间的赋值,是按存储单元中的存储形式直接传送。
    2. 实型数据之间以及整型与实型之间的赋值,是先转换(类型)后赋值。

    总结:

    1. 赋值运算符两侧类型不一致,系统先转换后赋值;
    2. 算术运算符两侧类型不一致,系统先转换后运算;

    五、赋值表达式和赋值语句

    六、变量赋初值

    注意:如果对几个变量赋予同一个初值,应写成:

    int a = 3, b = 3, c = 3;

    不能写成:

    int a = b = c = 3;

    一般变量初始化不是在编译阶段完成的(只有在静态存储变量和外部变量的初始化是在编译阶段完成的),而是在程序运行时执行本函数时赋予初值的,相当于执行一个赋值语句。

    展开全文
  • 1.print语句 ①括号括起来(自python3),逗号隔开 ②输出时,隔开的各个字符串前会自动加空格 ③需要输出的符号可包含在...3.赋值语句 ①序列赋值 ②交换变量 ③链式&amp;amp;增量赋值 未完待续…… ...

    1.print语句

    ①括号括起来(自python3),逗号隔开

    ②输出时,隔开的各个字符串前会自动加空格

    ③需要输出的符号可包含在字符串中,也可单独输出,使用+号则不增加空格

    ④同行打印的几种方法

    2.import语句

    ①轻量化:导入某模块的某函数

    ②大块导入:导入某模块的所有函数

    ③导入加改函数名

    3.赋值语句

    ①序列赋值

    ②交换变量

    ③链式&增量赋值

    未完待续……

    如有疑问或补充,请留言!

    展开全文
  • 3.2 赋值语句;3.2 赋值语句;PowerPoint 演示文稿;PowerPoint 演示文稿;PowerPoint 演示文稿;3.3.1 printf函数;2. printf函数中常用的;2数据类型修饰符;例3.2 在printf函;输出实型数据所占的宽度; 输出数据的精度;4...
  • python增强赋值语句

    2020-02-15 23:15:38
    常用的增强赋值语句有: x += y x -= y x &= y x |= y x *= y x /= y 等等… 其中需要注意的就是,增强赋值中自带的优化选择功能带来的问题 以列表为例,我们知道要将元素添加到列表末尾有两种方式: 合并...

    python的增强赋值语句是从C语言中借鉴来的,它有输入更少,执行更快,有优化技术自行选择等优点,建议在程序中多加使用。

    常用的增强赋值语句有:

    1. x += y
    2. x -= y
    3. x &= y
    4. x |= y
    5. x *= y
    6. x /= y

    等等…

    其中需要注意的就是,增强赋值中自带的优化选择功能带来的问题

    以列表为例,我们知道要将元素添加到列表末尾有两种方式:

    1. 合并运算
    # 合并运算典型用法有:
    L = [1, 2,]
    L = L + [3, 4, 5]
    print(L)
    # 运行结果为
    [1, 2, 3, 4, 5]
    

    这种运行在底层是创建一个新的对象再将两部分输入,运行速度更慢

    1. 在原处修改列表
    L = [1, 2,]
    L.extend([3, 4, 5])
    print(L)
    # 运行结果为
    [1, 2, 3, 4, 5]
    

    这种方式是直接在列表末尾添加,速度较快。而增强赋值运算会默认选择速度较快的方式。

    所以在某些情况下需要注意 x = x + y 与 x += y 是不同的:

    x = x + y 示例:

    L = [1, 2]
    M = L
    L = L + [3, 4]
    print(L)
    print(M)
    # 运行结果
    [1,2, 3, 4]
    [1, 2]
    

    x += y 示例:

    L = [1, 2]
    M = L
    L += [3, 4]
    print(L)
    print(M)
    # 运行结果
    [1,2, 3, 4]
    [1,2, 3, 4]
    
    展开全文
  • 赋值语句的运用

    2019-10-09 05:25:18
    开发过程中,我们用的最多的恐怕就是赋值语句了,我们常用的赋值方式有两种:阻塞赋值和非阻塞赋值。梦翼师兄刚开始学的时候就被这两种赋值方式搞晕了,当时脑子里面有几个问题总是一团乱麻-什么是阻塞赋值?什么...
  • 【小练习】程序设计基本概念:赋值语句_常用运算符11.练习源码2.关键点分析2.1 运算符作用2.2 计算过程及答案 1.练习源码 #include "stdafx.h" #include &lt;iostream&gt; using namespace std; ...
  • 实验目的: 通过设计、编制、调试一个典型的赋值语句的语法分析程序,实现对词法分析程序所提供的单词序列进行语法检查,进一步掌握常用的语法分析方法。
  • Delphi7--赋值语句

    2019-02-20 22:21:30
    1、赋值语句语法格式:  格式1: 变量名 := 表达式;  格式2 对象.属性名 := 表达式;   2、常用函数和过程:数学类函数、字符类函数、日期时间类函数、顺序类型函数  数学类函数:  绝对值函数:Abs...
  • 赋值语句“=”是用来改变变量的值和改变表域的最基本的方法。 Lua可以同时对多个变量来赋值, x, y = y, x --x,y做交换 当变量和值的个数不等时, a.变量个数>值的个数 按变量个数补足nil b.变量个数 ...
  • 在前面实验的基础上,通过设计、编制、调试一个典型的赋值语句的语法分析程序,实现对词法分析程序所提供的单词序列进行语法检查,进一步掌握常用的语法分析方法。 要求: 设计出给定源语言中包含有算术表达式、...
  • 文章目录1.练习代码2.关键点分析2.1计算过程2.2运行结果 1.练习代码 #include "stdafx.h" #include &lt;iostream&gt; using namespace std; int func(int x); int _tmain(int argc, _TCHAR... en...
  • 文章目录1.练习代码2.关键点分析2.1计算过程2.2运行结果 1.练习代码 #include "stdafx.h" #include &lt;iostream&gt; using namespace std; int _tmain(int argc, _TCHAR* argv[]) ... *(ptr...
  • 通过设计、编制、调试一个典型的赋值语句的语法分析程序,实现对词法分析程序所提供的单词序列进行语法检查,进一步掌握常用的语法分析方法。
  • 文章目录1.练习代码2.关键点分析2.1计算过程2.2运行结果 1.练习代码 #include "stdafx.h" #include &lt;iostream&gt; using namespace std; int _tmain(int argc, _TCHAR* argv[]) ... ...
  • 基本的算术运算符 常用算数运算 常用算数运算符包括+(正好运算符)、-(负号运算符)、+(加法运算符)、-(减法运算符)、*(乘法运算符)、/(乘法运算符)、%(求余运算符)。注意:l 键盘无÷号,所以以/代替,...
  • 一些常用赋值语句: 序列赋值:元组可以和任意序列相互进行赋值运算,但注意被赋值的变量名数和序列长度要一致; 扩展的序列解包:不带星号的变量赋值右面系列对应的一个元素,带星号的赋值多个剩余元素组合的...
  • 在python中导入模块绝对是我们最最常用的功能,基本每个py文件中都会有import或者是from import语句。可是,这两种导入方法有什么不同,又该怎么用呢?今天就好好来分析一下。定义:模块导入允许我们将一个个独立的...
  • 赋值语句变量的赋值就可以理解为往小罐子里存放数据,然后再给小罐子上贴上一个标签,这个标签就是变量名 。具体格式:基本赋值语法:var_name = value实例:a = 10 #将数字10赋值给ab = 12.1 ...
  • (1)在语句块中,上面语句赋值的变量不能立即为下面的语句所用; (2)块结束后才能完成这次赋值操作,赋值的职位上次赋值得到的; (3)在编写可综合的时序逻辑模块时,这是最常用的复制方法。   B)阻塞...
  • js常用特殊语句

    2020-09-29 17:29:58
    语句是JavaScript的基本执行单位,每条语句都是以分号结束,语句除了我们前面讲的赋值语句、算术运算等语句以外,还有一些常用的特殊语句。 语句块: 所谓的语句块就是是用花括号包含的多条语句,语句块是一个执行...
  • 常用SQL语句

    2021-01-31 19:38:21
    常用SQL语句 1、 查询语句:查询所有字段 SELECT * FROM student_s -- 查询某个字段 SELECT name,age from student_s WHERE id=1001 2、 -- 新增一条数据 :insert 表名(表字段1,表字段2) values (值1,值2) --...
  • -- 常用列表常量和操作L = [[1, 2], 'string', {}] # 嵌套列表L = list('spam') # 列表初始化L = list(range(0, 4)) # 列表初始化list(map(ord, 'spa...
  • vb常用语句

    2021-02-27 15:41:04
    4、赋值语句 变量名 = 表达式 5、注释语句 ‘注释文字 6、分支语句 ①单分支语句 If 条件 Then 语句组 EndIf ②双分支语句 If 条件 Then 语句组A Else 语句组B EndIf 7、循环语句 ①Do循环语句 Do While
  • 今天是第三篇VBA实战入门教程,我们将给大家带来VBA中最常见语句之一,循环语句。典型的循环语句有4种,分别是Do While…Loop循环、Do…Loop Until循环、For…Next循环、For Each x In y … Next循环。查看循环逻辑...
  • verilog基础(常用语句

    千次阅读 2013-12-18 09:42:04
    1、赋值语句:  (1)非阻塞赋值方式, 如 b  特点:块结束后才完成操作,b的值不是立刻改变的。  (2)阻塞赋值方式, 如 b = a ;   特点:赋值语句执行完后,块才结束,b的值是立刻改变的。 2、块语
  • 125个常用javascript语句. 2011年07月24日  107个常用javascript语句  -7.焦点 .focus();  -6.捉拿对象通用措施 function $(obj) {return document.getElementByIdx_x(obj);}    -5.字符串赋值数组...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 980
精华内容 392
关键字:

常用赋值语句