• 第六章 数据流建模


    连续赋值

    • 连续赋值语句是verilog数据流建模的基本语句,用于对线网进行赋值。

    • 这玩意等价门级描述,却是从更高的抽象角度描述电路。

    • 连续赋值语句必须以关键词assign开始。

    • 连续赋值语句有以下几种特点:

      • 左边的值必须是一个标量 / 向量线网 / 标量与向量线网的拼接,这三种里面选一个,它不能是向量或向量寄存器。
      • 总是激活状态,只要任意一个操作数发生变化,表达式立即重新计算,重新赋值。
      • 操作数可以是标量 / 向量的线网或寄存器 / 函数调用。
      • 赋值延迟可以用于控制对线网赋予新值的时间,类似门延迟。
    • 举例

      //out是线网,in1, in2也是线网
      assign out = in1 & in2;	
      
      // addr是16位向量线网
      // addr1_bits, addr2_bits都是16位向量寄存器
      assgin addr[15:0] = addr1_bits[15:0] ^ addr2_bits[15:0];
      
      // 拼接
      assign {c_out, sum[3:0]} = a[3:0] + b[3:0] + c_in;
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9

    隐式连续赋值

    • 看到这个隐字,就晓得了,肯定缺了什么。

    • 在线网声明的同时,对其进行赋值。线网只能被声明一次,因此隐式连续赋值只能有一次。

      // 普通赋值
      wire out;
      assgin out = in1 & in2;
      
      // 可等价于
      wire out = in1 & in2;
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6

    隐式线网声明

    • 同理,既然可以隐掉assgin,那可以隐掉wire吗?

    • 当然也是可以的

      // out并未对其做线网声明,仿真器会推断出out是隐式声明的线网
      wire in1,in2;
      assgin out = in1 & in2;
      
      • 1
      • 2
      • 3

    延迟

    • 连续赋值语句中的延迟,用于控制任一操作数发生变化到语句左值被赋予新值之间的时间间隔(说白了就是,左边的值什么时候发生变化,这个时间是可以人为定义的)。
    • 指定赋值延迟的方法:
      • 普通赋值延迟
      • 隐式连续赋值延迟
      • 线网声明延迟

    普通赋值的延迟

    • 在连续赋值语句中说明延迟的值,延迟值位于assgin后面。
      assgin #10 out = in1 & in2;
      
      • 1
    • 惯性延迟:在上面的例子中,in1 & in2的新值,赋值给左边之前,有10个时间单位的延迟,如果在这10个时间单位内,in1 & in2的值又发生了变化,赋值表达式的新值回取in1 & in2的当前值。这种性质就是惯性延迟。
      在这里插入图片描述
    • 如图所示,小于延迟时间的信号被屏蔽掉了,因为刚打算过10个时间单位赋值1给out,结果in1自己变为0了,因此out为0。可以用来屏蔽时间较短的脉冲信号。

    隐式连续赋值的延迟

    • 同理,概念是一样的,只是赋值方式变了而已。
      // 隐式连续赋值
      wire #10 out = in1 & in2;
      
      // 等效于
      wire out;
      assign #10 out = in1 & in2;
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6

    线网声明的延迟

    • 同理,概念是一样的
      // 线网延迟
      wire #10 out;
      assgin out = in1 & in2;
      
      // 等效于
      wire out;
      assign #10 out = in1 & in2;
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7

    表达式

    • 数据流建模使用表达式来描述设计。表达式、操作符和操作数是数据流建模的基础。

    • 表达式:由操作符和操作数构成,目的是根据操作符的意义计算出一个结果。

      a ^ b 
      addr[20:17] + addr[20:17]
      in1 | in2 
      
      • 1
      • 2
      • 3
    • 操作数:操作数可以是定义的任何数据类型,

    • 操作符:对操作数进行运算产生一个结果。

    操作符类型

    • 有以下几种类型的操作符:算术、逻辑、关系、等价、按位、缩减、移位、拼接与条件操作符。
      在这里插入图片描述在这里插入图片描述
    • 挑几个不熟悉的记录下

    等价操作符

    • 相关说明如图
      在这里插入图片描述

    缩减操作符

    • 只有一个操作符,对向量操作数逐位进行操作,产生一个一位的结果。
      在这里插入图片描述

    条件操作符

    • 带有三个操作数,用法:

      condition_expr ? true_expr : false_expr;
      
      • 1
    • 即:计算条件表达式,如果为真,则计算true_expr;为假,计算false_expr;为不确定x,则两个表达式都计算,然后两个结果逐位比较。如果相等,则结果中该位的值为操作数中该位的值;如果不想等,则结果中该位的值为x。

    • 条件表达式类似多路选择器
      在这里插入图片描述

    • 注意:if-else可以替换条件表达式,但是只能在块语句中,不能在连续赋值语句中替换。

    优先级

    • 建议用小括号将各个表达式分开。
      在这里插入图片描述

    举例

    四选一多路选择器

    • 如下图,这是前面学习的门级建模描述在这里插入图片描述
    • 使用逻辑方程描述
      在这里插入图片描述
    • 使用条件操作符
      在这里插入图片描述
    • 可见,使用数据流的建模方式是非常简便的。

    四位全加器

    • 同理,用数据流操作语句来描述一个四位全加器
      在这里插入图片描述

    脉动进位计数器

    总结

  • 相关阅读:
    7.JSP
    Apollo简易地图制作
    angular:简单实现图片如果超过屏幕高度则滚动置顶;没超过则水平垂直居中
    淘宝/天猫添加收货地址 API
    嵌入式图像处理机器视觉库YMCV使用
    配合AI刷leetcode 实现1170
    python舔狗学习日记第三期【帮女神自动化生成日报】
    STM32学习笔记一:开发环境
    Nacos环境隔离
    PHP 数组学习资料
  • 原文地址:https://blog.csdn.net/Cherish1ove/article/details/125561156