ET创芯网论坛(EETOP)

找回密码

  登录   注册  

电动/混动汽车、48V系统、汽车功能安全等技术资料合集
查看: 2040|回复: 1

[求助] 《自己动手写CPU》问题求职

[复制链接]
发表于 2017-8-5 10:46:14 | 显示全部楼层 |阅读模式

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

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

x
1、在(第7章 算术操作指令)的实现中对于有符号加法操作符,为什么测试程序 add 80000010 80000001会溢出呢,按照有符号加法,不应该是-16+(-1)等于-17吗?2、第165页,在计算有符号数的补码时,为什么是32位全部取反加一,补码的运算不应该是最高位表示符号,其余剩下的31位取反加一吗?
 楼主| 发表于 2017-8-6 21:14:35 | 显示全部楼层
仔细思考了两天,自己来回答:
发现书中的代码并没有错误。
书中的操作数都是默认是补码形式。
三句话完成加法与减法,有符号数和无符号数的操作,感觉很奇妙。
之所以很简洁,主要还是因为电脑中将数字(正数/负数)按照补码形式来存储的,加法与减法得到统一。
下面是我摘出来用来单独理解写出的程序:
module alu_comp(a,b,add_sel,signed_sel,c,overflow);
input [3:0] a,b;//两个输入数
input add_sel,signed_sel;//两位选择信号:加法/减法 有符号数/无符号数
output [3:0] c;//输出数,对于输出数,如果是负数,比如-3,它会显示1101(-3的补码),而不是1011
output overflow;//当为有符号数时,是否出现溢出
wire [3:0] b_mux;

assign b_mux=(!add_sel)?(~b)+1:b;
assign c=a+b_mux;
assign overflow=((a[3])&&(b[3])&&(!c[3])&&(signed_sel)) || ((!a[3])&&(!b[3])&&(c[3])&&(signed_sel));
endmodule
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

关于我们|联系我们|ET创芯网 ( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2019-8-19 12:40 , Processed in 0.058483 second(s), 10 queries , Gzip On, Redis On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表