【Verilog HDL 训练】第 12 天(数据通路)

举报
李锐博恩 发表于 2021/07/15 03:13:46 2021/07/15
【摘要】 数据通路。 y = func(a,b) func可以是加法,减法,乘法,比较,移位,舍入,饱和等。 分别针对有符号数,无符号数的情况。 提示:可以参考synopsys的一篇文档 https://t.zsxq.com/QF6QNju 加法: 对于无符号数而言: module arithmetic( input [3:0] a, input [3:0] b, ou...

数据通路。

y = func(a,b)

func可以是加法,减法,乘法,比较,移位,舍入,饱和等。

分别针对有符号数,无符号数的情况。

提示:可以参考synopsys的一篇文档 https://t.zsxq.com/QF6QNju


加法:

  • 对于无符号数而言:

  
  1. module arithmetic(
  2. input [3:0] a,
  3. input [3:0] b,
  4. output [4:0] res_sum, //加
  5. output [3:0] res_sub, //减
  6. output [7:0] res_pro, //乘
  7. //output [3:0] res_comp, //比较
  8. output [3:0] right_shift //右移
  9. );
  10. assign res_sum = a + b;
  11. assign res_sub = a - b;
  12. assign res_pro = a * b;
  13. //assign res_com =
  14. assign right_shift = a>>3; //逻辑右移
  15. wire [3:0] right_shift_a; //算术右移结果
  16. assign right_shift_a = a>>>3;
  17. endmodule

测试文件:


  
  1. module arithmetic_tb(
  2. );
  3. reg clk;
  4. reg [3:0] a;
  5. reg [3:0] b;
  6. wire [4:0] res_sum; //加
  7. wire [3:0] res_sub; //减
  8. wire [7:0] res_pro; //乘
  9. //wire [3:0] res_comp, //比较
  10. wire [3:0] right_shift; //右移
  11. initial begin
  12. clk = 0;
  13. forever
  14. # 2 clk = ~clk;
  15. end
  16. initial begin
  17. a = 4'b1011;
  18. b = 4'b1001;
  19. #10
  20. a = 4'b1001;
  21. b = 4'b0111;
  22. end
  23. arithmetic u0(
  24. .a(a),
  25. .b(b),
  26. .res_sum(res_sum),
  27. .res_sub(res_sub),
  28. .res_pro(res_pro),
  29. .right_shift(right_shift)
  30. );
  31. endmodule

行为仿真时序图:

对于无符号数,逻辑右移和算术右移是一样的,都是高位补零。

  • 对于有符号数而言:

  
  1. module arithmetic(
  2. input signed [3:0] a,
  3. input signed [3:0] b,
  4. output signed [4:0] res_sum, //加
  5. output signed [3:0] res_sub, //减
  6. output signed [7:0] res_pro, //乘
  7. output signed [3:0] right_shift //右移
  8. );
  9. assign res_sum = a + b;
  10. assign res_sub = a - b;
  11. assign res_pro = a * b;
  12. //assign res_com =
  13. assign right_shift = a>>3; //逻辑右移
  14. wire [3:0] right_shift_a; //算术右移结果
  15. assign right_shift_a = a>>>3;
  16. endmodule

测试文件同上!

仿真波形:

可以看出,对于有符号数,逻辑右移和算术右移结果不一样,逻辑右移依然是补零,算术右移则补符号位。

但对于有符号数的加法规则如何?

例如上述仿真:1001 + 0111 为什么等于 00000?

也就是-1 + 7 = 0?

得到了答案:

1001是补码的形式,原码是1111,也就是-7,这样的话就是-7+7=0,也符合道理了。

 

 

文章来源: reborn.blog.csdn.net,作者:李锐博恩,版权归原作者所有,如需转载,请联系作者。

原文链接:reborn.blog.csdn.net/article/details/90246023

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。