Spartan-6学习日记3——verilog表达式

verilog表达式

表达式由操作数和操作符构成

一、操作数

操作数可以是任意的数据类型,只是某些特定的语法结构要求使用特定类型的操作数。例如寄存器的赋值只能在initial和always语句中。操作数可以为常数,整数,实数,线网,寄存器,时间,位选,域选,存储器及函数调用等。

module test;

//实数
real a, b, c;
a=b+c;

//寄存器
reg  [3:0]       cra1, cra2 ;
always @(posedge clk) begin
        cra2 = cra1 & cra2 ;
end
         
 
//非法操作数
reg [3:0]         res;
wire [3:0]        temp;
always@ (*)begin
    res    = cra2 – cra1 ;
    //temp = cra2 – cra1 ; //不合法,always块里赋值对象不能是wire型
end

endmodule
  1.  操作数位选择和部分选择以及都是针对向量而言
  2. 位选择:net_name/reg_name [num],num是第几位
  3. 部分选择name [num1:num2] 表示从num1的位数到num2位数
  4. 对于数组补充:verilog中常用允许申请的数组有real time integer wire reg及其向量类型的数组,数组维数没有限制,数组元素可以为标量也可以为向量例如
    integer num[7:0];//8个整数组成的数组,每个元素是整型标量
    reg [3:0] count[3:0];//4个4bit的寄存器类型组成的数组
    wire [7:0] addr[3:0];//4个8bit wire类型组成的数组
    reg [31:0]       data_4d[11:0][3:0][3:0][255:0] ; //声明4维的32bit数据变量数组

    数组与向量区别:向量是单独的个体有自己的位宽,数组是多个多维的元素的集合,每个元素位宽,可以为1或n

  5. 存储器变量:是一种寄存器数组,
    reg mem[0:255];//256bit的1bit的存储器
  6. 参数:参数用来表示常量,用关键字 parameter 声明,只能赋值一次

  7. 字符串保存在reg类型的变量中,每个字符占用8bit(一个字节),

二、操作符

 verilog有9 种操作符,分别是算术、关系、等价、逻辑、按位、归约、移位、拼接、条件操作符。

同类型操作符之间,除条件操作符是从右向左关联外,其他的操作符是从左向右关联,另外圆括号可以改变运算顺序。

单目操作符是对一个操作数进行操作,双目操作符是对两个操作数进行操作。

  1.  算术运算符:乘(*)、除(/)、加(+)、减(-)、求幂(**)、取模(%)加减。如果操作数某一位为 X,则计算结果也会全部出现 X。对于结果的位宽因该是所有涉及的操作数位宽最大者,注意乘法运算一定要定义结果是参与运算的位宽2倍,否则高位被截断会出错。
  2. 关系操作符:大于(>),小于(<),大于等于(>=),小于等于(<=);结果真1、假0;如果有操作数某一位是x,那么结果就是x
  3. 逻辑操作符:主要有 3 个&&(逻辑与), ||(逻辑或),!(逻辑非)。对操作数做整体运算(非0即1),计算结果是一个 1bit 的值,0 表示假,1 表示真,x 表示不确定。
  4. 按位操作符包括取反(~),与(&),或(|),异或(^),同或(~^);对两个操作数按位操作,如果两个数位数不相等,那么一般情况是左边补0.
  5. 归约操作符:包括归约与(&),归约与非(~&),归约或(|),归约或非(~|),归约异或(^),归约同或(~^);运算规则:对操作数逐位操作,用来判断是否全为1或则全为0
    A = 4'b1010 ;
    &A ;      //结果为 1 & 0 & 1 & 0 = 1'b0,可用来判断变量A是否全1
    ~|A ;     //结果为 ~(1 | 0 | 1 | 0) = 1'b0, 可用来判断变量A是否为全0
    ^A ;      //结果为 1 ^ 0 ^ 1 ^ 0 = 1'b0
  6. 移位操作符:包括左移(<<),右移(>>),算术左移(<<<),算术右移(>>>);算术左移和逻辑左移时,右边低位会补 0。逻辑右移时,左边高位会补 0;而算术右移时,左边高位会补充符号位。
  7. 拼接操作符用大括号 {,} 来表示,用于将多个操作数(向量)拼接成新的操作数(向量),信号间用逗号隔开。拼接符操作数必须指定位宽,常数的话也需要指定位宽例如:Y1 = {B, A[3:2], A[0], 4'h3 }; 

  8. 条件表达式有三个操作符:例如A?B : C,A为真就执行B,为假就执行C
posted @ 2023-07-27 10:21  showi111  阅读(163)  评论(0)    收藏  举报