首页 > 其他分享 >在时序电路中使用阻塞赋值会怎样

在时序电路中使用阻塞赋值会怎样

时间:2023-07-14 14:55:20浏览次数:31  
标签:输出 逻辑 always 阻塞 串行 时序电路 赋值

电路设计

阻塞赋值的使用

如之前介绍所述,建议使用阻塞赋值来描述组合逻辑设计。但是,如果在编码时序逻辑行为时使用阻塞赋值,会发生什么?这是需要解决的最重要的问题之一,对后续讨论很重要。

如果阻塞赋值用于编码时序逻辑的行为,则可以观察到综合结果不是正确的功能设计意图。

接下来介绍使用阻塞赋值对时序电路设计进行编码的几个设计方案。

阻塞赋值和多个“Always”进程

如例6.1所述,在多个“Always” 进程中使用阻塞赋值。程序块“Always”在时钟的正边缘触发,综合器推断时序逻辑。如前所述,所有阻塞赋值都在活动队列中进行计算和更新。读者请参阅之前分享的分层事件队列一文。

如例6.1所述,这两个“Always” 进程并行执行,并以两位串行输入串行输出移位寄存器的形式生成输出。首先,always进程生成一个输出“b_in”从第一个“Always” 进程生成的输出被另一个“Always” 进程用作输入。因此,综合器将其推断为两位串行输入串行输出移位寄存器。

示例6.1的综合逻辑如图6.1所示,并具有输入“a_in”,“clk”和输出“y_out”

电路设计

例6.1在多个always块中阻塞赋值

电路设计

图6.1多个always块中阻塞赋值的综合逻辑

同一“always”进程中的阻塞赋值

如果阻塞赋值用于描述时序逻辑,并且在同一“always”程序块中使用多个分配,则预期需求可能与综合逻辑匹配,也可能与综合逻辑不匹配。原因是,在阻塞分配中,所有后续语句(下一个立即数)都被阻塞,除非直到当前语句被执行。这将导致硬件截断,并可能推断出不需要的综合输出。

考虑在示例6.2中描述的设计场景,其意图是创建三位串行输入和串行输出移位寄存器,但是在综合示例6.2之后,它推断为单个触发器。

可综合逻辑如图6.2所示,其输入为“a”、“clk”和输出为“y”。所需的功能是串行输入、串行输出移位寄存器,但上述示例由于使用阻塞赋值而推断出单个触发器。因此,建议在为时序功能编码或描述RTL时使用非阻塞赋值。

电路设计

例6.2在always”进程中的阻塞赋值

电路设计

图6.2同一always进程中阻塞赋值的综合逻辑

阻塞赋值示例

考虑在示例6.3中描述的设计场景,其意图是创建三位串行输入和串行输出移位寄存器,并且由于块“begin” 和 “end”中使用的阻塞赋值语句,它顺序生成三位串行输入串行输出移位寄存器。

综合逻辑如图6.3所示,其输入为“a”、“clk”和输出“y”。所需的功能是串行输入串行输出移位寄存器,它推断串行输入串行输出移位寄存器。因此,需要记住的重要一点是,程序“always”块中的阻塞赋值语句的顺序是综合中的决定性因素。

电路设计

例6.3同一always块中的阻塞赋值(排序)

电路设计

图6.3阻塞赋值重新排序后的可综合逻辑

非阻塞赋值

如之前介绍的“分层事件队列”一文所述,非阻塞赋值在活动事件队列中评估,并在NBA队列中更新。非阻塞赋值用于描述时序逻辑。这些指定在程序块“always”中使用,以获得所需的综合结果。所有非阻塞赋值在“always”块内并行执行。

如例6.4所述。非阻塞赋值用于多个“always”块。程序块“always”在时钟的正边沿触发,综合器推断时序逻辑。综合逻辑如图6.4所示。

电路设计

例6.4不同always块中的非阻塞赋值

电路设计

图6.4不同always块中的非阻塞赋值的综合逻辑

非阻塞赋值示例

如果使用非阻塞赋值来描述时序逻辑,并且在同一“always”程序块中使用多个赋值,则综合器始终推断出所需的预期逻辑。原因是,在非阻塞赋值中,“begin-end”块中写入的所有语句都是“并行”执行的,这就产生了时序逻辑。

考虑示例6.5中描述的设计场景,意图是创建三位串行输入和串行输出移位寄存器,使用非阻塞赋值。

综合逻辑如图6.5所示,其输入为“a”、“clk”和输出“y”。所需的功能是串行输入串行输出移位寄存器,它推断串行输入串行输出移位寄存器。

电路设计

例6.5同一always块中的非阻塞赋值

电路设计

