1.4.1 +、-、*、/、%电路
(1)加法电路:每1位大约消耗1个LE,示例代码如下
1 module arithmetic
2 (
3 input [7:0] iA,
4 input [7:0] iB,
5 output [8:0] oAdd
6 );
7
8 assign oAdd=iA+iB;
9
10 endmodule
RTL级视图如下
testbench如下
1 `timescale 1ns/1ns
2 module arithmetic_tb;
3
4 reg [7:0] ia=8'b1011_0111;
5 reg [7:0] ib=8'b0100_1000;
6 wire [8:0] oadd;
7
8 initial #100 $stop;
9
10 arithmetic arithmetic_inst
11 (
12 .iA(ia),
13 .iB(ib),
14 .oAdd(oadd)
15 );
16
17 endmodule
仿真波形如下
(2)乘法电路
代码将加法电路代码中语句oAdd=iA+iB;改为 oMul=iA*iB;即可。oMul位宽为[15:0]
代码综合后乘法单元直接调用的CycloneII嵌入式乘法器lpm_mult
RTL级视图
仿真波形图
(3)除法电路
代码将加法电路代码中语句oAdd=iA+iB;改为 oDiv=iA/iB;即可。oDiv位宽为[7:0]
代码综合后除法单元直接调用的lpm_divide实现的
取余运算也很消耗资源,每位运算大约消耗10LE.
RTL级视图如下
RTL级波形仿真
(4)取余运算
代码将加法电路代码中语句oAdd=iA+iB;改为 oMod=iA%iB;即可。oMod位宽为[7:0]
代码综合后取余运算直接调用的lpm_divide实现的
除法运算很消耗资源,每位运算大约消耗10LE.
RTL级视图如下
RTL级波形仿真
1.4.2 数据比较器
代码如下,风格非常类似C语言
1 module arithmetic
2 (
3 input [3:0] iA,
4 input [3:0] iB,
5 output oEQ,
6 output oGT,
7 output oLT,
8 output oGT_EQ,
9 output oLT_EQ,
10 output oNEQ
11 );
12
13 assign oEQ=(iA==iB),
14 oNEQ=(iA!=iB),
15 oGT=(iA>iB),
16 oLT=(iA<iB),
17 oGT_EQ=(iA>=iB),
18 oLT_EQ=(iA<=iB);
19 endmodule
RTL级视图如下
RTL级仿真波形如下
1.4.3 移位电路
1.4.3.1 逻辑移位电路
代码如下
1 module arithmetic
2 (
3 input [7:0] iA,
4 input [3:0] iBit,
5 output [7:0] osll,
6 output [7:0] osrl
7 );
8
9 assign osll=iA<<iBit,
10 osrl=iA>>iBit;
11 endmodule
RTL级视图如下
RTL级仿真波形
1.4.3.2 算术移位
算术移位运算符为<<<,>>>;
有符号数算术移位和逻辑移位,两者左移时一样,右移时逻辑移位最高位填充的是0,算术移位最高位填充的是符号位。