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