Verilog浮点加法器设计
计算机组成原理的大作业,用Verilog HDL设计的一个带四舍五入功能的浮点加法器,使用比较容易入门的行为级建模。呈上以便后人。。。
拖到最后两天天才写,比较仓促,会有一些bug。
项目地址:https://github.com/Candyroot/Floating-Point-Addition
代码依照GNU GENERAL PUBLIC LICENSE发布。
一. 设计思路
使用Verilog HDL的行为级建模方式,根据浮点加法器组成的参考设计图来进行设计。符合IEEE754短实数浮点数格式标准。
程序共分为14个模块,模块名及各自的功能分别为:
- Mux_1:选通器1。根据Control信号选择,使其中较大的阶码输出。
- Mux_2:选通器2。根据Control信号选择,使阶码较小的数输出。
- Mux_3:选通器3。根据Control信号选择,使阶码较大的数输出。
- Small_Alu:阶码运算器。计算出两个浮点数阶码之差的绝对值。将结果送到Control。
- Shift_Right:右移模块。根据Control送来的移位位数,对阶码较小数的尾数向右移位。
- Big_Alu:浮点加法运算模块。将Shift_Right与Mux_3送来的数进行相加,最后保留两位以供四舍五入,并且增加符号位,溢出位。
- Mux_5:选通器5。根据Control信号,对Mux_1与Rounding信号进行选通。
- Mux_4:选通器4。根据Control信号,对Big_Alu结果与Rounding结果进行选通。
- Incre_Decre:阶码增减模块。根据Control信号,对阶码进行调整,以符合IEEE754标准。
- Shift_Left_Right:尾数移位模块。根据Control信号,对尾数进行移位调整,以符合IEEE754标准。
- Rounding:四舍五入模块。根据Control信号,对尾数进行四舍五入,并返回四舍五入结果以验证是否计算正确。最后对符号位、阶码、尾数进行组装,输出符合IEEE754标准的计算结果。
- Control:控制模块。对整个计算流程进行分析控制。给出选通器的使能信号,根据Small_Alu结果来判断左移右移并送出移位位数,根据Big_Alu结果来对阶码进行移位,根据四舍五入结果来进行阶码调整。
设计图:
二. 测试用例及仿真
1.两负数相加,带尾数右移,阶码增加。
X=32'b1001_1110_1100_0000_0000_0000_0001_1101
Y=32'b1001_1111_1111_1111_1111_1111_1111_0101
Result = 1010_0000_0001_0111_1111_1111_1111_1110
2. 两正数相加,由于阶码相差63,所以小数可以忽略,结果与输入大数相等。
x=32'b0001_0000_1010_0000_0010_0000_0001_1101
y=32'b0001_1111_1111_1111_1111_1111_1111_0101
Result=0001_1111_1111_1111_1111_1111_1111_0101
3. 一个正数,一个负数,尾数相减,符号位为负
x=32'b0001_1110_1010_0010_0010_1000_0001_1101
y=32'b1001_1111_1111_1111_1111_1111_1111_0101
Result=1001_1111_1101_0111_0111_0101_1110_1101
4. 一个负数,一个正数,尾数相减,符号位为正
x=32'b1001_1110_1110_0010_0010_1000_0001_1101;
y=32'b0001_1111_1111_1111_1111_1111_1111_0101;
Result=0001_1111_1100_0111_0111_0101_1110_1101;
5. 两个正数,带阶码增加,四舍五入
x=32'b0001_1110_1110_0010_0010_1000_0001_1111
y=32'b0001_1111_1111_1111_1111_1111_1111_0000
Result=0010_0000_0001_1100_0100_0100_1111_1100
6. 一正一负,尾数向左移位,指数减小。
x=32'b0001_1111_1111_1111_1111_1111_1111_1111
y=32'b1001_1111_1111_1111_1111_1111_1111_0000
Result=0001_0101_1111_0000_0000_0000_0000_0000
文章来源:UnixOSS.com
转载请保留出处。