现在的位置: 首页 > 综合 > 正文

wed前端技术veirlog HDL的基本语法

2019年11月12日 综合 ⁄ 共 1600字 ⁄ 字号 评论关闭

  学习的参考资料是夏宇闻的《veirlog经典教程》第三版,可能刚看这本书有点迷糊,但我觉得有从语言基础的同学学起来还是能看懂的。这里我列举了自己学习觉得应该注意的地方。

  veirlog HDL的基本语法 1

  1.变量:变量即在程序运行过程中其值可以改变的量,在Verilog HDL中变量的数据类型有很多种

  wire型

  wire型数据常用来表示用于以assign关键字指定的组合逻辑信号。Verilog程序模块中输入输出信号类型缺省时自动定义为wire型。wire型信号可以用作任何方程式的输入,也可以用作“assign”语句或实例元件的输出。wire型信号的格式同reg型信号的很类似。

  wire是wire型数据的确认符,[n-1:0]和[n:1]代表该数据的位宽,即该数据有几位。最后跟着的是数据的名字。如果一次定义多个数据,数据名之间用逗号隔开。声明语句的最后要用分号表示语句结束。看下面的几个例子。

  wire a; //定义了一个一位的wire型数据

  wire [7:0] b; //定义了一个八位的wire型数据

  wire [4:1] c, d; //定义了二个四位的wire型数据

  reg型

  寄存器数据类型的关键字是reg.通过赋值语句可以改变寄存器储存的值,其作用与改变触发器储存的值相当。Verilog HDL语言提供了功能强大的结构语句使设计者能有效地控制是否执行这些赋值语句。

  reg型数据常用来表示用于“always”模块内的指定信号,常代表触发器。通常,在设计中要由“always”块通过使用行为描述语句来表达逻辑关系。在“always”块内被赋值的每一个信号都必须定义成reg型。

  这里一定要区分数据的类型,就我的理解,wire型是代表电路的线,而reg型则是代表寄存器的值,reg型只表示被定义的信号将用在“always”块内,并不是说reg型一定是寄存器或触发器的输出。

  2.运算符及表达式,和C语言一样,具有同样的,单目,双目,三目运算符,包括基本的算术运算符,位运算符,逻辑运算符,关系运算符,等式运算符,移位运算符,位拼接运算符,缩减运算符,其优先级适合C语言一样的,简单的说一下后面两种运算符。

  拼接运算符

  在Verilog HDL语言有一个特殊的运算符:位拼接运算符{}。用这个运算符可以把两个或多个信号的某些位拼接起来进行运算操作。其使用方法如下: {信号1的某几位,信号2的某几位,…,…,信号n的某几位}

  如:{a,b[3:0],w,3’b101}也可写成为{a,b[3],b[2],b[1],b[0],w,1’b1,1’b0,1’b1}

  在位拼接表达式中不允许存在没有指明位数的信号。这是因为在计算拼接信号的位宽的大小时必需知道其中每个信号的位宽。

  位拼接还可以用重复法来简化表达式。见下例:

  {4{w}} //这等同于{w,w,w,w}

  位拼接还可以用嵌套的方式来表达。见下例:

  {b,{3{a,b}}} //这等同于{b,a,b,a,b,a,b}

  用于表示重复的表达式如上例中的4和3,必须是常数表达式。

  缩减运算符

  缩减运算符是单目运算符,也有与或非运算。其与或非运算规则类似于位运算符的与或非运算规则,但其运算过程不同。位运算是对操作数的相应位进行与或非运算,操作数是几位数则运算结果也是几位数。而缩减运算则不同,缩减运算是对单个操作数进行或与非递推运算,最后的运算结果是一位

  的二进制数。缩减运算的具体运算过程是这样的:第一步先将操作数的第一位与第二位进行或与非运算,第二步将运算结果与第三位进行或与非运算,依次类推,直至最后一位。

  3.关键字,和C语言一样都有自己的关键字,我想常用的关键字是应该都的掌握的。注意在定

  义变量的时候不要和关键字冲突。

  4.赋值语句

  非阻塞(Non_Blocking)赋值方式( 如 b <= a; )   块结束后才完成赋值操作。   b的值并不是立刻就改变的。   这是一种比较常用的赋值方法。(特别在编写可综合模块时)   阻塞(Blocking)赋值方式( 如 b = a; )   赋值语句执行完后,块才结束。   b的值在赋值语句执行完后立刻就改变的。   可能会产生意想不到的结果。   注意:非阻塞赋值方式和阻塞赋值方式的区别常给设计人员带来问题。问题主要给"always"块内的reg型信号的赋值方式不易把握。非阻塞赋值不是马上执行的,也就是说“always”块内的下一条语句执行后,原来的值并没有变,“always”块结束后,才进行赋值,而另一种阻塞赋值是马上执行的,虽然直观但是可能引起麻烦。

抱歉!评论已关闭.