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
- 操作数位选择和部分选择以及都是针对向量而言
- 位选择:net_name/reg_name [num],num是第几位
- 部分选择name [num1:num2] 表示从num1的位数到num2位数
- 对于数组补充: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
- 存储器变量:是一种寄存器数组,
reg mem[0:255];//256bit的1bit的存储器
-
参数:参数用来表示常量,用关键字 parameter 声明,只能赋值一次
- 字符串保存在reg类型的变量中,每个字符占用8bit(一个字节),
二、操作符
verilog有9 种操作符,分别是算术、关系、等价、逻辑、按位、归约、移位、拼接、条件操作符。
同类型操作符之间,除条件操作符是从右向左关联外,其他的操作符是从左向右关联,另外圆括号可以改变运算顺序。
单目操作符是对一个操作数进行操作,双目操作符是对两个操作数进行操作。

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

浙公网安备 33010602011771号