在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 9568|回复: 3

[原创] [求助求助]新手刚学Verilog,希望哪位大神帮忙写下这个verilog代码

[复制链接]
发表于 2013-10-20 19:52:56 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
设计一个32位浮点加法器; 写了好久实在不会写
发表于 2013-10-21 16:15:58 | 显示全部楼层
本帖最后由 浩然若枫 于 2013-10-21 16:20 编辑

回复 1# joebaibai

这个是通过仿真的,你可以参考一下。你先要搞明白浮点数据的结构是什么样的,哪些位都分别代表什么,在去做加法器,就比较简单了!附件不支持.v文件???  直接写吧




  1. `timescale 1ns / 100ps

  2. module fpu_add( clk, rst, enable, opa, opb, sign, sum_2, exponent_2);
  3. input                clk;
  4. input                rst;
  5. input                enable;
  6. input        [63:0]        opa, opb;
  7. output                sign;
  8. output  [55:0]        sum_2;
  9. output        [10:0]        exponent_2;

  10. reg   sign;
  11. reg   [10:0] exponent_a;
  12. reg   [10:0] exponent_b;
  13. reg   [51:0] mantissa_a;
  14. reg   [51:0] mantissa_b;
  15. reg   expa_gt_expb;
  16. reg   [10:0] exponent_small;
  17. reg   [10:0] exponent_large;
  18. reg   [51:0] mantissa_small;
  19. reg   [51:0] mantissa_large;
  20. reg   small_is_denorm;
  21. reg   large_is_denorm;
  22. reg   large_norm_small_denorm;
  23. reg   [10:0] exponent_diff;
  24. reg   [55:0] large_add;
  25. reg   [55:0] small_add;
  26. reg   [55:0] small_shift;
  27. wire   small_shift_nonzero = |small_shift[55:0];
  28. wire        small_is_nonzero = (exponent_small > 0) | |mantissa_small[51:0];
  29. wire   small_fraction_enable = small_is_nonzero & !small_shift_nonzero;
  30. wire   [55:0] small_shift_2 = { 55'b0, 1'b1 };
  31. reg   [55:0] small_shift_3;
  32. reg   [55:0] sum;
  33. wire   sum_overflow = sum[55]; // sum[55] will be 0 if there was no carry from adding the 2 numbers
  34. reg   [55:0] sum_2;
  35. reg   [10:0] exponent;
  36. wire   sum_leading_one = sum_2[54]; // this is where the leading one resides, unless denorm
  37. reg   denorm_to_norm;
  38. reg   [10:0] exponent_2;

  39. always @(posedge clk)
  40.         begin
  41.                 if (rst) begin
  42.                         sign <= 0;
  43.                         exponent_a <= 0;
  44.                         exponent_b <= 0;
  45.                         mantissa_a <= 0;
  46.                         mantissa_b <= 0;
  47.                         expa_gt_expb <= 0;
  48.                         exponent_small  <= 0;
  49.                         exponent_large  <= 0;
  50.                         mantissa_small  <= 0;
  51.                         mantissa_large  <= 0;
  52.                         small_is_denorm <= 0;
  53.                         large_is_denorm <= 0;
  54.                         large_norm_small_denorm <= 0;
  55.                         exponent_diff <= 0;
  56.                         large_add <= 0;
  57.                         small_add <= 0;
  58.                         small_shift <= 0;
  59.                         small_shift_3 <= 0;
  60.                         sum <= 0;
  61.                         sum_2 <= 0;
  62.                         exponent <= 0;
  63.                         denorm_to_norm <= 0;
  64.                         exponent_2 <= 0;
  65.                 end
  66.                 else if (enable) begin
  67.                         sign <= opa[63];
  68.                         exponent_a <= opa[62:52];
  69.                         exponent_b <= opb[62:52];
  70.                         mantissa_a <= opa[51:0];
  71.                         mantissa_b <= opb[51:0];
  72.                         expa_gt_expb <= exponent_a > exponent_b;
  73.                         exponent_small  <= expa_gt_expb ? exponent_b : exponent_a;
  74.                         exponent_large  <= expa_gt_expb ? exponent_a : exponent_b;
  75.                         mantissa_small  <= expa_gt_expb ? mantissa_b : mantissa_a;
  76.                         mantissa_large  <= expa_gt_expb ? mantissa_a : mantissa_b;
  77.                         small_is_denorm <= !(exponent_small > 0);
  78.                         large_is_denorm <= !(exponent_large > 0);
  79.                         large_norm_small_denorm <= (small_is_denorm && !large_is_denorm);
  80.                         exponent_diff <= exponent_large - exponent_small - large_norm_small_denorm;
  81.                         large_add <= { 1'b0, !large_is_denorm, mantissa_large, 2'b0 };
  82.                         small_add <= { 1'b0, !small_is_denorm, mantissa_small, 2'b0 };
  83.                         small_shift <= small_add >> exponent_diff;
  84.                         small_shift_3 <= small_fraction_enable ? small_shift_2 : small_shift;
  85.                         sum <= large_add + small_shift_3;
  86.                         sum_2 <= sum_overflow ? sum >> 1 : sum;
  87.                         exponent <= sum_overflow ? exponent_large + 1: exponent_large;
  88.                         denorm_to_norm <= sum_leading_one & large_is_denorm;
  89.                         exponent_2 <= denorm_to_norm ? exponent + 1 : exponent;
  90.                 end
  91.         end

  92. endmodule



复制代码
 楼主| 发表于 2013-10-22 13:49:06 | 显示全部楼层
回复 2# 浩然若枫


    谢谢建议。thks
发表于 2013-10-23 08:48:59 | 显示全部楼层
挺有意思的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /2 下一条


小黑屋| 手机版| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-11-23 03:49 , Processed in 0.019084 second(s), 8 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表