1.无符号数加法器
输入输出都是无符号的整数,输入为8bit 宽,则其最大数值为255,所以两个输入口相加的最大值为255x2=510,所以输出口宽9bit即可。
rtl图
- 代码片
module top_unsigned (
IN1 ,
IN2 ,
OUT1 ) ;
input [ 7 : 0 ] IN1, IN2 ; //没有“signed”关键字默认“unsigned”
output [ 8 : 0 ] OUT1;
reg [ 8 : 0 ] OUT1;
always@(IN1 or IN2) begin // 生成组合逻辑的always 块
OUT1 = IN1 + IN2 ;
end
endmodule
2.补码加法器
输入和输出数据都是2补码形式的有符号数。从逻辑门电路的角度观察,补码加法器和无符号加法器的电路逻辑是不同的,但可以通过使用”signed”关键字来描述加法器的输入数据格式为有符号数,则EDA工具检测到该信息后,会自动生成补码加法器的电路逻辑。
rtl图
- 代码片
module top_signed (
IN1 ,
IN2 ,
OUT2 ) ;
input signed [ 7 : 0 ] IN1, IN2 ;
output signed [ 8 : 0 ] OUT2;
reg signed [ 8 : 0 ] OUT2;
always@(IN1 or IN2) begin // 生成组合逻辑的always 块
OUT2 = IN1 + IN2 ;
end
endmodule
3.计数器:2补码数制,从-7到7
- 有符号数与2的补码
二进制数值 | 无符号整数 | 有符号原码 | 2补码 |
---|---|---|---|
0000 | 0 | 0 | 0 |
0001 | 1 | 1 | 1 |
0010 | 2 | 2 | 2 |
0011 | 3 | 3 | 3 |
0100 | 4 | 4 | 4 |
0101 | 5 | 5 | 5 |
0110 | 6 | 6 | 6 |
0111 | 7 | 7 | 7 |
1000 | 8 | -0 | -8 |
1001 | 9 | -1 | -7 |
1010 | 10 | -2 | -6 |
1011 | 11 | -3 | -5 |
1100 | 12 | -4 | -4 |
1101 | 13 | -5 | -3 |
1110 | 14 | -6 | -2 |
1111 | 15 | -7 | -1 |
- 思路:由上表可以看出,2补码对应的四位二进制数制,当 -7 ~ -6 对应的二进制最高位扩展为 0 , 0 ~ +7 对应的二进制最高位扩展为 1 ,如下表所示,可用一个增量为 1 的计数器获得该五位二进制数,结果取第四位即可。
2补码 | -7 | -6 | -5 | -4 | -3 | -2 | -1 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
二进制数值 | 1001 | 1010 | 1011 | 1100 | 1101 | 1110 | 1111 | 0000 | 0001 | 0010 | 0011 | 0100 | 0101 | 0110 | 0111 |
扩展最高位 | 01001 | 01010 | 01011 | 01100 | 01101 | 01110 | 01111 | 10000 | 10001 | 10010 | 10011 | 10100 | 10101 | 10110 | 10111 |
rtl图
signaltap图:OUT3 以 2 补码的格式显示
代码片