图6.5同一always块中非阻塞赋值的综合逻辑

非阻塞赋值的排序

考虑在示例中描述的设计方案,其意图是创建三位串行输入和串行输出移位寄存器,并使用非阻塞赋值。

上一节中的实例,在本例6.6中重新排序。

综合逻辑如图6.5所示,其输入为“a”、“clk”和输出“y”。所需的功能是串行输入串行输出移位寄存器,它推断串行输入串行输出移位寄存器。所以,重要的一点是要记住,过程“always”块中非阻塞赋值语句的顺序不是推断逻辑的决定性因素。

电路设计

例6.6在同一always块中具有顺序更改的非阻塞赋值

总结

不总结了,例子很多建议自己测试。

审核编辑 :李倩

   

标签:输出,逻辑,always,阻塞,串行,时序电路,赋值
From: https://www.cnblogs.com/amxiang/p/17553707.html

相关文章

  • java的short类型怎么赋值
    在Java中,short类型是一种整数数据类型,占用16位(2个字节)的内存空间。short类型的取值范围为-32768到32767。要给short类型变量赋值,可以通过以下几种方式:直接赋值shortnum=10;在这个例子中,变量num被赋值为10,这是一种直接赋值的方式。由于10是一个常量,它被认为是int类型的,但......
  • Python-变量赋值.py
     1#!/usr/bin/python 2#coding=UTF-8 3 4 5''' 6变量赋值 7 8Python中的变量赋值不需要类型声明。 9 10每个变量在内存中创建,都包括变量的标识,名称和数据这些信息。 11 12每个变量在使用前都必须赋值,变量赋值以后该变量才会被创建。 13 14......
  • 【ChernoC++笔记】移动赋值运算符
    【90】【ChernoC++】【中字】stdmove与移动赋值操作符▶️移动构造与std::move接上节的String类,我们可以通过string来构造新的对象dest://拷贝构造Stringstring="Hello";Stringdest=string;为了使用移动构造函数,string需要cast为临时变量://移动构造Stringdest=(s......
  • 线程阻塞案例分析
    线程阻塞案例分析一.Jstack打印快照1.jmeter运行压测脚本2.用jstack打印快照,下载到本地jstack112759>log1.txtjstack112759>log2.txtjstack112759>log3.txt3.在本地搜索是否有blocked关键字二.分析代码1.下载源码文件cn.testfan.perf.beihe.pinter.http.Cas......
  • C# 给PictureBox赋值图像时,报“参数无效”异常的解决方法!
    原因:Winform的窗体中显示9个Picturebox控件,由于更新速度较快偶尔会"参数无效"的异常。异常图像如下:通过测试知:1,注释PictureBox.Image.Dispose(),不会报异常;2,注释PictureBox.Image=null,还是会报异常!选择释放的原因:由于刷新图像较快内存占用较大,所以选择主动用Dispose(),=nu......
  • 给变量赋值时右侧是运算符||变量值是什么?
    逻辑运算符||(或)按照左侧优先级先判断左侧的值是否为true,如果左侧的值为真则返回左侧的值;如果左侧的值为假,则返回右侧的值。如果id的值为假值("undefined"、"null"、""、0、false)中的任何一个,则query取cache变量的值0letid='b54237ef30f64018a05441b33e1373c1';letcache=......
  • SQ工具|3|界址点线生成|ZDZHDM赋值
    以 不动产登记数据库TD/T1066-2021数据库规范中的宗地及界址点线为依据界面介绍: 此工具主要实现了界址线属性的计算,以ZDZHDM(记录相邻界址点、界址线的宗地代码)为主,所需数据包括对应的宗地数据界址点自动赋值包括:界址线自动赋值包括:如果缺少界址点、界址线数据,点击......
  • js 控制select 和 radio 赋值和并传值
    js控制select和radio并赋值和传值下面是select用法时:           <selectid="selectId"name="leibname"οnchange="ckc(this.options[this.options.selectedIndex].value);"><optionid="lei1"style="width:150px......
  • Java怎么给下拉框赋值 这个问题怎么解决?
    项目方案:基于Java的下拉框赋值方案1.项目背景和需求分析在开发基于Java的应用程序时,我们经常需要使用下拉框(ComboBox)来展示选项列表,并将选中的值保存到后台。本项目方案旨在提供一种简单而有效的方法来给下拉框赋值,并且能够动态更新选项列表。2.项目目标和功能实现下拉框数......
  • 实现组件赋值后重新渲染
    通过vuekey实现,原理官方文档。所以当key值变更时,会自动的重新渲染。<template><third-comp:key="menuKey"/></template><script>exportdefault{data(){return{menuKey:1}},watch:{menuTree(){++this.menuKey}}}</sc......