verilog中对同一个变量有判断条件的赋值

且看一段代码:

always @(posedge clk) begin   if(count<=5*T10MS)   count<=count+1‘b1;   else    begin     count<=0;     sel<={sel[4:0],sel[5]};    flag<=flag+1‘b1;     if(flag>=4‘b1010)      flag<=0;    end end always @(flag)

begin case(flag) 4‘b0000: dig=S0; 4‘b0001: dig=S1; 4‘b0010: dig=S2; 4‘b0011: dig=S3; 4‘b0100: dig=S4; 4‘b0101: dig=S5; 4‘b0110: dig=S6; 4‘b0111: dig=S7; 4‘b1000: dig=S8; 4‘b1001: dig=S9; default: dig=8‘hff; endcase end

以上一个例子是,控制一个数码管从0到9进行显示,但是却出现了default所示的状态,也就相当于出现了一个空档。这个是不允许出现的。这个不允许出现的flag状态就是flag=10。当flag=10,不能正常译码就执行了default语句,那么数码管就熄灭了。那么这个状态时如何出现的呢?

当flag=9时,一个clk的上升沿到来时,

flag<=flag+1‘b1;     if(flag>=4‘b1010)      flag<=0; 由于flag<10,那么if条件语句部分并未执行,所以当上升沿结束以后,flag为10,只有当下一个clk上升沿到来的时候,flag才会清零。这样就导致了数码管会熄灭。

当代码变为如下的时(其他部分不变)

flag=flag+1‘b1;     if(flag>=4‘b1010)      flag=0; 结果是不会出现数码管熄灭的。因为在这里,是进行阻塞赋值的,当flag为9时,一个clk的上升沿到来,那么就出现

flag=flag+1‘b1; flag=10;紧接着执行

if(flag>=4‘b1010)      flag=0; 这样在这个always模块执行完毕的时候,flag为0而不是10。

出现这样这样的结果的主要原因是对于阻塞赋值和非阻塞赋值语句不清楚的,

不要因为这里有一个判断语句就以为上下两个语句是非阻塞的。但是如果换成,非阻塞语句就不会出现这样情况,而且也容易理解,可读性强,所以还是建议用非阻塞语句,书写这样的代码。

时间: 2024-11-10 07:51:48

verilog中对同一个变量有判断条件的赋值的相关文章

FreeMarker中if标签内的判断条件

reeMarker中的<#if>标签除了里面直接判断 boolean 类型的变量外,也可以进行表达式判断,有几个细节记录一下 1. 判断对象是否存在(null) 经常会用到,如果对象 != null 则xxxx,在freemarker中表达比较奇怪,例如判断 target 是否为null,如果不为 nll 则做xxx动作 <#if target??> xxxx </#if> (目标变量后面连续两个??) 2. 字符串或数字比较 java里标准字符串比较需要 .equal

关于verilog中语句可不可综合

1)所有综合工具都支持的结构:always,assign,begin,end,case,wire,tri,aupply0,supply1,reg,integer,default,for,function,and,nand,or,nor,xor,xnor,buf,not,bufif0,bufif1,notif0,notif1,if,inout,input,instantitation,module,negedge,posedge,operators,output,parameter.     (2

Verilog中的assign

(一) assign 用于描述组合逻辑,用阻塞赋值,但assign语句是并行执行,(说明:阻塞赋值串行操作是局限于在behavior structual 描述内部,也就是指在initial and always block内部.) 所有的assign和always是并行执行的. 对assign之后不能加块,实现组合逻辑只能用逐句的使用assign 组合逻辑,如果不考虑门的延时的话当然可以理解为瞬时执行的,因此没有并行和顺序之分,并行和顺序是针对时序逻辑来说的.值得注意的是所有的时序块都是并行执行

shell中的变量及shell条件判断

Shell 基础之变量和条件判断 一.shell概述 1.shell概述: shell是一个命令行的解释器,为用户提供了一个向Linux内核发送请求以便运行程序的界面系统及程序,用户可以用shell来启动.挂起.停止甚至编写一些程序,shell还是一个功能强大的编程语言,shell是解释性的脚本语言,在shell中可以直接调用Linux命令. 2.shell脚本的用途 (1)自动化常用的命令 (2)执行系统管理和故障排除 (3)执行简单的应用程序 (4)处理文本或文件 3.shell的分类 (1

ThinkPHP3.2中if判断条件是两个变量

<select name="typeId"> <foreach name="typeInfo" item="v"> <if condition="$v[typeId] eq $article[typeId]"> <option value="{$v.typeId}" selected>{$v.name}</option> <else/>

Shell中条件判断语法与判断条件

一,简介 Shell各种判断结构和运算符的用法是shell编程的基础,了解shell的判断.运算符和一些退出状态 对后面的学习有很重要的影响.shell有一个内部命令test经常用于对判断语句 进行测试一种或几种状态的条件是否成立 二. 判断条件 (1)Linux的shell中的测试命令,用于测试某种条件或某几种条件是否真实存在 测试命令是判断语句和循环语句中条件测试的工具,对判断和运算符的比较测试有很大的帮助. (2)测试条件为真,返回一个0值:      为假,返回一个非0整数值 测试命令有

vba中if判断条件里等号无法完成赋值操作

今天遇到一个问题,结果发现是因为vba中if的判断条件中等号("=")无法完成赋值操作造成的. 举个栗子: 故应该在if之前就完成必要的赋值操作: 所以,if判断条件里的等号("=")只能用于判断相等,不能用于赋值.

SWF运行时判断两个DisplayObject是否同个类型,属于flash professional库中的同一个元件

一般我们判断两个实例对象是否同样的类型,可以用typeof得到对象类型,然后用==号比较. typeof适用于原生类型. 而对于自定义类型,虽然typeof得到的都是Object,但还有更强的招数:getQualifiedClassName 利用这个原生函数可以获取到两个实例的真实类型. 然而,对于Flash professional制作出来的swf,运行时要知道其中两个MovieClip是否来自库里边的同一个元件,上述方法都无能为力了. 本文就是探讨这个问题. 1.首先,想到的是,如果两个实例

Verilog中变量位宽注意

Verilog中,变量定义方式可以为:reg[位宽-1:0] 数据名:reg[位宽:1] 数据名.其他变量也类似. 以reg变量cnt为例,当cnt位宽为4时,可定义为reg[3:0] cnt,或者定义为reg[4:1] cnt 当cnt赋值为3时,reg[3:0] cnt:cnt=3 等效为 cnt[3]=0,cnt[2]=0,cnt[1]=1,cnt[0]=1; reg[4:1] cnt:cnt=3 等效为 cnt[4]=0,cnt[3]=0,cnt[2]=1,cnt[1]=1; 当cnt被