VerilogHDL语言连续赋值与过程赋值方式如何区分

EDA/IC设计

1048人已加入

描述

  如何区分VerilogHDL语言连续赋值与过程赋值方式

  VerilogHDL(HDL:HardwareDescriptionLanguage)语言对于学习硬件的人员来说并不陌生,可以说是或多或少都学习过,且进行了代码编写,小编今天介绍一下关于VerilogHDL语言赋值方式的描述。

  VerilogHDL是一种硬件描述语言,是以文本形式对数字系统硬件的结构和行为来进行描述,用这种语言可以表述逻辑电路图与逻辑表达式,并且还可以表示数字逻辑系统所完成的逻辑功能。大家都知道硬件是计算机系统中各种元件组成的物理装置,硬件的功能是输入并存储程序和数据,并做到就是执行程序把数据加工成可以利用的形式,在外观上,这些CPU、内存、主板、硬盘驱动器、光盘驱动器及各种扩展卡等等,这些不也是服务器的组成器件,对于VerilogHDL语言的学习,可以促进硬件的发展,从而可以促进香港服务器的发展。

  VerilogHDL语言在1990年初,是面向公有领域开放,在1992年,纳入电气电子工程师学会标准;目前VerilogHDL与VHDL是世界上最流行的两种硬件描述语言,同时也成了IEEE标准。

  VerilogHDL语言是以模块为基础的设计,因为描述复杂的硬件电路,设计人员总是将复杂的功能划分为简单的功能,这种模块化的思想从而简化复杂的工作,模块是提供每个简单功能的基本结构。并且设计人员可以采取“自顶向下”的思路,将复杂的功能模块划分为低层次的模块,这样是可以做到提高效率,降低成本。

  在模块当中,则包含关键字module与endmodule之内的,并且模块实现也是相当于函数一样,提供输入与输出端口,并且这模块之间可以相互调用,另外这些模块当中包含组合逻辑部分、过程时序部分等等。

  现在描述在VerilogHDL语言编写过程当中,对赋值方式的理解。

  VerilogHDL语言当中,包含连续赋值、过程赋值以及过程性连续赋值这三种赋值方式。连续赋值:有以下几个特点:(1)含有关键字“assign”来标识;(2)在赋值时,数据类型必须是wire线网型数据,是因为用于描述组合逻辑建模与线网数据;(3)不能出现过程块语法关键字“initial/always”,如果含有,在仿真的时候也会报错;(4)连续赋值语句执行时,赋值表达式当中信号变化都将立即被反映到赋值线网型数据的取值上。而过程赋值:(1)被赋值的数据类型必须是reg寄存器类型数据;(2)过程性连续主要是用来描述时序逻辑电路进行行为描述;(3)只有在过程赋值语句执行时,才能执行赋值操作,语句执行完后被赋值变量的取值不再受到赋值表达式的影响。而过程性连续赋值,只有assign-deassign与force-release这两种过程性连续赋值。在实现过程中,能够用连续赋值方式来实现的地方,尽量使用连续赋值;因为连续赋值方式和过程赋值方式相比:具有速度快、而且能节省资源(过程赋值实现是需要寄存器来辅助)。

  现在利用VerilogHDL代码来具体描述这种连续赋值与过程赋值区别;这段代码是描述LED轻量级密码算法实现有限域乘法模块。

  连续赋值实现代码:

  `timescale1ns/1ns

  moduleFieldMutil(c,a,b);

  input[0:3]a,b;

  output[0:3]c;

  wire[0:3]s2,s1,s0;//定义为线网型变量

  assigns2=(a[0]==1)?{a[1:2],!a[3],1‘b1}:{a[1:3],1’b0};//使用assign进行赋值

  assigns1=(s2[0]==1)?{s2[1:2],!s2[3],1‘b1}:{s2[1:3],1’b0};

  assigns0=(s1[0]==1)?{s1[1:2],!s1[3],1‘b1}:{s1[1:3],1’b0};

  assignc=((b[3]==1)?a:0)^((b[2]==1)?s2:0)^((b[1]==1)?s1:0)^((b[0]==1)?s0:0);

  endmodule

  过程赋值实现代码:

  `timescale1ns/1ns

  moduleFieldMutil(c,a,b,clk);

  inputclk;

  input[3:0]a,b;

  output[3:0]c;

  reg[3:0]c;//定义为寄存器类型变量

  regk;

  always@(posedgeclk)begin//使用always关键字,来进行赋值,并且clk时钟信号

  c=0;

  k=c[3];

  c=c《《1;

  c={c[3:2],c[1]^k,c[0]^k};//modf(z)

  if(b[3]==1)c=c^a;//c=c*z+a;

  if(b[2]==1)c=c^a;

  if(b[1]==1)c=c^a;

  if(b[0]==1)c=c^a;

  end

  endmodule

  VerilogHDL语言连续赋值与过程赋值方式区分方法与理解运用已经给大家讲清楚了。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分