Verilog里的算数运算符如下所示:
Verilog被叫做硬件描述语言绝不是空穴来风,在编写代码时一定要能映射到实际电路上,一个个最基础的与门、或门和非门等等。
乘法可以综合,但一般会消耗较多资源,可用移位来进行简化
移位:
<< 逻辑左移,一个操作数往左移位,产生的空位用0补上>>逻辑右移,一个操作数往右移位,产生的空位用0补上
<< < 算数左移,一个操作数往左移位,产生的空位用0补上>>>算数右移,一个操作数往右移位,如果是无符号数,产生的空位用0补上,要是有符号数用其符号位补上
对二进制来说,
一个数移已相当于*2
例如
8’b0000_0001<<8’d1,变成了8’b0000_0010,这就由十进制的1变成了2,
8’b0000_0001<<8’d2,变成了8’b0000_0100,这就由十进制的1变成了4,
那如何乘一个不是2的数呢?这就回到了我们的小学数学,乘法分配律
例如
7z = (8-1)z = 8z - z
即z<<3 - z,z左移三位再减去z,这就将复杂的乘法变成了移位和加减的组合
其实乘法本身就是移位和加法的组合,但直接使用*会消耗更多的资源。
除法除2的幂次方,
即z/2 z/4 z/8等等
对应z>>1 z>>2 z>>3